diff --git a/composer.json b/composer.json index 893ff49bec..2b1f301c7e 100644 --- a/composer.json +++ b/composer.json @@ -29,6 +29,7 @@ "openid/php-openid": "^2.3", "paragonie/constant_time_encoding": "^1.0.4", "pear/console_getopt": "^1.4", + "php-ffmpeg/php-ffmpeg": "^0.16", "phpseclib/phpseclib": "dev-master#f815e43077da67d3dd5b4d18a45753f5b79c1ab9", "predis/predis": "^1.1", "stomp-php/stomp-php": "^4.5.1" diff --git a/composer.lock b/composer.lock index 7d497454dd..3936d3cd5a 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,70 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "9ada0acf1c46320bb59933b35031a551", + "content-hash": "4e2a2a7254378e2dc8be73be627b766b", "packages": [ + { + "name": "alchemy/binary-driver", + "version": "v5.2.0", + "source": { + "type": "git", + "url": "https://github.com/alchemy-fr/BinaryDriver.git", + "reference": "e0615cdff315e6b4b05ada67906df6262a020d22" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/alchemy-fr/BinaryDriver/zipball/e0615cdff315e6b4b05ada67906df6262a020d22", + "reference": "e0615cdff315e6b4b05ada67906df6262a020d22", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0|^2.0|^1.0", + "php": ">=5.5", + "psr/log": "^1.0", + "symfony/process": "^2.3|^3.0|^4.0|^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0|^5.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "Alchemy": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Le Goff", + "email": "legoff.n@gmail.com" + }, + { + "name": "Romain Neutron", + "email": "imprec@gmail.com", + "homepage": "http://www.lickmychip.com/" + }, + { + "name": "Phraseanet Team", + "email": "info@alchemy.fr", + "homepage": "http://www.phraseanet.com/" + }, + { + "name": "Jens Hausdorf", + "email": "mail@jens-hausdorf.de", + "homepage": "https://jens-hausdorf.de", + "role": "Maintainer" + } + ], + "description": "A set of tools to build binary drivers", + "keywords": [ + "binary", + "driver" + ], + "time": "2020-02-12T19:35:11+00:00" + }, { "name": "apereo/phpcas", "version": "1.3.8", @@ -202,6 +264,102 @@ ], "time": "2019-11-03T00:18:51+00:00" }, + { + "name": "doctrine/cache", + "version": "1.10.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "13e3381b25847283a91948d04640543941309727" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/13e3381b25847283a91948d04640543941309727", + "reference": "13e3381b25847283a91948d04640543941309727", + "shasum": "" + }, + "require": { + "php": "~7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "alcaeus/mongo-php-adapter": "^1.1", + "doctrine/coding-standard": "^6.0", + "mongodb/mongodb": "^1.1", + "phpunit/phpunit": "^7.0", + "predis/predis": "~1.0" + }, + "suggest": { + "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", + "homepage": "https://www.doctrine-project.org/projects/cache.html", + "keywords": [ + "abstraction", + "apcu", + "cache", + "caching", + "couchdb", + "memcached", + "php", + "redis", + "xcache" + ], + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", + "type": "tidelift" + } + ], + "time": "2020-07-07T18:54:01+00:00" + }, { "name": "embed/embed", "version": "v3.4.8", @@ -256,6 +414,49 @@ ], "time": "2020-07-03T15:04:01+00:00" }, + { + "name": "evenement/evenement", + "version": "v3.0.1", + "source": { + "type": "git", + "url": "https://github.com/igorw/evenement.git", + "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/igorw/evenement/zipball/531bfb9d15f8aa57454f5f0285b18bec903b8fb7", + "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7", + "shasum": "" + }, + "require": { + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "Evenement": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + } + ], + "description": "Événement is a very simple event dispatching library for PHP", + "keywords": [ + "event-dispatcher", + "event-emitter" + ], + "time": "2017-07-23T21:35:13+00:00" + }, { "name": "ezyang/htmlpurifier", "version": "v4.13.0", @@ -792,6 +993,46 @@ ], "time": "2019-12-02T02:32:27+00:00" }, + { + "name": "neutron/temporary-filesystem", + "version": "2.4", + "source": { + "type": "git", + "url": "https://github.com/romainneutron/Temporary-Filesystem.git", + "reference": "3c55497da8d7762fb4dcabc91d54a5de510e3c99" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/romainneutron/Temporary-Filesystem/zipball/3c55497da8d7762fb4dcabc91d54a5de510e3c99", + "reference": "3c55497da8d7762fb4dcabc91d54a5de510e3c99", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0", + "symfony/filesystem": "^2.3 || ^3.0 || ^4.0 || ^5.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^5.0.4" + }, + "type": "library", + "autoload": { + "psr-0": { + "Neutron": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Romain Neutron", + "email": "imprec@gmail.com" + } + ], + "description": "Symfony filesystem extension to handle temporary files", + "time": "2020-02-17T15:27:36+00:00" + }, { "name": "openid/php-openid", "version": "2.3.0", @@ -1000,6 +1241,90 @@ "description": "More info available on: http://pear.php.net/package/Console_Getopt", "time": "2019-11-20T18:27:48+00:00" }, + { + "name": "php-ffmpeg/php-ffmpeg", + "version": "v0.16", + "source": { + "type": "git", + "url": "https://github.com/PHP-FFMpeg/PHP-FFMpeg.git", + "reference": "4175c02b7d9f7e1a02cec2ba73474266ba2c5fa1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-FFMpeg/PHP-FFMpeg/zipball/4175c02b7d9f7e1a02cec2ba73474266ba2c5fa1", + "reference": "4175c02b7d9f7e1a02cec2ba73474266ba2c5fa1", + "shasum": "" + }, + "require": { + "alchemy/binary-driver": "^1.5 || ~2.0.0 || ^5.0", + "doctrine/cache": "^1.0", + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "neutron/temporary-filesystem": "^2.1.1", + "php": "^5.3.9 || ^7.0" + }, + "require-dev": { + "sami/sami": "~1.0", + "silex/silex": "~1.0", + "symfony/phpunit-bridge": "^5.0.4" + }, + "suggest": { + "php-ffmpeg/extras": "A compilation of common audio & video drivers for PHP-FFMpeg" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.7-dev" + } + }, + "autoload": { + "psr-0": { + "FFMpeg": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Romain Neutron", + "email": "imprec@gmail.com", + "homepage": "http://www.lickmychip.com/" + }, + { + "name": "Phraseanet Team", + "email": "info@alchemy.fr", + "homepage": "http://www.phraseanet.com/" + }, + { + "name": "Patrik Karisch", + "email": "patrik@karisch.guru", + "homepage": "http://www.karisch.guru" + }, + { + "name": "Romain Biard", + "email": "romain.biard@gmail.com", + "homepage": "https://www.strime.io/" + }, + { + "name": "Jens Hausdorf", + "email": "hello@jens-hausdorf.de", + "homepage": "https://jens-hausdorf.de" + } + ], + "description": "FFMpeg PHP, an Object Oriented library to communicate with AVconv / ffmpeg", + "keywords": [ + "audio", + "audio processing", + "avconv", + "avprobe", + "ffmpeg", + "ffprobe", + "video", + "video processing" + ], + "time": "2020-03-29T09:57:10+00:00" + }, { "name": "phpseclib/phpseclib", "version": "dev-master", @@ -1194,6 +1519,53 @@ ], "time": "2016-08-06T14:39:51+00:00" }, + { + "name": "psr/log", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2020-03-23T09:12:05+00:00" + }, { "name": "ralouphie/getallheaders", "version": "3.0.3", @@ -1302,6 +1674,104 @@ } ], "time": "2020-06-15T18:01:49+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v3.0.9", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "b2da5009d9bacbd91d83486aa1f44c793a8c380d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/b2da5009d9bacbd91d83486aa1f44c793a8c380d", + "reference": "b2da5009d9bacbd91d83486aa1f44c793a8c380d", + "shasum": "" + }, + "require": { + "php": ">=5.5.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Filesystem Component", + "homepage": "https://symfony.com", + "time": "2016-07-20T05:43:46+00:00" + }, + { + "name": "symfony/process", + "version": "v2.8.52", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "c3591a09c78639822b0b290d44edb69bf9f05dc8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/c3591a09c78639822b0b290d44edb69bf9f05dc8", + "reference": "c3591a09c78639822b0b290d44edb69bf9f05dc8", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "https://symfony.com", + "time": "2018-11-11T11:18:13+00:00" } ], "packages-dev": [ @@ -3356,53 +3826,6 @@ ], "time": "2017-02-14T16:28:37+00:00" }, - { - "name": "psr/log", - "version": "1.1.3", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "time": "2020-03-23T09:12:05+00:00" - }, { "name": "psr/simple-cache", "version": "1.0.1", @@ -4375,55 +4798,6 @@ "homepage": "https://symfony.com", "time": "2018-11-21T14:20:20+00:00" }, - { - "name": "symfony/filesystem", - "version": "v3.0.9", - "source": { - "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "b2da5009d9bacbd91d83486aa1f44c793a8c380d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/b2da5009d9bacbd91d83486aa1f44c793a8c380d", - "reference": "b2da5009d9bacbd91d83486aa1f44c793a8c380d", - "shasum": "" - }, - "require": { - "php": ">=5.5.9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Filesystem\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Filesystem Component", - "homepage": "https://symfony.com", - "time": "2016-07-20T05:43:46+00:00" - }, { "name": "symfony/finder", "version": "v2.8.52", @@ -4699,55 +5073,6 @@ ], "time": "2020-07-14T12:35:20+00:00" }, - { - "name": "symfony/process", - "version": "v2.8.52", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "c3591a09c78639822b0b290d44edb69bf9f05dc8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/c3591a09c78639822b0b290d44edb69bf9f05dc8", - "reference": "c3591a09c78639822b0b290d44edb69bf9f05dc8", - "shasum": "" - }, - "require": { - "php": ">=5.3.9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.8-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Process Component", - "homepage": "https://symfony.com", - "time": "2018-11-11T11:18:13+00:00" - }, { "name": "symfony/stopwatch", "version": "v2.8.52", diff --git a/vendor/alchemy/binary-driver/.gitignore b/vendor/alchemy/binary-driver/.gitignore new file mode 100644 index 0000000000..3a9875b460 --- /dev/null +++ b/vendor/alchemy/binary-driver/.gitignore @@ -0,0 +1,2 @@ +/vendor/ +composer.lock diff --git a/vendor/alchemy/binary-driver/.travis.yml b/vendor/alchemy/binary-driver/.travis.yml new file mode 100644 index 0000000000..b95ee4f18e --- /dev/null +++ b/vendor/alchemy/binary-driver/.travis.yml @@ -0,0 +1,26 @@ +language: php +dist: trusty + +sudo: false + +php: + - 7.0 + - 7.1 + - 7.2 + - 7.3 + +matrix: + include: + - php: 7.0 + env: COMPOSER_REQUIRE="symfony/process:^2.0" + - php: 7.0 + env: COMPOSER_REQUIRE="symfony/process:^3.0" + - php: 7.2 + env: COMPOSER_REQUIRE="symfony/process:^5.0" + - php: 7.3 + env: COMPOSER_REQUIRE="symfony/process:^5.0" + +before_script: + - composer self-update + - if [ -n "$COMPOSER_REQUIRE" ]; then composer require --no-update $COMPOSER_REQUIRE; fi + - composer update $COMPOSER_OPTIONS diff --git a/vendor/alchemy/binary-driver/CHANGELOG.md b/vendor/alchemy/binary-driver/CHANGELOG.md new file mode 100644 index 0000000000..f892249ec0 --- /dev/null +++ b/vendor/alchemy/binary-driver/CHANGELOG.md @@ -0,0 +1,64 @@ +CHANGELOG +--------- +* 1.6.0 (2015-03-02) + * BC Break: bump minimum PHP versions + * Allow use of evenement v2.0 (thanks @patkar for the P/R) + +* 1.5.0 (2013-06-21) + + * BC Break : ConfigurationInterface::get does not throw exceptions anymore + in case the key does not exist. Second argument is a default value to return + in case the key does not exist. + +* 1.4.1 (2013-05-23) + + * Add third parameter to BinaryInterface::command method to pass a listener or + an array of listener that will be registered just the time of the command. + +* 1.4.0 (2013-05-11) + + * Extract process run management to ProcessRunner. + * Add support for process listeners. + * Provides bundled DebugListener. + * Add BinaryInterface::command method. + * BC break : ProcessRunnerInterface::run now takes an SplObjectStorage containing + listeners as second argument. + * BC break : BinaryInterface no longer implements LoggerAwareInterface + as it is now supported by ProcessRunner. + +* 1.3.4 (2013-04-26) + + * Add BinaryDriver::run method. + +* 1.3.3 (2013-04-26) + + * Add BinaryDriver::createProcessMock method. + +* 1.3.2 (2013-04-26) + + * Add BinaryDriverTestCase for testing BinaryDriver implementations. + +* 1.3.1 (2013-04-24) + + * Add timeouts handling + +* 1.3.0 (2013-04-24) + + * Add BinaryInterface and AbstractBinary + +* 1.2.1 (2013-04-24) + + * Add ConfigurationAwareInterface + * Add ProcessBuilderAwareInterface + +* 1.2.0 (2013-04-24) + + * Add BinaryDriver\Configuration + +* 1.1.0 (2013-04-24) + + * Add support for timeouts via `setTimeout` method + +* 1.0.0 (2013-04-23) + + * First stable version. diff --git a/vendor/alchemy/binary-driver/LICENSE b/vendor/alchemy/binary-driver/LICENSE new file mode 100644 index 0000000000..e7bb314c25 --- /dev/null +++ b/vendor/alchemy/binary-driver/LICENSE @@ -0,0 +1,21 @@ +BinaryDriver is released with MIT License : + +Copyright (c) 2013 Alchemy + +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/alchemy/binary-driver/README.md b/vendor/alchemy/binary-driver/README.md new file mode 100644 index 0000000000..05b3a137f0 --- /dev/null +++ b/vendor/alchemy/binary-driver/README.md @@ -0,0 +1,190 @@ +# Binary Driver + +Binary-Driver is a set of PHP tools to build binary drivers. + +[![Build Status](https://travis-ci.org/alchemy-fr/BinaryDriver.png?branch=master)](https://travis-ci.org/alchemy-fr/BinaryDriver) + +## Why ? + +You may wonder *Why building a library while I can use `exec` or +[symfony/process](https://github.com/symfony/Process) ?*. + +Here is a simple answer : + + - If you use `exec`, `passthru`, `system`, `proc_open` or any low level process + handling in PHP, you should have a look to [symfony/process](https://github.com/symfony/Process) + component that will provide an OO portable, testable and secure interface to + deal with this. It seems easy at first approach, but if you look at this + component [unit tests](https://github.com/symfony/Process/tree/master/Tests), + you will see that handling process in a simple interface can easily become a + nightmare. + + - If you already use symfony/process, and want to build binary drivers, you + will always have the same common set of methods and objects to configure, log, + debug, and generate processes. + This library is a base to implement any binary driver with this common set of + needs. + +## AbstractBinary + +`AbstractBinary` provides an abstract class to build a binary driver. It implements +`BinaryInterface`. + +Implementation example : + +```php +use Alchemy\BinaryDriver\AbstractBinary; + +class LsDriver extends AbstractBinary +{ + public function getName() + { + return 'ls driver'; + } +} + +$parser = new LsParser(); + +$driver = Driver::load('ls'); +// will return the output of `ls -a -l` +$parser->parse($driver->command(array('-a', '-l'))); +``` + +### Binary detection troubleshooting + +If you are using Nginx with PHP-fpm, executable detection may not work because of an empty `$_ENV['path']`. +To avoid having an empty `PATH` environment variable, add the following line to your `fastcgi_params` +config file (replace `/your/current/path/` with the output of `printenv PATH`) : + +``` +fastcgi_param PATH /your/current/path +``` + +## Logging + +You can log events with a `Psr\Log\LoggerInterface` by passing it in the load +method as second argument : + +```php +$logger = new Monolog\Logger('driver'); +$driver = Driver::load('ls', $logger); +``` + +## Listeners + +You can add custom listeners on processes. +Listeners are built on top of [Evenement](https://github.com/igorw/evenement) +and must implement `Alchemy\BinaryDriver\ListenerInterface`. + +```php +use Symfony\Component\Process\Process; + +class DebugListener extends EventEmitter implements ListenerInterface +{ + public function handle($type, $data) + { + foreach (explode(PHP_EOL, $data) as $line) { + $this->emit($type === Process::ERR ? 'error' : 'out', array($line)); + } + } + + public function forwardedEvents() + { + // forward 'error' events to the BinaryInterface + return array('error'); + } +} + +$listener = new DebugListener(); + +$driver = CustomImplementation::load('php'); + +// adds listener +$driver->listen($listener); + +$driver->on('error', function ($line) { + echo '[ERROR] ' . $line . PHP_EOL; +}); + +// removes listener +$driver->unlisten($listener); +``` + +### Bundled listeners + +The debug listener is a simple listener to catch `stderr` and `stdout` outputs ; +read the implementation for customization. + +```php +use Alchemy\BinaryDriver\Listeners\DebugListener; + +$driver = CustomImplementation::load('php'); +$driver->listen(new DebugListener()); + +$driver->on('debug', function ($line) { + echo $line; +}); +``` + +## ProcessBuilderFactory + +ProcessBuilderFactory ease spawning processes by generating Symfony [Process] +(http://symfony.com/doc/master/components/process.html) objects. + +```php +use Alchemy\BinaryDriver\ProcessBuilderFactory; + +$factory = new ProcessBuilderFactory('/usr/bin/php'); + +// return a Symfony\Component\Process\Process +$process = $factory->create('-v'); + +// echoes '/usr/bin/php' '-v' +echo $process->getCommandLine(); + +$process = $factory->create(array('-r', 'echo "Hello !";')); + +// echoes '/usr/bin/php' '-r' 'echo "Hello !";' +echo $process->getCommandLine(); +``` + +## Configuration + +A simple configuration object, providing an `ArrayAccess` and `IteratorAggregate` +interface. + +```php +use Alchemy\BinaryDriver\Configuration; + +$conf = new Configuration(array('timeout' => 0)); + +echo $conf->get('timeout'); + +if ($conf->has('param')) { + $conf->remove('param'); +} + +$conf->set('timeout', 20); + +$conf->all(); +``` + +Same example using the `ArrayAccess` interface : + +```php +use Alchemy\BinaryDriver\Configuration; + +$conf = new Configuration(array('timeout' => 0)); + +echo $conf['timeout']; + +if (isset($conf['param'])) { + unset($conf['param']); +} + +$conf['timeout'] = 20; +``` + +## License + +This project is released under the MIT license. diff --git a/vendor/alchemy/binary-driver/composer.json b/vendor/alchemy/binary-driver/composer.json new file mode 100644 index 0000000000..a91d6c1a90 --- /dev/null +++ b/vendor/alchemy/binary-driver/composer.json @@ -0,0 +1,43 @@ +{ + "name": "alchemy/binary-driver", + "type": "library", + "description": "A set of tools to build binary drivers", + "keywords": ["binary", "driver"], + "license": "MIT", + "authors": [ + { + "name": "Nicolas Le Goff", + "email": "legoff.n@gmail.com" + }, + { + "name": "Romain Neutron", + "email": "imprec@gmail.com", + "homepage": "http://www.lickmychip.com/" + }, + { + "name": "Phraseanet Team", + "email": "info@alchemy.fr", + "homepage": "http://www.phraseanet.com/" + }, + { + "name": "Jens Hausdorf", + "email": "mail@jens-hausdorf.de", + "homepage": "https://jens-hausdorf.de", + "role": "Maintainer" + } + ], + "require": { + "php" : ">=5.5", + "evenement/evenement" : "^3.0|^2.0|^1.0", + "psr/log" : "^1.0", + "symfony/process" : "^2.3|^3.0|^4.0|^5.0" + }, + "require-dev": { + "phpunit/phpunit" : "^4.0|^5.0" + }, + "autoload": { + "psr-0": { + "Alchemy": "src" + } + } +} diff --git a/vendor/alchemy/binary-driver/phpunit.xml.dist b/vendor/alchemy/binary-driver/phpunit.xml.dist new file mode 100644 index 0000000000..0c043a9100 --- /dev/null +++ b/vendor/alchemy/binary-driver/phpunit.xml.dist @@ -0,0 +1,31 @@ + + + + + + + + + tests + + + + + vendor + tests + + + + + diff --git a/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/AbstractBinary.php b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/AbstractBinary.php new file mode 100644 index 0000000000..b5809f0419 --- /dev/null +++ b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/AbstractBinary.php @@ -0,0 +1,218 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Alchemy\BinaryDriver; + +use Alchemy\BinaryDriver\Exception\ExecutableNotFoundException; +use Alchemy\BinaryDriver\Exception\ExecutionFailureException; +use Alchemy\BinaryDriver\Listeners\Listeners; +use Alchemy\BinaryDriver\Listeners\ListenerInterface; +use Evenement\EventEmitter; +use Psr\Log\LoggerInterface; +use Psr\Log\NullLogger; +use Symfony\Component\Process\ExecutableFinder; +use Symfony\Component\Process\Process; + +abstract class AbstractBinary extends EventEmitter implements BinaryInterface +{ + /** @var ConfigurationInterface */ + protected $configuration; + + /** @var ProcessBuilderFactoryInterface */ + protected $factory; + + /** @var ProcessRunner */ + private $processRunner; + + /** @var Listeners */ + private $listenersManager; + + public function __construct(ProcessBuilderFactoryInterface $factory, LoggerInterface $logger, ConfigurationInterface $configuration) + { + $this->factory = $factory; + $this->configuration = $configuration; + $this->processRunner = new ProcessRunner($logger, $this->getName()); + $this->listenersManager = new Listeners(); + $this->applyProcessConfiguration(); + } + + /** + * {@inheritdoc} + */ + public function listen(ListenerInterface $listener) + { + $this->listenersManager->register($listener, $this); + + return $this; + } + + /** + * {@inheritdoc} + */ + public function unlisten(ListenerInterface $listener) + { + $this->listenersManager->unregister($listener, $this); + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getConfiguration() + { + return $this->configuration; + } + + /** + * {@inheritdoc} + * + * @return BinaryInterface + */ + public function setConfiguration(ConfigurationInterface $configuration) + { + $this->configuration = $configuration; + $this->applyProcessConfiguration(); + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getProcessBuilderFactory() + { + return $this->factory; + } + + /** + * {@inheritdoc} + * + * @return BinaryInterface + */ + public function setProcessBuilderFactory(ProcessBuilderFactoryInterface $factory) + { + $this->factory = $factory; + $this->applyProcessConfiguration(); + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getProcessRunner() + { + return $this->processRunner; + } + + /** + * {@inheritdoc} + */ + public function setProcessRunner(ProcessRunnerInterface $runner) + { + $this->processRunner = $runner; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function command($command, $bypassErrors = false, $listeners = null) + { + if (!is_array($command)) { + $command = array($command); + } + + return $this->run($this->factory->create($command), $bypassErrors, $listeners); + } + + /** + * {@inheritdoc} + */ + public static function load($binaries, LoggerInterface $logger = null, $configuration = array()) + { + $finder = new ExecutableFinder(); + $binary = null; + $binaries = is_array($binaries) ? $binaries : array($binaries); + + foreach ($binaries as $candidate) { + if (file_exists($candidate) && is_executable($candidate)) { + $binary = $candidate; + break; + } + if (null !== $binary = $finder->find($candidate)) { + break; + } + } + + if (null === $binary) { + throw new ExecutableNotFoundException(sprintf( + 'Executable not found, proposed : %s', implode(', ', $binaries) + )); + } + + if (null === $logger) { + $logger = new NullLogger(); + } + + $configuration = $configuration instanceof ConfigurationInterface ? $configuration : new Configuration($configuration); + + return new static(new ProcessBuilderFactory($binary), $logger, $configuration); + } + + /** + * Returns the name of the driver + * + * @return string + */ + abstract public function getName(); + + /** + * Executes a process, logs events + * + * @param Process $process + * @param Boolean $bypassErrors Set to true to disable throwing ExecutionFailureExceptions + * @param ListenerInterface|array $listeners A listener or an array of listener to register for this unique run + * + * @return string The Process output + * + * @throws ExecutionFailureException in case of process failure. + */ + protected function run(Process $process, $bypassErrors = false, $listeners = null) + { + if (null !== $listeners) { + if (!is_array($listeners)) { + $listeners = array($listeners); + } + + $listenersManager = clone $this->listenersManager; + + foreach ($listeners as $listener) { + $listenersManager->register($listener, $this); + } + } else { + $listenersManager = $this->listenersManager; + } + + return $this->processRunner->run($process, $listenersManager->storage, $bypassErrors); + } + + private function applyProcessConfiguration() + { + if ($this->configuration->has('timeout')) { + $this->factory->setTimeout($this->configuration->get('timeout')); + } + + return $this; + } +} diff --git a/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/BinaryDriverTestCase.php b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/BinaryDriverTestCase.php new file mode 100644 index 0000000000..3d0463dc04 --- /dev/null +++ b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/BinaryDriverTestCase.php @@ -0,0 +1,76 @@ +getMock('Alchemy\BinaryDriver\ProcessBuilderFactoryInterface'); + } + + /** + * @param integer $runs The number of runs expected + * @param Boolean $success True if the process expects to be successfull + * @param string $commandLine The commandline executed + * @param string $output The process output + * @param string $error The process error output + * + * @return Process + */ + public function createProcessMock($runs = 1, $success = true, $commandLine = null, $output = null, $error = null, $callback = false) + { + $process = $this->getMockBuilder('Symfony\Component\Process\Process') + ->disableOriginalConstructor() + ->getMock(); + + $builder = $process->expects($this->exactly($runs)) + ->method('run'); + + if (true === $callback) { + $builder->with($this->isInstanceOf('Closure')); + } + + $process->expects($this->any()) + ->method('isSuccessful') + ->will($this->returnValue($success)); + + foreach (array( + 'getOutput' => $output, + 'getErrorOutput' => $error, + 'getCommandLine' => $commandLine, + ) as $command => $value) { + $process + ->expects($this->any()) + ->method($command) + ->will($this->returnValue($value)); + } + + return $process; + } + + /** + * @return LoggerInterface + */ + public function createLoggerMock() + { + return $this->getMock('Psr\Log\LoggerInterface'); + } + + /** + * @return ConfigurationInterface + */ + public function createConfigurationMock() + { + return $this->getMock('Alchemy\BinaryDriver\ConfigurationInterface'); + } +} diff --git a/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/BinaryInterface.php b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/BinaryInterface.php new file mode 100644 index 0000000000..0dfd6e0e3a --- /dev/null +++ b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/BinaryInterface.php @@ -0,0 +1,67 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Alchemy\BinaryDriver; + +use Alchemy\BinaryDriver\Exception\ExecutableNotFoundException; +use Alchemy\BinaryDriver\Exception\ExecutionFailureException; +use Alchemy\BinaryDriver\Listeners\ListenerInterface; +use Psr\Log\LoggerInterface; +use Evenement\EventEmitterInterface; + +interface BinaryInterface extends ConfigurationAwareInterface, ProcessBuilderFactoryAwareInterface, ProcessRunnerAwareInterface, EventEmitterInterface +{ + /** + * Adds a listener to the binary driver + * + * @param ListenerInterface $listener + * + * @return BinaryInterface + */ + public function listen(ListenerInterface $listener); + + /** + * Removes a listener from the binary driver + * + * @param ListenerInterface $listener + * + * @return BinaryInterface + */ + public function unlisten(ListenerInterface $listener); + + /** + * Runs a command against the driver. + * + * Calling this method on a `ls` driver with the command `-a` would run `ls -a`. + * + * @param array|string $command A command or an array of command + * @param Boolean $bypassErrors If set to true, an erronous process will not throw an exception + * @param ListenerInterface|array $listeners A listener or an array of listeners to register for this unique run + * + * @return string The command output + * + * @throws ExecutionFailureException in case of process failure. + */ + public function command($command, $bypassErrors = false, $listeners = null); + + /** + * Loads a binary + * + * @param string|array $binaries A binary name or an array of binary names + * @param null|LoggerInterface $logger A Logger + * @param array|ConfigurationInterface $configuration The configuration + * + * @throws ExecutableNotFoundException In case none of the binaries were found + * + * @return BinaryInterface + */ + public static function load($binaries, LoggerInterface $logger = null, $configuration = array()); +} diff --git a/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/Configuration.php b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/Configuration.php new file mode 100644 index 0000000000..cd0ebbb482 --- /dev/null +++ b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/Configuration.php @@ -0,0 +1,107 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Alchemy\BinaryDriver; + +class Configuration implements ConfigurationInterface +{ + private $data; + + public function __construct(array $data = array()) + { + $this->data = $data; + } + + /** + * {@inheritdoc} + */ + public function getIterator() + { + return new \ArrayIterator($this->data); + } + + /** + * {@inheritdoc} + */ + public function get($key, $default = null) + { + return isset($this->data[$key]) ? $this->data[$key] : $default; + } + + /** + * {@inheritdoc} + */ + public function set($key, $value) + { + $this->data[$key] = $value; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function has($key) + { + return array_key_exists($key, $this->data); + } + + /** + * {@inheritdoc} + */ + public function remove($key) + { + $value = $this->get($key); + unset($this->data[$key]); + + return $value; + } + + /** + * {@inheritdoc} + */ + public function all() + { + return $this->data; + } + + /** + * {@inheritdoc} + */ + public function offsetExists($offset) + { + return $this->has($offset); + } + + /** + * {@inheritdoc} + */ + public function offsetGet($offset) + { + return $this->get($offset); + } + + /** + * {@inheritdoc} + */ + public function offsetSet($offset, $value) + { + $this->set($offset, $value); + } + + /** + * {@inheritdoc} + */ + public function offsetUnset($offset) + { + $this->remove($offset); + } +} diff --git a/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/ConfigurationAwareInterface.php b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/ConfigurationAwareInterface.php new file mode 100644 index 0000000000..3b14f9e356 --- /dev/null +++ b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/ConfigurationAwareInterface.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Alchemy\BinaryDriver; + +interface ConfigurationAwareInterface +{ + /** + * Returns the configuration + * + * @return ConfigurationInterface + */ + public function getConfiguration(); + + /** + * Set the configuration + * + * @param ConfigurationInterface $configuration + */ + public function setConfiguration(ConfigurationInterface $configuration); +} diff --git a/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/ConfigurationInterface.php b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/ConfigurationInterface.php new file mode 100644 index 0000000000..71bcb885ac --- /dev/null +++ b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/ConfigurationInterface.php @@ -0,0 +1,58 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Alchemy\BinaryDriver; + +interface ConfigurationInterface extends \ArrayAccess, \IteratorAggregate +{ + /** + * Returns the value given a key from configuration + * + * @param string $key + * @param mixed $default The default value in case the key does not exist + * + * @return mixed + */ + public function get($key, $default = null); + + /** + * Set a value to configuration + * + * @param string $key The key + * @param mixed $value The value corresponding to the key + */ + public function set($key, $value); + + /** + * Tells if Configuration contains `$key` + * + * @param string $key + * + * @return Boolean + */ + public function has($key); + + /** + * Removes a value given a key + * + * @param string $key + * + * @return mixed The previous value + */ + public function remove($key); + + /** + * Returns all values set in the configuration + * + * @return array + */ + public function all(); +} diff --git a/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/Exception/ExceptionInterface.php b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/Exception/ExceptionInterface.php new file mode 100644 index 0000000000..aaa1e321e9 --- /dev/null +++ b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/Exception/ExceptionInterface.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Alchemy\BinaryDriver\Exception; + +interface ExceptionInterface +{ +} diff --git a/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/Exception/ExecutableNotFoundException.php b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/Exception/ExecutableNotFoundException.php new file mode 100644 index 0000000000..6f267ea258 --- /dev/null +++ b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/Exception/ExecutableNotFoundException.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Alchemy\BinaryDriver\Exception; + +class ExecutableNotFoundException extends \RuntimeException implements ExceptionInterface +{ +} diff --git a/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/Exception/ExecutionFailureException.php b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/Exception/ExecutionFailureException.php new file mode 100644 index 0000000000..1b557d11c2 --- /dev/null +++ b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/Exception/ExecutionFailureException.php @@ -0,0 +1,37 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Alchemy\BinaryDriver\Exception; + +class ExecutionFailureException extends \RuntimeException implements ExceptionInterface +{ + /** @var string */ + protected $command; + + /** @var string */ + protected $errorOutput; + + public function __construct($binaryName, $command, $errorOutput = null, $code = 0, $previous = null) + { + $message = sprintf("%s failed to execute command %s:\n\nError Output:\n\n %s", $binaryName, $command, $errorOutput); + parent::__construct($message, $code, $previous); + $this->command = $command; + $this->errorOutput = $errorOutput; + } + + public function getCommand(){ + return $this->command; + } + + public function getErrorOutput(){ + return $this->errorOutput; + } +} diff --git a/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/Exception/InvalidArgumentException.php b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/Exception/InvalidArgumentException.php new file mode 100644 index 0000000000..4e9cfe4b3d --- /dev/null +++ b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/Exception/InvalidArgumentException.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Alchemy\BinaryDriver\Exception; + +class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface +{ +} diff --git a/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/Listeners/DebugListener.php b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/Listeners/DebugListener.php new file mode 100644 index 0000000000..20773b03b7 --- /dev/null +++ b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/Listeners/DebugListener.php @@ -0,0 +1,58 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Alchemy\BinaryDriver\Listeners; + +use Evenement\EventEmitter; +use Symfony\Component\Process\Process; + +class DebugListener extends EventEmitter implements ListenerInterface +{ + private $prefixOut; + private $prefixErr; + private $eventOut; + private $eventErr; + + public function __construct($prefixOut = '[OUT] ', $prefixErr = '[ERROR] ', $eventOut = 'debug', $eventErr = 'debug') + { + $this->prefixOut = $prefixOut; + $this->prefixErr = $prefixErr; + $this->eventOut = $eventOut; + $this->eventErr = $eventErr; + } + + /** + * {@inheritdoc} + */ + public function handle($type, $data) + { + if (Process::ERR === $type) { + $this->emitLines($this->eventErr, $this->prefixErr, $data); + } elseif (Process::OUT === $type) { + $this->emitLines($this->eventOut, $this->prefixOut, $data); + } + } + + /** + * {@inheritdoc} + */ + public function forwardedEvents() + { + return array_unique(array($this->eventErr, $this->eventOut)); + } + + private function emitLines($event, $prefix, $lines) + { + foreach (explode("\n", $lines) as $line) { + $this->emit($event, array($prefix . $line)); + } + } +} diff --git a/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/Listeners/ListenerInterface.php b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/Listeners/ListenerInterface.php new file mode 100644 index 0000000000..920a6d5790 --- /dev/null +++ b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/Listeners/ListenerInterface.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Alchemy\BinaryDriver\Listeners; + +use Evenement\EventEmitterInterface; + +interface ListenerInterface extends EventEmitterInterface +{ + /** + * Handle the output of a ProcessRunner + * + * @param string $type The data type, one of Process::ERR, Process::OUT constants + * @param string $data The output + */ + public function handle($type, $data); + + /** + * An array of events that should be forwarded to BinaryInterface + * + * @return array + */ + public function forwardedEvents(); +} diff --git a/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/Listeners/Listeners.php b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/Listeners/Listeners.php new file mode 100644 index 0000000000..afb7549c02 --- /dev/null +++ b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/Listeners/Listeners.php @@ -0,0 +1,88 @@ +storage = new SplObjectStorage(); + } + + public function __clone() + { + $storage = $this->storage; + $this->storage = new SplObjectStorage(); + $this->storage->addAll($storage); + } + + /** + * Registers a listener, pass the listener events to the target. + * + * @param ListenerInterface $listener + * @param null|EventEmitter $target + * + * @return ListenersInterface + */ + public function register(ListenerInterface $listener, EventEmitter $target = null) + { + $EElisteners = array(); + + if (null !== $target) { + $EElisteners = $this->forwardEvents($listener, $target, $listener->forwardedEvents()); + } + + $this->storage->attach($listener, $EElisteners); + + return $this; + } + + /** + * Unregisters a listener, removes the listener events from the target. + * + * @param ListenerInterface $listener + * + * @return ListenersInterface + * + * @throws InvalidArgumentException In case the listener is not registered + */ + public function unregister(ListenerInterface $listener) + { + if (!isset($this->storage[$listener])) { + throw new InvalidArgumentException('Listener is not registered.'); + } + + foreach ($this->storage[$listener] as $event => $EElistener) { + $listener->removeListener($event, $EElistener); + } + + $this->storage->detach($listener); + + return $this; + } + + private function forwardEvents($source, $target, array $events) + { + $EElisteners = array(); + + foreach ($events as $event) { + $listener = $this->createListener($event, $target); + $source->on($event, $EElisteners[$event] = $listener); + } + + return $EElisteners; + } + + private function createListener($event, $target) + { + return function () use ($event, $target) { + $target->emit($event, func_get_args()); + }; + } +} diff --git a/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/ProcessBuilderFactory.php b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/ProcessBuilderFactory.php new file mode 100644 index 0000000000..b25ba3cb63 --- /dev/null +++ b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/ProcessBuilderFactory.php @@ -0,0 +1,186 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Alchemy\BinaryDriver; + +use Alchemy\BinaryDriver\Exception\InvalidArgumentException; +use Symfony\Component\Process\Process; +use Symfony\Component\Process\ProcessBuilder; + +class ProcessBuilderFactory implements ProcessBuilderFactoryInterface +{ + /** + * The binary path + * + * @var String + */ + protected $binary; + + /** + * The timeout for the generated processes + * + * @var integer|float + */ + private $timeout; + + /** + * An internal ProcessBuilder. + * + * Note that this one is used only if Symfony ProcessBuilder has method + * setPrefix (2.3) + * + * @var ProcessBuilder + */ + private $builder; + + /** + * Tells whether Symfony LTS ProcessBuilder should be emulated or not. + * + * This symfony version provided a brand new ::setPrefix method. + * + * @var Boolean + */ + public static $emulateSfLTS; + + /** + * Constructor + * + * @param String $binary The path to the binary + * + * @throws InvalidArgumentException In case binary path is invalid + */ + public function __construct($binary) + { + $this->detectEmulation(); + + if (!self::$emulateSfLTS) { + $this->builder = new ProcessBuilder(); + } + + $this->useBinary($binary); + } + + /** + * Covenient method for unit testing + * + * @return type + */ + public function getBuilder() + { + return $this->builder; + } + + /** + * Covenient method for unit testing + * + * @param ProcessBuilder $builder + * @return ProcessBuilderFactory + */ + public function setBuilder(ProcessBuilder $builder) + { + $this->builder = $builder; + + return $this; + } + + /** + * @inheritdoc + */ + public function getBinary() + { + return $this->binary; + } + + /** + * @inheritdoc + */ + public function useBinary($binary) + { + if (!is_executable($binary)) { + throw new InvalidArgumentException(sprintf('`%s` is not an executable binary', $binary)); + } + + $this->binary = $binary; + + if (!static::$emulateSfLTS) { + $this->builder->setPrefix($binary); + } + + return $this; + } + + /** + * @inheritdoc + */ + public function setTimeout($timeout) + { + $this->timeout = $timeout; + + if (!static::$emulateSfLTS) { + $this->builder->setTimeout($this->timeout); + } + + return $this; + } + + /** + * @inheritdoc + */ + public function getTimeout() + { + return $this->timeout; + } + + /** + * @inheritdoc + */ + public function create($arguments = array()) + { + if (null === $this->binary) { + throw new InvalidArgumentException('No binary set'); + } + + if (!is_array($arguments)) { + $arguments = array($arguments); + } + + if (static::$emulateSfLTS) { + array_unshift($arguments, $this->binary); + if (method_exists('Symfony\Component\Process\ProcessUtils', 'escapeArgument')) { + $script = implode(' ', array_map(array('Symfony\Component\Process\ProcessUtils', 'escapeArgument'), $arguments)); + } else { + $script = $arguments; + } + + $env = array_replace($_ENV, $_SERVER); + $env = array_filter($env, function ($value) { + return !is_array($value); + }); + + return new Process($script, null, $env, null, $this->timeout); + } else { + return $this->builder + ->setArguments($arguments) + ->getProcess(); + } + } + + private function detectEmulation() + { + if (null !== static::$emulateSfLTS) { + return $this; + } + + static::$emulateSfLTS = !method_exists('Symfony\Component\Process\ProcessBuilder', 'setPrefix'); + + return $this; + } +} diff --git a/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/ProcessBuilderFactoryAwareInterface.php b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/ProcessBuilderFactoryAwareInterface.php new file mode 100644 index 0000000000..1398bb4e6e --- /dev/null +++ b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/ProcessBuilderFactoryAwareInterface.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Alchemy\BinaryDriver; + +interface ProcessBuilderFactoryAwareInterface +{ + /** + * Returns the current process builder factory + * + * @return ProcessBuilderFactoryInterface + */ + public function getProcessBuilderFactory(); + + /** + * Set a process builder factory + * + * @param ProcessBuilderFactoryInterface $factory + */ + public function setProcessBuilderFactory(ProcessBuilderFactoryInterface $factory); +} diff --git a/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/ProcessBuilderFactoryInterface.php b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/ProcessBuilderFactoryInterface.php new file mode 100644 index 0000000000..05a22960f2 --- /dev/null +++ b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/ProcessBuilderFactoryInterface.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 Alchemy\BinaryDriver; + +use Alchemy\BinaryDriver\Exception\InvalidArgumentException; +use Symfony\Component\Process\Process; + +interface ProcessBuilderFactoryInterface +{ + /** + * Returns a new instance of Symfony Process + * + * @param string|array $arguments An argument or an array of arguments + * + * @return Process + * + * @throws InvalidArgumentException + */ + public function create($arguments = array()); + + /** + * Returns the path to the binary that is used + * + * @return String + */ + public function getBinary(); + + /** + * Sets the path to the binary + * + * @param String $binary A path to a binary + * + * @return ProcessBuilderFactoryInterface + * + * @throws InvalidArgumentException In case binary is not executable + */ + public function useBinary($binary); + + /** + * Set the default timeout to apply on created processes. + * + * @param integer|float $timeout + * + * @return ProcessBuilderFactoryInterface + * + * @throws InvalidArgumentException In case the timeout is not valid + */ + public function setTimeout($timeout); + + /** + * Returns the current timeout applied to the created processes. + * + * @return integer|float + */ + public function getTimeout(); +} diff --git a/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/ProcessRunner.php b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/ProcessRunner.php new file mode 100644 index 0000000000..0274887d59 --- /dev/null +++ b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/ProcessRunner.php @@ -0,0 +1,102 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Alchemy\BinaryDriver; + +use Alchemy\BinaryDriver\Exception\ExecutionFailureException; +use Psr\Log\LoggerInterface; +use SplObjectStorage; +use Symfony\Component\Process\Exception\RuntimeException; +use Symfony\Component\Process\Process; + +class ProcessRunner implements ProcessRunnerInterface +{ + /** @var LoggerInterface */ + private $logger; + + /** @var string */ + private $name; + + public function __construct(LoggerInterface $logger, $name) + { + $this->logger = $logger; + $this->name = $name; + } + + /** + * {@inheritdoc} + * + * @return ProcessRunner + */ + public function setLogger(LoggerInterface $logger) + { + $this->logger = $logger; + + return $this; + } + + /** + * @return LoggerInterface + */ + public function getLogger() + { + return $this->logger; + } + + /** + * {@inheritdoc} + */ + public function run(Process $process, SplObjectStorage $listeners, $bypassErrors) + { + $this->logger->info(sprintf( + '%s running command %s', $this->name, $process->getCommandLine() + )); + + try { + $process->run($this->buildCallback($listeners)); + } catch (RuntimeException $e) { + if (!$bypassErrors) { + $this->doExecutionFailure($process->getCommandLine(), $process->getErrorOutput(), $e); + } + } + + + if (!$bypassErrors && !$process->isSuccessful()) { + $this->doExecutionFailure($process->getCommandLine(), $process->getErrorOutput()); + } elseif (!$process->isSuccessful()) { + $this->logger->error($this->createErrorMessage($process->getCommandLine(), $process->getErrorOutput())); + return; + } else { + $this->logger->info(sprintf('%s executed command successfully', $this->name)); + return $process->getOutput(); + } + } + + private function buildCallback(SplObjectStorage $listeners) + { + return function ($type, $data) use ($listeners) { + foreach ($listeners as $listener) { + $listener->handle($type, $data); + } + }; + } + + private function doExecutionFailure($command, $errorOutput, \Exception $e = null) + { + $this->logger->error($this->createErrorMessage($command, $errorOutput)); + throw new ExecutionFailureException($this->name, $command, $errorOutput, + $e ? $e->getCode() : 0, $e ?: null); + } + + private function createErrorMessage($command, $errorOutput){ + return sprintf('%s failed to execute command %s: %s', $this->name, $command, $errorOutput); + } +} diff --git a/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/ProcessRunnerAwareInterface.php b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/ProcessRunnerAwareInterface.php new file mode 100644 index 0000000000..807c33e7aa --- /dev/null +++ b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/ProcessRunnerAwareInterface.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Alchemy\BinaryDriver; + +interface ProcessRunnerAwareInterface +{ + /** + * Returns the current process runner + * + * @return ProcessRunnerInterface + */ + public function getProcessRunner(); + + /** + * Sets a process runner + * + * @param ProcessRunnerInterface $runner + */ + public function setProcessRunner(ProcessRunnerInterface $runner); +} diff --git a/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/ProcessRunnerInterface.php b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/ProcessRunnerInterface.php new file mode 100644 index 0000000000..6605404453 --- /dev/null +++ b/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/ProcessRunnerInterface.php @@ -0,0 +1,33 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Alchemy\BinaryDriver; + +use Alchemy\BinaryDriver\Exception\ExecutionFailureException; +use Psr\Log\LoggerAwareInterface; +use SplObjectStorage; +use Symfony\Component\Process\Process; + +interface ProcessRunnerInterface extends LoggerAwareInterface +{ + /** + * Executes a process, logs events + * + * @param Process $process + * @param SplObjectStorage $listeners Some listeners + * @param Boolean $bypassErrors Set to true to disable throwing ExecutionFailureExceptions + * + * @return string The Process output + * + * @throws ExecutionFailureException in case of process failure. + */ + public function run(Process $process, SplObjectStorage $listeners, $bypassErrors); +} diff --git a/vendor/alchemy/binary-driver/tests/Alchemy/Tests/BinaryDriver/AbstractBinaryTest.php b/vendor/alchemy/binary-driver/tests/Alchemy/Tests/BinaryDriver/AbstractBinaryTest.php new file mode 100644 index 0000000000..f51ab6f08d --- /dev/null +++ b/vendor/alchemy/binary-driver/tests/Alchemy/Tests/BinaryDriver/AbstractBinaryTest.php @@ -0,0 +1,300 @@ +find('php'); + + if (null === $php) { + $this->markTestSkipped('Unable to find a php binary'); + } + + return $php; + } + + public function testSimpleLoadWithBinaryPath() + { + $php = $this->getPhpBinary(); + $imp = Implementation::load($php); + $this->assertInstanceOf('Alchemy\Tests\BinaryDriver\Implementation', $imp); + + $this->assertEquals($php, $imp->getProcessBuilderFactory()->getBinary()); + } + + public function testMultipleLoadWithBinaryPath() + { + $php = $this->getPhpBinary(); + $imp = Implementation::load(array('/zz/path/to/unexisting/command', $php)); + $this->assertInstanceOf('Alchemy\Tests\BinaryDriver\Implementation', $imp); + + $this->assertEquals($php, $imp->getProcessBuilderFactory()->getBinary()); + } + + public function testSimpleLoadWithBinaryName() + { + $php = $this->getPhpBinary(); + $imp = Implementation::load('php'); + $this->assertInstanceOf('Alchemy\Tests\BinaryDriver\Implementation', $imp); + + $this->assertEquals($php, $imp->getProcessBuilderFactory()->getBinary()); + } + + public function testMultipleLoadWithBinaryName() + { + $php = $this->getPhpBinary(); + $imp = Implementation::load(array('bachibouzouk', 'php')); + $this->assertInstanceOf('Alchemy\Tests\BinaryDriver\Implementation', $imp); + + $this->assertEquals($php, $imp->getProcessBuilderFactory()->getBinary()); + } + + public function testLoadWithMultiplePathExpectingAFailure() + { + $this->setExpectedException(ExecutableNotFoundException::class); + + Implementation::load(array('bachibouzouk', 'moribon')); + } + + public function testLoadWithUniquePathExpectingAFailure() + { + $this->setExpectedException(ExecutableNotFoundException::class); + + Implementation::load('bachibouzouk'); + } + + public function testLoadWithCustomLogger() + { + $logger = $this->getMock('Psr\Log\LoggerInterface'); + $imp = Implementation::load('php', $logger); + + $this->assertEquals($logger, $imp->getProcessRunner()->getLogger()); + } + + public function testLoadWithCustomConfigurationAsArray() + { + $conf = array('timeout' => 200); + $imp = Implementation::load('php', null, $conf); + + $this->assertEquals($conf, $imp->getConfiguration()->all()); + } + + public function testLoadWithCustomConfigurationAsObject() + { + $conf = $this->getMock('Alchemy\BinaryDriver\ConfigurationInterface'); + $imp = Implementation::load('php', null, $conf); + + $this->assertEquals($conf, $imp->getConfiguration()); + } + + public function testProcessBuilderFactoryGetterAndSetters() + { + $imp = Implementation::load('php'); + $factory = $this->getMock('Alchemy\BinaryDriver\ProcessBuilderFactoryInterface'); + + $imp->setProcessBuilderFactory($factory); + $this->assertEquals($factory, $imp->getProcessBuilderFactory()); + } + + public function testConfigurationGetterAndSetters() + { + $imp = Implementation::load('php'); + $conf = $this->getMock('Alchemy\BinaryDriver\ConfigurationInterface'); + + $imp->setConfiguration($conf); + $this->assertEquals($conf, $imp->getConfiguration()); + } + + public function testTimeoutIsSetOnConstruction() + { + $imp = Implementation::load('php', null, array('timeout' => 42)); + $this->assertEquals(42, $imp->getProcessBuilderFactory()->getTimeout()); + } + + public function testTimeoutIsSetOnConfigurationSetting() + { + $imp = Implementation::load('php', null); + $imp->setConfiguration(new Configuration(array('timeout' => 42))); + $this->assertEquals(42, $imp->getProcessBuilderFactory()->getTimeout()); + } + + public function testTimeoutIsSetOnProcessBuilderSetting() + { + $imp = Implementation::load('php', null, array('timeout' => 42)); + + $factory = $this->getMock('Alchemy\BinaryDriver\ProcessBuilderFactoryInterface'); + $factory->expects($this->once()) + ->method('setTimeout') + ->with(42); + + $imp->setProcessBuilderFactory($factory); + } + + public function testListenRegistersAListener() + { + $imp = Implementation::load('php'); + + $listeners = $this->getMockBuilder('Alchemy\BinaryDriver\Listeners\Listeners') + ->disableOriginalConstructor() + ->getMock(); + + $listener = $this->getMock('Alchemy\BinaryDriver\Listeners\ListenerInterface'); + + $listeners->expects($this->once()) + ->method('register') + ->with($this->equalTo($listener), $this->equalTo($imp)); + + $reflexion = new \ReflectionClass('Alchemy\BinaryDriver\AbstractBinary'); + $prop = $reflexion->getProperty('listenersManager'); + $prop->setAccessible(true); + $prop->setValue($imp, $listeners); + + $imp->listen($listener); + } + + /** + * @dataProvider provideCommandParameters + */ + public function testCommandRunsAProcess($parameters, $bypassErrors, $expectedParameters, $output) + { + $imp = Implementation::load('php'); + $factory = $this->getMock('Alchemy\BinaryDriver\ProcessBuilderFactoryInterface'); + $processRunner = $this->getMock('Alchemy\BinaryDriver\ProcessRunnerInterface'); + + $process = $this->getMockBuilder('Symfony\Component\Process\Process') + ->disableOriginalConstructor() + ->getMock(); + + $processRunner->expects($this->once()) + ->method('run') + ->with($this->equalTo($process), $this->isInstanceOf('SplObjectStorage'), $this->equalTo($bypassErrors)) + ->will($this->returnValue($output)); + + $factory->expects($this->once()) + ->method('create') + ->with($expectedParameters) + ->will($this->returnValue($process)); + + $imp->setProcessBuilderFactory($factory); + $imp->setProcessRunner($processRunner); + + $this->assertEquals($output, $imp->command($parameters, $bypassErrors)); + } + + /** + * @dataProvider provideCommandWithListenersParameters + */ + public function testCommandWithTemporaryListeners($parameters, $bypassErrors, $expectedParameters, $output, $count, $listeners) + { + $imp = Implementation::load('php'); + $factory = $this->getMock('Alchemy\BinaryDriver\ProcessBuilderFactoryInterface'); + $processRunner = $this->getMock('Alchemy\BinaryDriver\ProcessRunnerInterface'); + + $process = $this->getMockBuilder('Symfony\Component\Process\Process') + ->disableOriginalConstructor() + ->getMock(); + + $firstStorage = $secondStorage = null; + + $processRunner->expects($this->exactly(2)) + ->method('run') + ->with($this->equalTo($process), $this->isInstanceOf('SplObjectStorage'), $this->equalTo($bypassErrors)) + ->will($this->returnCallback(function ($process, $storage, $errors) use ($output, &$firstStorage, &$secondStorage) { + if (null === $firstStorage) { + $firstStorage = $storage; + } else { + $secondStorage = $storage; + } + + return $output; + })); + + $factory->expects($this->exactly(2)) + ->method('create') + ->with($expectedParameters) + ->will($this->returnValue($process)); + + $imp->setProcessBuilderFactory($factory); + $imp->setProcessRunner($processRunner); + + $this->assertEquals($output, $imp->command($parameters, $bypassErrors, $listeners)); + $this->assertCount($count, $firstStorage); + $this->assertEquals($output, $imp->command($parameters, $bypassErrors)); + $this->assertCount(0, $secondStorage); + } + + public function provideCommandWithListenersParameters() + { + return array( + array('-a', false, array('-a'), 'loubda', 2, array($this->getMockListener(), $this->getMockListener())), + array('-a', false, array('-a'), 'loubda', 1, array($this->getMockListener())), + array('-a', false, array('-a'), 'loubda', 1, $this->getMockListener()), + array('-a', false, array('-a'), 'loubda', 0, array()), + ); + } + + public function provideCommandParameters() + { + return array( + array('-a', false, array('-a'), 'loubda'), + array('-a', true, array('-a'), 'loubda'), + array('-a -b', false, array('-a -b'), 'loubda'), + array(array('-a'), false, array('-a'), 'loubda'), + array(array('-a'), true, array('-a'), 'loubda'), + array(array('-a', '-b'), false, array('-a', '-b'), 'loubda'), + ); + } + + public function testUnlistenUnregistersAListener() + { + $imp = Implementation::load('php'); + + $listeners = $this->getMockBuilder('Alchemy\BinaryDriver\Listeners\Listeners') + ->disableOriginalConstructor() + ->getMock(); + + $listener = $this->getMock('Alchemy\BinaryDriver\Listeners\ListenerInterface'); + + $listeners->expects($this->once()) + ->method('unregister') + ->with($this->equalTo($listener), $this->equalTo($imp)); + + $reflexion = new \ReflectionClass('Alchemy\BinaryDriver\AbstractBinary'); + $prop = $reflexion->getProperty('listenersManager'); + $prop->setAccessible(true); + $prop->setValue($imp, $listeners); + + $imp->unlisten($listener); + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject + */ + private function getMockListener() + { + $listener = $this->getMock(ListenerInterface::class); + $listener->expects($this->any()) + ->method('forwardedEvents') + ->willReturn(array()); + + return $listener; + } +} + +class Implementation extends AbstractBinary +{ + public function getName() + { + return 'Implementation'; + } +} diff --git a/vendor/alchemy/binary-driver/tests/Alchemy/Tests/BinaryDriver/AbstractProcessBuilderFactoryTest.php b/vendor/alchemy/binary-driver/tests/Alchemy/Tests/BinaryDriver/AbstractProcessBuilderFactoryTest.php new file mode 100644 index 0000000000..de0b61ce22 --- /dev/null +++ b/vendor/alchemy/binary-driver/tests/Alchemy/Tests/BinaryDriver/AbstractProcessBuilderFactoryTest.php @@ -0,0 +1,97 @@ +markTestSkipped('Unable to detect php binary, skipping'); + } + } + + public static function setUpBeforeClass() + { + $finder = new ExecutableFinder(); + static::$phpBinary = $finder->find('php'); + } + + public function testThatBinaryIsSetOnConstruction() + { + $factory = $this->getProcessBuilderFactory(static::$phpBinary); + $this->assertEquals(static::$phpBinary, $factory->getBinary()); + } + + public function testGetSetBinary() + { + $finder = new ExecutableFinder(); + $phpUnit = $finder->find('phpunit'); + + if (null === $phpUnit) { + $this->markTestSkipped('Unable to detect phpunit binary, skipping'); + } + + $factory = $this->getProcessBuilderFactory(static::$phpBinary); + $factory->useBinary($phpUnit); + $this->assertEquals($phpUnit, $factory->getBinary()); + } + + /** + * @expectedException Alchemy\BinaryDriver\Exception\InvalidArgumentException + */ + public function testUseNonExistantBinary() + { + $factory = $this->getProcessBuilderFactory(static::$phpBinary); + $factory->useBinary('itissureitdoesnotexist'); + } + + public function testCreateShouldReturnAProcess() + { + $factory = $this->getProcessBuilderFactory(static::$phpBinary); + $process = $factory->create(); + + $this->assertInstanceOf('Symfony\Component\Process\Process', $process); + $this->assertEquals("'".static::$phpBinary."'", $process->getCommandLine()); + } + + public function testCreateWithStringArgument() + { + $factory = $this->getProcessBuilderFactory(static::$phpBinary); + $process = $factory->create('-v'); + + $this->assertInstanceOf('Symfony\Component\Process\Process', $process); + $this->assertEquals("'".static::$phpBinary."' '-v'", $process->getCommandLine()); + } + + public function testCreateWithArrayArgument() + { + $factory = $this->getProcessBuilderFactory(static::$phpBinary); + $process = $factory->create(array('-r', 'echo "Hello !";')); + + $this->assertInstanceOf('Symfony\Component\Process\Process', $process); + $this->assertEquals("'".static::$phpBinary."' '-r' 'echo \"Hello !\";'", $process->getCommandLine()); + } + + public function testCreateWithTimeout() + { + $factory = $this->getProcessBuilderFactory(static::$phpBinary); + $factory->setTimeout(200); + $process = $factory->create(array('-i')); + + $this->assertInstanceOf('Symfony\Component\Process\Process', $process); + $this->assertEquals(200, $process->getTimeout()); + } +} diff --git a/vendor/alchemy/binary-driver/tests/Alchemy/Tests/BinaryDriver/ConfigurationTest.php b/vendor/alchemy/binary-driver/tests/Alchemy/Tests/BinaryDriver/ConfigurationTest.php new file mode 100644 index 0000000000..b2cd2ddd49 --- /dev/null +++ b/vendor/alchemy/binary-driver/tests/Alchemy/Tests/BinaryDriver/ConfigurationTest.php @@ -0,0 +1,78 @@ + 'value')); + + $this->assertTrue(isset($configuration['key'])); + $this->assertEquals('value', $configuration['key']); + + $this->assertFalse(isset($configuration['key2'])); + unset($configuration['key']); + $this->assertFalse(isset($configuration['key'])); + + $configuration['key2'] = 'value2'; + $this->assertTrue(isset($configuration['key2'])); + $this->assertEquals('value2', $configuration['key2']); + } + + public function testGetOnNonExistentKeyShouldReturnDefaultValue() + { + $conf = new Configuration(); + $this->assertEquals('booba', $conf->get('hooba', 'booba')); + $this->assertEquals(null, $conf->get('hooba')); + } + + public function testSetHasGetRemove() + { + $configuration = new Configuration(array('key' => 'value')); + + $this->assertTrue($configuration->has('key')); + $this->assertEquals('value', $configuration->get('key')); + + $this->assertFalse($configuration->has('key2')); + $configuration->remove('key'); + $this->assertFalse($configuration->has('key')); + + $configuration->set('key2', 'value2'); + $this->assertTrue($configuration->has('key2')); + $this->assertEquals('value2', $configuration->get('key2')); + } + + public function testIterator() + { + $data = array( + 'key1' => 'value1', + 'key2' => 'value2', + 'key3' => 'value3', + ); + + $captured = array(); + $conf = new Configuration($data); + + foreach ($conf as $key => $value) { + $captured[$key] = $value; + } + + $this->assertEquals($data, $captured); + } + + public function testAll() + { + $data = array( + 'key1' => 'value1', + 'key2' => 'value2', + 'key3' => 'value3', + ); + + $conf = new Configuration($data); + $this->assertEquals($data, $conf->all()); + } + +} diff --git a/vendor/alchemy/binary-driver/tests/Alchemy/Tests/BinaryDriver/Exceptions/ExecutionFailureExceptionTest.php b/vendor/alchemy/binary-driver/tests/Alchemy/Tests/BinaryDriver/Exceptions/ExecutionFailureExceptionTest.php new file mode 100644 index 0000000000..a21bcf1c55 --- /dev/null +++ b/vendor/alchemy/binary-driver/tests/Alchemy/Tests/BinaryDriver/Exceptions/ExecutionFailureExceptionTest.php @@ -0,0 +1,33 @@ +createLoggerMock(); + $runner = $this->getProcessRunner($logger); + + $process = $this->createProcessMock(1, false, '--helloworld--', null, "Error Output", true); + try{ + $runner->run($process, new \SplObjectStorage(), false); + $this->fail('An exception should have been raised'); + } + catch (ExecutionFailureException $e){ + $this->assertEquals("--helloworld--", $e->getCommand()); + $this->assertEquals("Error Output", $e->getErrorOutput()); + } + + } + +} \ No newline at end of file diff --git a/vendor/alchemy/binary-driver/tests/Alchemy/Tests/BinaryDriver/LTSProcessBuilder.php b/vendor/alchemy/binary-driver/tests/Alchemy/Tests/BinaryDriver/LTSProcessBuilder.php new file mode 100644 index 0000000000..dc6c03361b --- /dev/null +++ b/vendor/alchemy/binary-driver/tests/Alchemy/Tests/BinaryDriver/LTSProcessBuilder.php @@ -0,0 +1,54 @@ +arguments = $arguments; + parent::__construct($arguments); + } + + public function setArguments(array $arguments) + { + $this->arguments = $arguments; + + return $this; + } + + public function setPrefix($prefix) + { + $this->prefix = $prefix; + + return $this; + } + + public function setTimeout($timeout) + { + $this->timeout = $timeout; + + return $this; + } + + public function getProcess() + { + if (!$this->prefix && !count($this->arguments)) { + throw new LogicException('You must add() command arguments before calling getProcess().'); + } + + $args = $this->prefix ? array_merge(array($this->prefix), $this->arguments) : $this->arguments; + $script = implode(' ', array_map('escapeshellarg', $args)); + + return new Process($script, null, null, null, $this->timeout); + } +} diff --git a/vendor/alchemy/binary-driver/tests/Alchemy/Tests/BinaryDriver/LTSProcessBuilderFactoryTest.php b/vendor/alchemy/binary-driver/tests/Alchemy/Tests/BinaryDriver/LTSProcessBuilderFactoryTest.php new file mode 100644 index 0000000000..3c4c58166e --- /dev/null +++ b/vendor/alchemy/binary-driver/tests/Alchemy/Tests/BinaryDriver/LTSProcessBuilderFactoryTest.php @@ -0,0 +1,28 @@ +markTestSkipped('ProcessBuilder is not available.'); + return; + } + + parent::setUp(); + } + + protected function getProcessBuilderFactory($binary) + { + $factory = new ProcessBuilderFactory($binary); + $factory->setBuilder(new LTSProcessBuilder()); + ProcessBuilderFactory::$emulateSfLTS = false; + $factory->useBinary($binary); + + return $factory; + } +} diff --git a/vendor/alchemy/binary-driver/tests/Alchemy/Tests/BinaryDriver/Listeners/DebugListenerTest.php b/vendor/alchemy/binary-driver/tests/Alchemy/Tests/BinaryDriver/Listeners/DebugListenerTest.php new file mode 100644 index 0000000000..69958677da --- /dev/null +++ b/vendor/alchemy/binary-driver/tests/Alchemy/Tests/BinaryDriver/Listeners/DebugListenerTest.php @@ -0,0 +1,33 @@ +on('debug', function ($line) use (&$lines) { + $lines[] = $line; + }); + $listener->handle(Process::ERR, "first line\nsecond line"); + $listener->handle(Process::OUT, "cool output"); + $listener->handle('unknown', "lalala"); + $listener->handle(Process::OUT, "another output\n"); + + $expected = array( + '[ERROR] first line', + '[ERROR] second line', + '[OUT] cool output', + '[OUT] another output', + '[OUT] ', + ); + + $this->assertEquals($expected, $lines); + } +} diff --git a/vendor/alchemy/binary-driver/tests/Alchemy/Tests/BinaryDriver/Listeners/ListenersTest.php b/vendor/alchemy/binary-driver/tests/Alchemy/Tests/BinaryDriver/Listeners/ListenersTest.php new file mode 100644 index 0000000000..fe96d73acb --- /dev/null +++ b/vendor/alchemy/binary-driver/tests/Alchemy/Tests/BinaryDriver/Listeners/ListenersTest.php @@ -0,0 +1,92 @@ +register($listener); + + $n = 0; + $listener->on('received', function ($type, $data) use (&$n, &$capturedType, &$capturedData) { + $n++; + $capturedData = $data; + $capturedType = $type; + }); + + $type = 'type'; + $data = 'data'; + + $listener->handle($type, $data); + $listener->handle($type, $data); + + $listeners->unregister($listener); + + $listener->handle($type, $data); + + $this->assertEquals(3, $n); + $this->assertEquals($type, $capturedType); + $this->assertEquals($data, $capturedData); + } + + public function testRegisterAndForwardThenUnregister() + { + $listener = new MockListener(); + $target = new EventEmitter(); + + $n = 0; + $target->on('received', function ($type, $data) use (&$n, &$capturedType, &$capturedData) { + $n++; + $capturedData = $data; + $capturedType = $type; + }); + + $m = 0; + $listener->on('received', function ($type, $data) use (&$m, &$capturedType2, &$capturedData2) { + $m++; + $capturedData2 = $data; + $capturedType2 = $type; + }); + + $listeners = new Listeners(); + $listeners->register($listener, $target); + + $type = 'type'; + $data = 'data'; + + $listener->handle($type, $data); + $listener->handle($type, $data); + + $listeners->unregister($listener, $target); + + $listener->handle($type, $data); + + $this->assertEquals(2, $n); + $this->assertEquals(3, $m); + $this->assertEquals($type, $capturedType); + $this->assertEquals($data, $capturedData); + $this->assertEquals($type, $capturedType2); + $this->assertEquals($data, $capturedData2); + } +} + +class MockListener extends EventEmitter implements ListenerInterface +{ + public function handle($type, $data) + { + $this->emit('received', array($type, $data)); + } + + public function forwardedEvents() + { + return array('received'); + } +} diff --git a/vendor/alchemy/binary-driver/tests/Alchemy/Tests/BinaryDriver/NONLTSProcessBuilderFactoryTest.php b/vendor/alchemy/binary-driver/tests/Alchemy/Tests/BinaryDriver/NONLTSProcessBuilderFactoryTest.php new file mode 100644 index 0000000000..fe5f343bd2 --- /dev/null +++ b/vendor/alchemy/binary-driver/tests/Alchemy/Tests/BinaryDriver/NONLTSProcessBuilderFactoryTest.php @@ -0,0 +1,15 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Alchemy\Tests\BinaryDriver; + +use Alchemy\BinaryDriver\ProcessRunner; +use Alchemy\BinaryDriver\BinaryDriverTestCase; +use Alchemy\BinaryDriver\Exception\ExecutionFailureException; +use Alchemy\BinaryDriver\Listeners\ListenerInterface; +use Evenement\EventEmitter; +use Symfony\Component\Process\Exception\RuntimeException as ProcessRuntimeException; + +class ProcessRunnerTest extends BinaryDriverTestCase +{ + public function getProcessRunner($logger) + { + return new ProcessRunner($logger, 'test-runner'); + } + + public function testRunSuccessFullProcess() + { + $logger = $this->createLoggerMock(); + $runner = $this->getProcessRunner($logger); + + $process = $this->createProcessMock(1, true, '--helloworld--', "Kikoo Romain", null, true); + + $logger + ->expects($this->never()) + ->method('error'); + $logger + ->expects($this->exactly(2)) + ->method('info'); + + $this->assertEquals('Kikoo Romain', $runner->run($process, new \SplObjectStorage(), false)); + } + + public function testRunSuccessFullProcessBypassingErrors() + { + $logger = $this->createLoggerMock(); + $runner = $this->getProcessRunner($logger); + + $process = $this->createProcessMock(1, true, '--helloworld--', "Kikoo Romain", null, true); + + $logger + ->expects($this->never()) + ->method('error'); + $logger + ->expects($this->exactly(2)) + ->method('info'); + + $this->assertEquals('Kikoo Romain', $runner->run($process, new \SplObjectStorage(), true)); + } + + public function testRunFailingProcess() + { + $logger = $this->createLoggerMock(); + $runner = $this->getProcessRunner($logger); + + $process = $this->createProcessMock(1, false, '--helloworld--', null, null, true); + + $logger + ->expects($this->once()) + ->method('error'); + $logger + ->expects($this->once()) + ->method('info'); + + try { + $runner->run($process, new \SplObjectStorage(), false); + $this->fail('An exception should have been raised'); + } catch (ExecutionFailureException $e) { + + } + } + + public function testRunFailingProcessWithException() + { + $logger = $this->createLoggerMock(); + $runner = $this->getProcessRunner($logger); + + $exception = new ProcessRuntimeException('Process Failed'); + $process = $this->getMockBuilder('Symfony\Component\Process\Process') + ->disableOriginalConstructor() + ->getMock(); + $process->expects($this->once()) + ->method('run') + ->will($this->throwException($exception)); + + $logger + ->expects($this->once()) + ->method('error'); + $logger + ->expects($this->once()) + ->method('info'); + + try { + $runner->run($process, new \SplObjectStorage(), false); + $this->fail('An exception should have been raised'); + } catch (ExecutionFailureException $e) { + $this->assertEquals($exception, $e->getPrevious()); + } + } + + public function testRunfailingProcessBypassingErrors() + { + $logger = $this->createLoggerMock(); + $runner = $this->getProcessRunner($logger); + + $process = $this->createProcessMock(1, false, '--helloworld--', 'Hello output', null, true); + + $logger + ->expects($this->once()) + ->method('error'); + $logger + ->expects($this->once()) + ->method('info'); + + $this->assertNull($runner->run($process, new \SplObjectStorage(), true)); + } + + public function testRunFailingProcessWithExceptionBypassingErrors() + { + $logger = $this->createLoggerMock(); + $runner = $this->getProcessRunner($logger); + + $exception = new ProcessRuntimeException('Process Failed'); + $process = $this->getMockBuilder('Symfony\Component\Process\Process') + ->disableOriginalConstructor() + ->getMock(); + $process->expects($this->once()) + ->method('run') + ->will($this->throwException($exception)); + + $logger + ->expects($this->once()) + ->method('error'); + $logger + ->expects($this->once()) + ->method('info'); + + $this->assertNull($runner->run($process, new \SplObjectStorage(), true)); + } + + public function testRunSuccessFullProcessWithHandlers() + { + $logger = $this->createLoggerMock(); + $runner = $this->getProcessRunner($logger); + + $capturedCallback = null; + + $process = $this->createProcessMock(1, true, '--helloworld--', "Kikoo Romain", null, true); + $process->expects($this->once()) + ->method('run') + ->with($this->isInstanceOf('Closure')) + ->will($this->returnCallback(function ($callback) use (&$capturedCallback) { + $capturedCallback = $callback; + })); + + $logger + ->expects($this->never()) + ->method('error'); + $logger + ->expects($this->exactly(2)) + ->method('info'); + + $listener = new TestListener(); + $storage = new \SplObjectStorage(); + $storage->attach($listener); + + $capturedType = $capturedData = null; + + $listener->on('received', function ($type, $data) use (&$capturedType, &$capturedData) { + $capturedData = $data; + $capturedType = $type; + }); + + $this->assertEquals('Kikoo Romain', $runner->run($process, $storage, false)); + + $type = 'err'; + $data = 'data'; + + $capturedCallback($type, $data); + + $this->assertEquals($data, $capturedData); + $this->assertEquals($type, $capturedType); + } +} + +class TestListener extends EventEmitter implements ListenerInterface +{ + public function handle($type, $data) + { + return $this->emit('received', array($type, $data)); + } + + public function forwardedEvents() + { + return array(); + } +} diff --git a/vendor/alchemy/binary-driver/tests/bootstrap.php b/vendor/alchemy/binary-driver/tests/bootstrap.php new file mode 100644 index 0000000000..b5e2aed9bb --- /dev/null +++ b/vendor/alchemy/binary-driver/tests/bootstrap.php @@ -0,0 +1,4 @@ +add('Alchemy\Tests', __DIR__); diff --git a/vendor/bin/phpdoc b/vendor/bin/phpdoc new file mode 120000 index 0000000000..ce8dd90c95 --- /dev/null +++ b/vendor/bin/phpdoc @@ -0,0 +1 @@ +../phpdocumentor/phpdocumentor/bin/phpdoc \ No newline at end of file diff --git a/vendor/bin/phpdoc.php b/vendor/bin/phpdoc.php new file mode 120000 index 0000000000..688d85699c --- /dev/null +++ b/vendor/bin/phpdoc.php @@ -0,0 +1 @@ +../phpdocumentor/phpdocumentor/bin/phpdoc.php \ No newline at end of file diff --git a/vendor/bin/phpunit b/vendor/bin/phpunit new file mode 120000 index 0000000000..2c48930310 --- /dev/null +++ b/vendor/bin/phpunit @@ -0,0 +1 @@ +../phpunit/phpunit/phpunit \ No newline at end of file diff --git a/vendor/bin/psysh b/vendor/bin/psysh new file mode 120000 index 0000000000..3c06b1ae90 --- /dev/null +++ b/vendor/bin/psysh @@ -0,0 +1 @@ +../psy/psysh/bin/psysh \ No newline at end of file diff --git a/vendor/cilex/cilex/.gitignore b/vendor/cilex/cilex/.gitignore new file mode 100644 index 0000000000..287d9ac69a --- /dev/null +++ b/vendor/cilex/cilex/.gitignore @@ -0,0 +1,7 @@ +vendor +phpunit.xml +cilex.phar +.idea +composer.phar +.vagrant +docs/.build \ No newline at end of file diff --git a/vendor/cilex/cilex/.puppet/manifests/manifest.pp b/vendor/cilex/cilex/.puppet/manifests/manifest.pp new file mode 100644 index 0000000000..7064557abe --- /dev/null +++ b/vendor/cilex/cilex/.puppet/manifests/manifest.pp @@ -0,0 +1,32 @@ +group { "puppet": + ensure => "present", +} + +node default { + exec { "apt-get update": + command => "/usr/bin/apt-get update" + } + + package{["git", "python-setuptools", "wget", "make", "texlive-latex-recommended", "texlive-latex-extra", "texlive-fonts-recommended", "openjdk-6-jre", "php5-cli", "php5-xdebug"]: + ensure => present, + require => Exec["apt-get update"] + } + + exec { "sudo easy_install -U sphinx": + command => "/usr/bin/sudo /usr/bin/easy_install -U sphinx", + require => [ Package["python-setuptools"] ], + timeout => 0 + } + + exec { "get-composer": + command => "/usr/bin/wget -N http://getcomposer.org/composer.phar", + require => Package["wget"], + cwd => "/vagrant" + } + + exec { "composer-install": + command => "/usr/bin/php composer.phar install --dev", + require => Exec["get-composer"], + cwd => "/vagrant" + } +} \ No newline at end of file diff --git a/vendor/cilex/cilex/.travis.yml b/vendor/cilex/cilex/.travis.yml new file mode 100644 index 0000000000..337969ab25 --- /dev/null +++ b/vendor/cilex/cilex/.travis.yml @@ -0,0 +1,13 @@ +language: php +php: + - 5.3 + - 5.4 + +before_script: + - composer install + +script: phpunit --coverage-text + +notifications: + email: + - mike.vanriel@naenius.com \ No newline at end of file diff --git a/vendor/cilex/cilex/LICENSE b/vendor/cilex/cilex/LICENSE new file mode 100644 index 0000000000..4a89ad7d22 --- /dev/null +++ b/vendor/cilex/cilex/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2012 Mike van Riel + +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. \ No newline at end of file diff --git a/vendor/cilex/cilex/README.md b/vendor/cilex/cilex/README.md new file mode 100644 index 0000000000..180208b7fd --- /dev/null +++ b/vendor/cilex/cilex/README.md @@ -0,0 +1,70 @@ +Cilex, a simple Command Line Interface framework +================================================ + +Cilex is a simple command line application framework to develop simple tools +based on [Symfony2][1] components: + +```php +command(new \Cilex\Command\GreetCommand()); +$app->run(); +``` + +Cilex works with PHP 5.3.3 or later and is heavily inspired on the [Silex][2] +web micro-framework by Fabien Potencier. + +## Installation + + 1. `git clone` _this_ repository. + 2. Download composer: `curl -s https://getcomposer.org/installer | php` + 3. Install Cilex' dependencies: `php composer.phar install` + 4. Create the phar: `php ./compile` + + + +## Usage + + - Download composer: `curl -s https://getcomposer.org/installer | php` + - Add to your dependencies: `php composer.phar require cilex/cilex dev-master` + - Update the dependencies + - Create a `run.php` file + +```php +command(new \Cilex\Command\GreetCommand()); +$app->run(); +``` + - `php run.php` + - enjoy a lot. + +## License + +Cilex is licensed under the MIT license. + +[1]: http://symfony.com +[2]: http://silex.sensiolabs.org +[3]: http://cilex.github.com/get/cilex.phar +[4]: http://cilex.github.com/documentation + +## FAQ + +Q: How do I pass configuration into the application? + +A: You can do this by adding the following line, where $configPath is the path to the configuration file you want to use: + +```php +$app->register(new \Cilex\Provider\ConfigServiceProvider(), array('config.path' => $configPath)); +``` + +The formats currently supported are: YAML, XML and JSON diff --git a/vendor/cilex/cilex/Vagrantfile b/vendor/cilex/cilex/Vagrantfile new file mode 100644 index 0000000000..77770fdbe3 --- /dev/null +++ b/vendor/cilex/cilex/Vagrantfile @@ -0,0 +1,13 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : + +Vagrant::Config.run do |config| + config.vm.box = "precise64" + config.vm.box_url = "http://files.vagrantup.com/precise64.box" + + config.vm.provision :puppet do |puppet| + puppet.manifests_path = ".puppet/manifests" + puppet.manifest_file = "manifest.pp" + puppet.options = [ '--verbose' ] + end +end diff --git a/vendor/cilex/cilex/bin/compile b/vendor/cilex/cilex/bin/compile new file mode 100644 index 0000000000..6af83f21bf --- /dev/null +++ b/vendor/cilex/cilex/bin/compile @@ -0,0 +1,13 @@ +#!/usr/bin/env php +compile(); diff --git a/vendor/cilex/cilex/composer.json b/vendor/cilex/cilex/composer.json new file mode 100644 index 0000000000..6b9dcb7a41 --- /dev/null +++ b/vendor/cilex/cilex/composer.json @@ -0,0 +1,32 @@ +{ + "name": "cilex/cilex", + "description": "The PHP micro-framework for Command line tools based on the Symfony2 Components", + "keywords": ["microframework","cli"], + "homepage": "http://cilex.github.com", + "license": "MIT", + "autoload":{ + "psr-0":{ "Cilex": "src/" } + }, + "authors":[ + { "name": "Mike van Riel", "email": "mike.vanriel@naenius.com" } + ], + "require":{ + "php": ">=5.3.3", + "pimple/pimple": "~1.0", + "symfony/process": "~2.1", + "symfony/finder": "~2.1", + "cilex/console-service-provider": "1.*" + }, + "require-dev":{ + "symfony/validator": "~2.1", + "phpunit/phpunit": "3.7.*" + }, + "suggest":{ + "monolog/monolog": ">=1.0.0", + "symfony/yaml": ">=1.0.0", + "symfony/validator": ">=1.0.0" + }, + "extra":{ + "branch-alias": { "dev-master": "1.0-dev" } + } +} diff --git a/vendor/cilex/cilex/composer.lock b/vendor/cilex/cilex/composer.lock new file mode 100644 index 0000000000..821cfe5280 --- /dev/null +++ b/vendor/cilex/cilex/composer.lock @@ -0,0 +1,884 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file" + ], + "hash": "028ed7b39a4c2a5ccba9e34589868ee4", + "packages": [ + { + "name": "cilex/console-service-provider", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/Cilex/console-service-provider.git", + "reference": "1.0.0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Cilex/console-service-provider/zipball/1.0.0", + "reference": "1.0.0", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "pimple/pimple": "1.*@dev", + "symfony/console": "~2.1" + }, + "require-dev": { + "cilex/cilex": "1.*@dev", + "silex/silex": "1.*@dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-0": { + "Cilex\\Provider\\Console": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Mike van Riel", + "email": "mike.vanriel@naenius.com" + } + ], + "description": "Console Service Provider", + "keywords": [ + "cilex", + "console", + "pimple", + "service-provider", + "silex" + ], + "time": "2012-12-19 10:50:58" + }, + { + "name": "pimple/pimple", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/fabpot/Pimple.git", + "reference": "2019c145fe393923f3441b23f29bbdfaa5c58c4d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fabpot/Pimple/zipball/2019c145fe393923f3441b23f29bbdfaa5c58c4d", + "reference": "2019c145fe393923f3441b23f29bbdfaa5c58c4d", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-0": { + "Pimple": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + } + ], + "description": "Pimple is a simple Dependency Injection Container for PHP 5.3", + "homepage": "http://pimple.sensiolabs.org", + "keywords": [ + "container", + "dependency injection" + ], + "time": "2013-11-22 08:30:29" + }, + { + "name": "symfony/console", + "version": "v2.4.2", + "target-dir": "Symfony/Component/Console", + "source": { + "type": "git", + "url": "https://github.com/symfony/Console.git", + "reference": "940f217cbc3c8a33e5403e7c595495c4884400fe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Console/zipball/940f217cbc3c8a33e5403e7c595495c4884400fe", + "reference": "940f217cbc3c8a33e5403e7c595495c4884400fe", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "symfony/event-dispatcher": "~2.1" + }, + "suggest": { + "symfony/event-dispatcher": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Console\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "http://symfony.com", + "time": "2014-02-11 13:52:09" + }, + { + "name": "symfony/finder", + "version": "v2.4.2", + "target-dir": "Symfony/Component/Finder", + "source": { + "type": "git", + "url": "https://github.com/symfony/Finder.git", + "reference": "b6735d1fc16da13c4c7dddfe78366a4a098cf011" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Finder/zipball/b6735d1fc16da13c4c7dddfe78366a4a098cf011", + "reference": "b6735d1fc16da13c4c7dddfe78366a4a098cf011", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Finder\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "http://symfony.com", + "time": "2014-01-07 13:28:54" + }, + { + "name": "symfony/process", + "version": "v2.4.2", + "target-dir": "Symfony/Component/Process", + "source": { + "type": "git", + "url": "https://github.com/symfony/Process.git", + "reference": "c175448bac997556f8ab972908a4e14c7291fb03" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Process/zipball/c175448bac997556f8ab972908a4e14c7291fb03", + "reference": "c175448bac997556f8ab972908a4e14c7291fb03", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Process\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "http://symfony.com", + "time": "2014-02-11 13:52:09" + } + ], + "packages-dev": [ + { + "name": "phpunit/php-code-coverage", + "version": "1.2.17", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "6ef2bf3a1c47eca07ea95f0d8a902a6340390b34" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/6ef2bf3a1c47eca07ea95f0d8a902a6340390b34", + "reference": "6ef2bf3a1c47eca07ea95f0d8a902a6340390b34", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "phpunit/php-file-iterator": ">=1.3.0@stable", + "phpunit/php-text-template": ">=1.2.0@stable", + "phpunit/php-token-stream": ">=1.1.3@stable" + }, + "require-dev": { + "phpunit/phpunit": "3.7.*@dev" + }, + "suggest": { + "ext-dom": "*", + "ext-xdebug": ">=2.0.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "PHP/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.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": "2014-03-28 10:53:45" + }, + { + "name": "phpunit/php-file-iterator", + "version": "1.3.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/acd690379117b042d1c8af1fafd61bde001bf6bb", + "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "File/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "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": "2013-10-10 15:34:57" + }, + { + "name": "phpunit/php-text-template", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/206dfefc0ffe9cebf65c413e3d0e809c82fbf00a", + "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "Text/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "time": "2014-01-30 17:20:04" + }, + { + "name": "phpunit/php-timer", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/19689d4354b295ee3d8c54b4f42c3efb69cbc17c", + "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "PHP/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "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": "2013-08-02 07:42:54" + }, + { + "name": "phpunit/php-token-stream", + "version": "1.2.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "ad4e1e23ae01b483c16f600ff1bebec184588e32" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/ad4e1e23ae01b483c16f600ff1bebec184588e32", + "reference": "ad4e1e23ae01b483c16f600ff1bebec184588e32", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "classmap": [ + "PHP/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": [ + "tokenizer" + ], + "time": "2014-03-03 05:10:30" + }, + { + "name": "phpunit/phpunit", + "version": "3.7.34", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "248d6ce95e6ca7f0e3135252c0b984bbe1f52f19" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/248d6ce95e6ca7f0e3135252c0b984bbe1f52f19", + "reference": "248d6ce95e6ca7f0e3135252c0b984bbe1f52f19", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "php": ">=5.3.3", + "phpunit/php-code-coverage": "~1.2", + "phpunit/php-file-iterator": "~1.3", + "phpunit/php-text-template": "~1.1", + "phpunit/php-timer": "~1.0", + "phpunit/phpunit-mock-objects": "~1.2", + "symfony/yaml": "~2.0" + }, + "require-dev": { + "pear-pear.php.net/pear": "1.9.4" + }, + "suggest": { + "ext-json": "*", + "ext-simplexml": "*", + "ext-tokenizer": "*", + "phpunit/php-invoker": "~1.1" + }, + "bin": [ + "composer/bin/phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.7.x-dev" + } + }, + "autoload": { + "classmap": [ + "PHPUnit/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "", + "../../symfony/yaml/" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "http://www.phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "time": "2014-03-28 11:04:36" + }, + { + "name": "phpunit/phpunit-mock-objects", + "version": "1.2.3", + "source": { + "type": "git", + "url": "git://github.com/sebastianbergmann/phpunit-mock-objects.git", + "reference": "1.2.3" + }, + "dist": { + "type": "zip", + "url": "https://github.com/sebastianbergmann/phpunit-mock-objects/archive/1.2.3.zip", + "reference": "1.2.3", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "phpunit/php-text-template": ">=1.1.1@stable" + }, + "suggest": { + "ext-soap": "*" + }, + "type": "library", + "autoload": { + "classmap": [ + "PHPUnit/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Mock Object library for PHPUnit", + "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", + "keywords": [ + "mock", + "xunit" + ], + "time": "2013-01-13 10:24:48" + }, + { + "name": "symfony/property-access", + "version": "v2.4.2", + "target-dir": "Symfony/Component/PropertyAccess", + "source": { + "type": "git", + "url": "https://github.com/symfony/PropertyAccess.git", + "reference": "37fe0c2dc494b47db4b0850e9dcba3a27cc45c0c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/PropertyAccess/zipball/37fe0c2dc494b47db4b0850e9dcba3a27cc45c0c", + "reference": "37fe0c2dc494b47db4b0850e9dcba3a27cc45c0c", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\PropertyAccess\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony PropertyAccess Component", + "homepage": "http://symfony.com", + "keywords": [ + "access", + "array", + "extraction", + "index", + "injection", + "object", + "property", + "property path", + "reflection" + ], + "time": "2014-02-11 15:39:28" + }, + { + "name": "symfony/translation", + "version": "v2.4.2", + "target-dir": "Symfony/Component/Translation", + "source": { + "type": "git", + "url": "https://github.com/symfony/Translation.git", + "reference": "b00fd07417e493e08488e87bcebeb9681fc7323b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Translation/zipball/b00fd07417e493e08488e87bcebeb9681fc7323b", + "reference": "b00fd07417e493e08488e87bcebeb9681fc7323b", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "symfony/config": "~2.0", + "symfony/yaml": "~2.2" + }, + "suggest": { + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Translation Component", + "homepage": "http://symfony.com", + "time": "2014-02-03 17:15:33" + }, + { + "name": "symfony/validator", + "version": "v2.4.2", + "target-dir": "Symfony/Component/Validator", + "source": { + "type": "git", + "url": "https://github.com/symfony/Validator.git", + "reference": "64d7a54f97a5f53a98864a7461822e341f9416b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Validator/zipball/64d7a54f97a5f53a98864a7461822e341f9416b5", + "reference": "64d7a54f97a5f53a98864a7461822e341f9416b5", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/property-access": "~2.2", + "symfony/translation": "~2.0" + }, + "require-dev": { + "doctrine/annotations": "~1.0", + "doctrine/cache": "~1.0", + "symfony/config": "~2.2", + "symfony/http-foundation": "~2.1", + "symfony/intl": "~2.3", + "symfony/yaml": "~2.0" + }, + "suggest": { + "doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.", + "doctrine/cache": "For using the default cached annotation reader", + "symfony/config": "", + "symfony/http-foundation": "", + "symfony/intl": "", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Validator\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Validator Component", + "homepage": "http://symfony.com", + "time": "2014-02-11 13:52:09" + }, + { + "name": "symfony/yaml", + "version": "v2.4.2", + "target-dir": "Symfony/Component/Yaml", + "source": { + "type": "git", + "url": "https://github.com/symfony/Yaml.git", + "reference": "bb6ddaf8956139d1b8c360b4b713ed0138e876b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Yaml/zipball/bb6ddaf8956139d1b8c360b4b713ed0138e876b3", + "reference": "bb6ddaf8956139d1b8c360b4b713ed0138e876b3", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Yaml\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "http://symfony.com", + "time": "2014-01-07 13:28:54" + } + ], + "aliases": [ + + ], + "minimum-stability": "stable", + "stability-flags": [ + + ], + "platform": { + "php": ">=5.3.3" + }, + "platform-dev": [ + + ] +} diff --git a/vendor/cilex/cilex/docs/.static/logo.png b/vendor/cilex/cilex/docs/.static/logo.png new file mode 100644 index 0000000000..443cb8d5ab Binary files /dev/null and b/vendor/cilex/cilex/docs/.static/logo.png differ diff --git a/vendor/cilex/cilex/docs/Makefile b/vendor/cilex/cilex/docs/Makefile new file mode 100644 index 0000000000..9e187682c7 --- /dev/null +++ b/vendor/cilex/cilex/docs/Makefile @@ -0,0 +1,153 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = .build + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + -rm -rf $(BUILDDIR)/* + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Cilex.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Cilex.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/Cilex" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Cilex" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." diff --git a/vendor/cilex/cilex/docs/conf.py b/vendor/cilex/cilex/docs/conf.py new file mode 100644 index 0000000000..1b7d77f137 --- /dev/null +++ b/vendor/cilex/cilex/docs/conf.py @@ -0,0 +1,45 @@ +import sys, os + +templates_path = ['.templates'] +source_suffix = '.rst' +master_doc = 'index' +project = u'Cilex' +copyright = u'2013, Mike van Riel' + +version = '1.0' +release = '1.0.0-alpha1' +pygments_style = 'sphinx' + +html_theme = 'agogo' +html_static_path = ['.static'] +htmlhelp_basename = 'Cilexdoc' + +# -- Options for LaTeX output -------------------------------------------------- + +latex_elements = { + 'papersize': 'a4paper', + 'pointsize': '10pt', +} + +# (source start file, target name, title, author, documentclass [howto/manual]). +latex_documents = [ + ('index', 'Cilex.tex', u'Cilex Documentation', u'Mike van Riel', 'manual'), +] + +latex_logo = '.static/logo.png' + +# -- Options for manual page output -------------------------------------------- + +# (source start file, name, description, authors, manual section). +man_pages = [ + ('index', 'cilex', u'Cilex Documentation', [u'Mike van Riel'], 1) +] + +# -- Options for Texinfo output ------------------------------------------------ + +# (source start file, target name, title, author, dir menu entry, description, +# category) +texinfo_documents = [ + ('index', 'Cilex', u'Cilex Documentation', u'Mike van Riel', 'Cilex', 'One line description of project.', + 'Miscellaneous'), +] \ No newline at end of file diff --git a/vendor/cilex/cilex/docs/index.rst b/vendor/cilex/cilex/docs/index.rst new file mode 100644 index 0000000000..9f0518a999 --- /dev/null +++ b/vendor/cilex/cilex/docs/index.rst @@ -0,0 +1,9 @@ +Cilex' documentation +==================== + +Contents: + +.. toctree:: + :maxdepth: 2 + + usage \ No newline at end of file diff --git a/vendor/cilex/cilex/docs/usage.rst b/vendor/cilex/cilex/docs/usage.rst new file mode 100644 index 0000000000..5b1b0705af --- /dev/null +++ b/vendor/cilex/cilex/docs/usage.rst @@ -0,0 +1,82 @@ +Usage +===== + +Installation +------------ + +The easiest way to get started is to use Composer_ using the following steps: + +1. Create a file name ``composer.json`` with the following contents: + + .. code-block:: json + + { + "require": { + "cilex/cilex": "1.0.*@dev" + } + } + +2. Download Composer_ and install the project + + .. code-block:: bash + + $ curl -s http://getcomposer.org/installer | php + $ php composer.phar install + +Upgrading +--------- + +Cilex can be upgraded using Composer_ by calling the update command: + + .. code-block:: bash + + $ php composer.phar update + +Bootstrap +--------- + +The simplest example of a Cilex application is by including the autoloader, instantiating the Cilex application class +and calling the ``run`` method. The following example demonstrates this principle: + +.. code-block:: php + + run(); + +Calling your new application is as simple as the following line: + +.. code-block:: bash + + $ php application.php + +Even without actual commands you are greeted with an informative description what to do next: + +.. code-block:: bash + + NameOfMyApplication version + + Usage: + [options] command [arguments] + + Options: + --help -h Display this help message. + --quiet -q Do not output any message. + --verbose -v Increase verbosity of messages. + --version -V Display this application version. + --ansi Force ANSI output. + --no-ansi Disable ANSI output. + --no-interaction -n Do not ask any interactive question. + + Available commands: + help Displays help for a command + list Lists commands + +.. _Composer: http://getcomposer.org diff --git a/vendor/cilex/cilex/example.php b/vendor/cilex/cilex/example.php new file mode 100644 index 0000000000..98ab3c4d2c --- /dev/null +++ b/vendor/cilex/cilex/example.php @@ -0,0 +1,6 @@ +command(new \Cilex\Command\GreetCommand()); +$app->run(); \ No newline at end of file diff --git a/vendor/cilex/cilex/phpunit.xml.dist b/vendor/cilex/cilex/phpunit.xml.dist new file mode 100644 index 0000000000..fd6bc9ae82 --- /dev/null +++ b/vendor/cilex/cilex/phpunit.xml.dist @@ -0,0 +1,19 @@ + + + + + + ./tests/Cilex/ + + + \ No newline at end of file diff --git a/vendor/cilex/cilex/src/Cilex/Application.php b/vendor/cilex/cilex/src/Cilex/Application.php new file mode 100644 index 0000000000..f78bed8e86 --- /dev/null +++ b/vendor/cilex/cilex/src/Cilex/Application.php @@ -0,0 +1,111 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Cilex; + +use \Symfony\Component\Console; +use \Cilex\Provider\Console\ConsoleServiceProvider; + +/** + * The Cilex framework class. + * + * @author Mike van Riel + * + * @api + */ +class Application extends \Pimple +{ + /** + * Version number for Cilex + */ + const VERSION = '1.0.0'; + + /** + * Registers the autoloader and necessary components. + * + * @param string $name Name for this application. + * @param string|null $version Version number for this application. + */ + public function __construct($name, $version = null, array $values = array()) + { + parent::__construct(); + + $consoleConfig = array('console.name' => $name); + if (null !== $version) { + $consoleConfig['console.version'] = $version; + } + $this->register(new ConsoleServiceProvider(), $consoleConfig); + + foreach ($values as $key => $value) { + $this[$key] = $value; + } + } + + /** + * Executes this application. + * + * @param bool $interactive runs in an interactive shell if true. + * + * @return void + */ + public function run($interactive = false) + { + $app = $this['console']; + if ($interactive) { + $app = new Console\Shell($app); + } + + $app->run(); + } + + /** + * Adds a command object. + * + * If a command with the same name already exists, it will be overridden. + * + * @param \Cilex\Command\Command $command A Command object + * + * @api + * + * @return void + */ + public function command(Console\Command\Command $command) + { + $this['console']->add($command); + } + + /** + * Registers a service provider. + * + * @param \Cilex\ServiceProviderInterface|\Silex\ServiceProviderInterface $provider + * A ServiceProviderInterface instance + * @param mixed[] $values + * An array of values that customizes the provider + * + * @return void + */ + public function register($provider, array $values = array()) + { + if ((!$provider instanceof \Cilex\ServiceProviderInterface) + && (!$provider instanceof \Silex\ServiceProviderInterface) + ) { + throw new \InvalidArgumentException( + 'Extensions should implement either Cilex or Silex\' ServiceProviderInterface' + ); + } + + $provider->register($this); + + foreach ($values as $key => $value) { + $this[$key] = $value; + } + } +} diff --git a/vendor/cilex/cilex/src/Cilex/Command/Command.php b/vendor/cilex/cilex/src/Cilex/Command/Command.php new file mode 100644 index 0000000000..c5fef0bbec --- /dev/null +++ b/vendor/cilex/cilex/src/Cilex/Command/Command.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 Cilex\Command; + +use \Symfony\Component\Console; + +/** + * Base class for Cilex commands. + * + * @author Mike van Riel + * + * @api + */ +abstract class Command extends Console\Command\Command +{ + /** + * Returns the application container. + * + * @return \Cilex\Application + */ + public function getContainer() + { + return $this->getApplication()->getContainer(); + } + + /** + * Returns a service contained in the application container or null if none + * is found with that name. + * + * This is a convenience method used to retrieve an element from the + * Application container without having to assign the results of the + * getContainer() method in every call. + * + * @param string $name Name of the service + * + * @see self::getContainer() + * + * @api + * + * @return \stdClass|null + */ + public function getService($name) + { + return $this->getApplication()->getService($name); + } +} diff --git a/vendor/cilex/cilex/src/Cilex/Command/DemoInfoCommand.php b/vendor/cilex/cilex/src/Cilex/Command/DemoInfoCommand.php new file mode 100644 index 0000000000..4c88ac1361 --- /dev/null +++ b/vendor/cilex/cilex/src/Cilex/Command/DemoInfoCommand.php @@ -0,0 +1,41 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Cilex\Command; + +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Command\Command as BaseCommand; + +/** + * Example command for testing purposes. + */ +class DemoInfoCommand extends BaseCommand +{ + protected function configure() + { + $this + ->setName('demo:info') + ->setDescription('Get Application Information'); + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + // This is a contrived example to show accessing services + // from the container without needing the command itself + // to extend from anything but Symfony Console's base Command. + + $app = $this->getApplication()->getService('console'); + + $output->writeln('Name: ' . $app->getName()); + $output->writeln('Version: ' . $app->getVersion()); + } +} diff --git a/vendor/cilex/cilex/src/Cilex/Command/GreetCommand.php b/vendor/cilex/cilex/src/Cilex/Command/GreetCommand.php new file mode 100644 index 0000000000..b7d8587a75 --- /dev/null +++ b/vendor/cilex/cilex/src/Cilex/Command/GreetCommand.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Cilex\Command; + +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\OutputInterface; + +/** + * Example command for testing purposes. + */ +class GreetCommand extends Command +{ + protected function configure() + { + $this + ->setName('demo:greet') + ->setDescription('Greet someone') + ->addArgument('name', InputArgument::OPTIONAL, 'Who do you want to greet?') + ->addOption('yell', null, InputOption::VALUE_NONE, 'If set, the task will yell in uppercase letters'); + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + $text = 'Hello'; + $name = $input->getArgument('name'); + if ($name) { + $text .= ' '.$name; + } + + if ($input->getOption('yell')) { + $text = strtoupper($text); + } + + $output->writeln($text); + } +} diff --git a/vendor/cilex/cilex/src/Cilex/Compiler.php b/vendor/cilex/cilex/src/Cilex/Compiler.php new file mode 100644 index 0000000000..259325ba6c --- /dev/null +++ b/vendor/cilex/cilex/src/Cilex/Compiler.php @@ -0,0 +1,184 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Cilex; + +use Symfony\Component\Finder\Finder; +use Symfony\Component\Process\Process; + +/** + * The Compiler class compiles the Cilex framework. + * + * This is an adapted version of the Silex\Compiler class. + * + * @author Fabien Potencier + * @author Mike van Riel + */ +class Compiler +{ + protected $version; + + /** + * Compiles the Cilex source code into one single Phar file. + * + * @param string $pharFile Name of the output Phar file + */ + public function compile($pharFile = 'cilex.phar') + { + if (file_exists($pharFile)) { + unlink($pharFile); + } + + $process = new Process('git log --pretty="%h %ci" -n1 HEAD'); + if ($process->run() > 0) { + throw new \RuntimeException('The git binary cannot be found.'); + } + $this->version = trim($process->getOutput()); + + $phar = new \Phar($pharFile, 0, 'cilex.phar'); + $phar->setSignatureAlgorithm(\Phar::SHA1); + + $phar->startBuffering(); + + $finder = new Finder(); + $finder->files() + ->ignoreVCS(true) + ->name('*.php') + ->notName('Compiler.php') + ->in(__DIR__.'/..') + ->in(__DIR__.'/../../vendor/pimple/pimple/lib') + ->in(__DIR__.'/../../vendor/cilex/console-service-provider') + ->in(__DIR__.'/../../vendor/symfony/console/Symfony/Component/Console'); + + foreach ($finder as $file) { + $this->addFile($phar, $file); + } + + $this->addFile($phar, new \SplFileInfo(__DIR__.'/../../LICENSE'), false); + + $this->addFile($phar, new \SplFileInfo(__DIR__.'/../../vendor/autoload.php')); + $this->addFile($phar, new \SplFileInfo(__DIR__.'/../../vendor/composer/ClassLoader.php')); + $this->addFile($phar, new \SplFileInfo(__DIR__.'/../../vendor/composer/autoload_real.php')); + $this->addFile($phar, new \SplFileInfo(__DIR__.'/../../vendor/composer/autoload_namespaces.php')); + $this->addFile($phar, new \SplFileInfo(__DIR__.'/../../vendor/composer/autoload_classmap.php')); + + // Stubs + $phar->setStub($this->getStub()); + + $phar->stopBuffering(); + + // $phar->compressFiles(\Phar::GZ); + + unset($phar); + } + + protected function addFile(\Phar $phar, \splFileInfo $file, $strip = true) + { + $path = str_replace(dirname(dirname(__DIR__)).DIRECTORY_SEPARATOR, '', $file->getRealPath()); + + $content = file_get_contents($file); + if ($strip) { + $content = self::stripWhitespace($content); + } + $content = str_replace('@package_version@', $this->version, $content); + + $phar->addFromString($path, $content); + } + + protected function getStub() + { + return <<<'EOF' + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +Phar::mapPhar('cilex.phar'); + +require_once 'phar://cilex.phar/vendor/autoload.php'; + +if ('cli' === php_sapi_name() && basename(__FILE__) === basename($_SERVER['argv'][0]) && isset($_SERVER['argv'][1])) { + switch ($_SERVER['argv'][1]) { + case 'update': + $remoteFilename = 'http://cilex.github.com/get/cilex.phar'; + $localFilename = __DIR__.'/cilex.phar'; + + file_put_contents($localFilename, file_get_contents($remoteFilename)); + break; + + case 'check': + $latest = trim(file_get_contents('http://cilex.github.com/get/version')); + + if ($latest != Cilex\Application::VERSION) { + printf("A newer Cilex version is available (%s).\n", $latest); + } else { + print("You are using the latest Cilex version.\n"); + } + break; + + case 'version': + printf("Cilex version %s\n", Cilex\Application::VERSION); + break; + + default: + printf("Unknown command '%s' (available commands: version, check, and update).\n", $_SERVER['argv'][1]); + } + + exit(0); +} + +__HALT_COMPILER(); +EOF; + } + + /** + * Removes whitespace from a PHP source string while preserving line numbers. + * + * Based on Kernel::stripComments(), but keeps line numbers intact. + * + * @param string $source A PHP string + * + * @return string The PHP string with the whitespace removed + */ + public static function stripWhitespace($source) + { + if (!function_exists('token_get_all')) { + return $source; + } + + $output = ''; + foreach (token_get_all($source) as $token) { + if (is_string($token)) { + $output .= $token; + } elseif (in_array($token[0], array(T_COMMENT, T_DOC_COMMENT))) { + $output .= str_repeat("\n", substr_count($token[1], "\n")); + } elseif (T_WHITESPACE === $token[0]) { + // reduce wide spaces + $whitespace = preg_replace('{[ \t]+}', ' ', $token[1]); + // normalize newlines to \n + $whitespace = preg_replace('{(?:\r\n|\r|\n)}', "\n", $whitespace); + // trim leading spaces + $whitespace = preg_replace('{\n +}', "\n", $whitespace); + $output .= $whitespace; + } else { + $output .= $token[1]; + } + } + + return $output; + } +} diff --git a/vendor/cilex/cilex/src/Cilex/Provider/ConfigServiceProvider.php b/vendor/cilex/cilex/src/Cilex/Provider/ConfigServiceProvider.php new file mode 100644 index 0000000000..96a8376bc8 --- /dev/null +++ b/vendor/cilex/cilex/src/Cilex/Provider/ConfigServiceProvider.php @@ -0,0 +1,68 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Cilex\Provider; + +use Cilex\Application; +use Cilex\ServiceProviderInterface; +use Symfony\Component\Yaml; + +class ConfigServiceProvider implements ServiceProviderInterface +{ + public function register(Application $app) + { + $app['config'] = $app->share( + function () use ($app) { + if (!file_exists($app['config.path'])) { + throw new \InvalidArgumentException( + $app['config.path'] . ' is not a valid path to the ' + .'configuration' + ); + } + + $fullpath = explode('.', $app['config.path']); + + switch (strtolower(end($fullpath))) { + case 'php': + $result = include($app['config.path']); + break; + case 'yml': + $parser = new Yaml\Parser(); + $result = new \ArrayObject( + $parser->parse(file_get_contents($app['config.path'])) + ); + break; + case 'xml': + $result = simplexml_load_file($app['config.path']); + break; + case 'json': + $result = json_decode(file_get_contents($app['config.path'])); + + if (null == $result) { + + throw new \InvalidArgumentException( + 'Unable to decode the configuration file: ' . $app['config.path'] + ); + } + break; + default: + throw new \InvalidArgumentException( + 'Unable to load configuration; the provided file extension was not recognized. ' + .'Only yml, xml or json allowed' + ); + break; + } + + return $result; + } + ); + } +} diff --git a/vendor/cilex/cilex/src/Cilex/Provider/DoctrineServiceProvider.php b/vendor/cilex/cilex/src/Cilex/Provider/DoctrineServiceProvider.php new file mode 100644 index 0000000000..c1cb20edc9 --- /dev/null +++ b/vendor/cilex/cilex/src/Cilex/Provider/DoctrineServiceProvider.php @@ -0,0 +1,148 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Cilex\Provider; + +use Cilex\Application; +use Cilex\ServiceProviderInterface; +use Doctrine\DBAL\DriverManager; +use Doctrine\DBAL\Configuration; +use Doctrine\Common\EventManager; + +/** + * Doctrine DBAL Provider. + * + * This Service Provider is an adaptation of the DoctrineServiceProvider for + * Silex written by Fabien Potencier. + * + * @author Fabien Potencier + * @author Mike van Riel + */ +class DoctrineServiceProvider implements ServiceProviderInterface +{ + public function register(Application $app) + { + $app['db.default_options'] = array( + 'driver' => 'pdo_mysql', + 'dbname' => null, + 'host' => 'localhost', + 'user' => 'root', + 'password' => null, + ); + + $app['dbs.options.initializer'] = $app->protect( + function () use ($app) { + static $initialized = false; + + if ($initialized) { + return; + } + + $initialized = true; + + if (!isset($app['dbs.options'])) { + $app['dbs.options'] = array('default' => isset($app['db.options']) ? $app['db.options'] : array()); + } + + $tmp = $app['dbs.options']; + foreach ($tmp as $name => &$options) { + $options = array_replace($app['db.default_options'], $options); + + if (!isset($app['dbs.default'])) { + $app['dbs.default'] = $name; + } + } + $app['dbs.options'] = $tmp; + } + ); + + $app['dbs'] = $app->share( + function () use ($app) { + $app['dbs.options.initializer'](); + + $dbs = new \Pimple(); + foreach ($app['dbs.options'] as $name => $options) { + if ($app['dbs.default'] === $name) { + // we use shortcuts here in case the default has been overriden + $config = $app['db.config']; + $manager = $app['db.event_manager']; + } else { + $config = $app['dbs.config'][$name]; + $manager = $app['dbs.event_manager'][$name]; + } + + $dbs[$name] = DriverManager::getConnection($options, $config, $manager); + } + + return $dbs; + } + ); + + $app['dbs.config'] = $app->share( + function () use ($app) { + $app['dbs.options.initializer'](); + + $configs = new \Pimple(); + foreach ($app['dbs.options'] as $name => $options) { + $configs[$name] = new Configuration(); + } + + return $configs; + } + ); + + $app['dbs.event_manager'] = $app->share( + function () use ($app) { + $app['dbs.options.initializer'](); + + $managers = new \Pimple(); + foreach ($app['dbs.options'] as $name => $options) { + $managers[$name] = new EventManager(); + } + + return $managers; + } + ); + + // shortcuts for the "first" DB + $app['db'] = $app->share( + function () use ($app) { + $dbs = $app['dbs']; + + return $dbs[$app['dbs.default']]; + } + ); + + $app['db.config'] = $app->share( + function () use ($app) { + $dbs = $app['dbs.config']; + + return $dbs[$app['dbs.default']]; + } + ); + + $app['db.event_manager'] = $app->share( + function () use ($app) { + $dbs = $app['dbs.event_manager']; + + return $dbs[$app['dbs.default']]; + } + ); + + if (isset($app['db.dbal.class_path'])) { + $app['autoloader']->registerNamespace('Doctrine\\DBAL', $app['db.dbal.class_path']); + } + + if (isset($app['db.common.class_path'])) { + $app['autoloader']->registerNamespace('Doctrine\\Common', $app['db.common.class_path']); + } + } +} diff --git a/vendor/cilex/cilex/src/Cilex/Provider/MonologServiceProvider.php b/vendor/cilex/cilex/src/Cilex/Provider/MonologServiceProvider.php new file mode 100644 index 0000000000..2ece7a936d --- /dev/null +++ b/vendor/cilex/cilex/src/Cilex/Provider/MonologServiceProvider.php @@ -0,0 +1,62 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Cilex\Provider; + +use Monolog\Logger; +use Monolog\Handler\StreamHandler; + +use Cilex\Application; +use Cilex\ServiceProviderInterface; + +/** + * Monolog Provider. + * + * This class is an adaptation of the Silex MonologServiceProvider written by + * Fabien Potencier. + * + * @author Fabien Potencier + * @author Mike van Riel + */ +class MonologServiceProvider implements ServiceProviderInterface +{ + public function register(Application $app) + { + $app['monolog'] = $app->share( + function () use ($app) { + $log = new Logger(isset($app['monolog.name']) ? $app['monolog.name'] : 'myapp'); + $app['monolog.configure']($log); + + return $log; + } + ); + + $app['monolog.configure'] = $app->protect( + function ($log) use ($app) { + $log->pushHandler($app['monolog.handler']); + } + ); + + $app['monolog.handler'] = function () use ($app) { + return new StreamHandler($app['monolog.logfile'], $app['monolog.level']); + }; + + if (!isset($app['monolog.level'])) { + $app['monolog.level'] = function () { + return Logger::DEBUG; + }; + } + + if (isset($app['monolog.class_path'])) { + $app['autoloader']->registerNamespace('Monolog', $app['monolog.class_path']); + } + } +} diff --git a/vendor/cilex/cilex/src/Cilex/Provider/ValidatorServiceProvider.php b/vendor/cilex/cilex/src/Cilex/Provider/ValidatorServiceProvider.php new file mode 100644 index 0000000000..66ae633d66 --- /dev/null +++ b/vendor/cilex/cilex/src/Cilex/Provider/ValidatorServiceProvider.php @@ -0,0 +1,72 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Cilex\Provider; + +use Cilex\Application; +use Cilex\ServiceProviderInterface; + +use Symfony\Component\Validator\Validator; +use Symfony\Component\Validator\Mapping\ClassMetadataFactory; +use Symfony\Component\Validator\Mapping\Loader\StaticMethodLoader; +use Symfony\Component\Validator\ConstraintValidatorFactory; +use Symfony\Component\Validator\DefaultTranslator; + +/** + * Symfony Validator component Provider. + * + * This class is an adaptation of the Silex MonologServiceProvider written by + * Fabien Potencier. + * + * @author Fabien Potencier + * @author Mike van Riel + */ +class ValidatorServiceProvider implements ServiceProviderInterface +{ + public function register(Application $app) + { + $app['validator'] = $app->share( + function () use ($app) { + return new Validator( + $app['validator.mapping.class_metadata_factory'], + $app['validator.validator_factory'], + $app['validator.default_translator'] + ); + } + ); + + $app['validator.mapping.class_metadata_factory'] = $app->share( + function () use ($app) { + return new ClassMetadataFactory(new StaticMethodLoader()); + } + ); + + $app['validator.validator_factory'] = $app->share( + function () { + return new ConstraintValidatorFactory(); + } + ); + + $app['validator.default_translator'] = $app->share( + function () { + if (!class_exists('Symfony\\Component\\Validator\\DefaultTranslator')){ + return array(); + } + + return new DefaultTranslator(); + } + ); + + if (isset($app['validator.class_path'])) { + $app['autoloader']->registerNamespace('Symfony\\Component\\Validator', $app['validator.class_path']); + } + } +} diff --git a/vendor/cilex/cilex/src/Cilex/ServiceProviderInterface.php b/vendor/cilex/cilex/src/Cilex/ServiceProviderInterface.php new file mode 100644 index 0000000000..8136df86ee --- /dev/null +++ b/vendor/cilex/cilex/src/Cilex/ServiceProviderInterface.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 Cilex; + +/** + * Interface that must implement all Cilex service providers. + * + * @author Mike van Riel + */ +interface ServiceProviderInterface +{ + /** + * Registers services on the given app. + * + * @param Application $app An Application instance + */ + public function register(Application $app); +} diff --git a/vendor/cilex/cilex/tests/Cilex/Tests/ApplicationTest.php b/vendor/cilex/cilex/tests/Cilex/Tests/ApplicationTest.php new file mode 100644 index 0000000000..d25a0cbea4 --- /dev/null +++ b/vendor/cilex/cilex/tests/Cilex/Tests/ApplicationTest.php @@ -0,0 +1,99 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Cilex\Tests; + +use \Cilex\Application; + +/** + * Mock class used to test the register method. + */ +class ServiceProviderMock implements \Cilex\ServiceProviderInterface +{ + /** + * Mock method to satisfy interface + * + * @param \Cilex\Application $app + * + * @return void + */ + function register(\Cilex\Application $app) + { + $app['mock.param'] = false; + $app['mock'] = $this; + } +} + +/** + * Application test cases. + * + * @author Mike van Riel + */ +class ApplicationTest extends \PHPUnit_Framework_TestCase +{ + const NAME = 'Test'; + const VERSION = '1.0.1'; + + /** @var \Cilex\Application */ + protected $fixture = null; + + /** + * Sets up the test fixture. + */ + public function setUp() + { + $this->fixture = new Application(self::NAME, self::VERSION); + } + + /** + * Tests whether the constructor instantiates the correct dependencies and + * correctly sets the name on the Console's Application. + */ + public function testConstruct() + { + $this->assertInstanceOf( + '\\Symfony\\Component\\Console\\Application', + $this->fixture['console'] + ); + + $this->assertEquals(self::NAME, $this->fixture['console']->getName()); + $this->assertEquals(self::VERSION, $this->fixture['console']->getVersion()); + } + + /** + * Tests the command method to see if the command is properly set and the + * Cilex application is added as container. + */ + public function testCommand() + { + $this->assertFalse($this->fixture['console']->has('demo:greet')); + $this->fixture->command(new \Cilex\Command\GreetCommand()); + $this->assertTrue($this->fixture['console']->has('demo:greet')); + + $this->assertSame( + $this->fixture, + $this->fixture['console']->get('demo:greet')->getContainer() + ); + } + + /** + * Tests whether the register method applies the provided parameters to this + * application and correctly registers the ServiceProvider. + */ + public function testRegister() + { + $provider = new ServiceProviderMock(); + $this->fixture->register($provider, array('mock.param' => true)); + + $this->assertTrue($this->fixture['mock.param']); + $this->assertSame($this->fixture['mock'], $provider); + } +} diff --git a/vendor/cilex/cilex/tests/Cilex/Tests/Command/CommandTest.php b/vendor/cilex/cilex/tests/Cilex/Tests/Command/CommandTest.php new file mode 100644 index 0000000000..970013d75a --- /dev/null +++ b/vendor/cilex/cilex/tests/Cilex/Tests/Command/CommandTest.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 Cilex\Tests\Command; + +use \Cilex\Command; + +class CommandMock extends Command\Command {} + +/** + * Command\Command test cases. + * + * @author Mike van Riel + */ +class CommandTest extends \PHPUnit_Framework_TestCase +{ + /** @var \Cilex\Command\Command */ + protected $fixture = null; + + /** + * Sets up the test fixture. + */ + public function setUp() + { + $this->fixture = new CommandMock('demo:test'); + } + + /** + * Tests the getContainer method. + */ + public function testContainer() + { + $app = new \Cilex\Application('Test'); + $app->command($this->fixture); + + $this->assertSame($app, $this->fixture->getContainer()); + } + + /** + * Tests whether the getService method correctly retrieves an element from + * the container. + */ + public function testGetService() + { + $app = new \Cilex\Application('Test'); + $app->command($this->fixture); + + $this->assertInstanceOf( + '\Symfony\Component\Console\Application', + $this->fixture->getService('console') + ); + } +} diff --git a/vendor/cilex/cilex/tests/Cilex/Tests/Provider/ConfigServerProviderTest.php b/vendor/cilex/cilex/tests/Cilex/Tests/Provider/ConfigServerProviderTest.php new file mode 100644 index 0000000000..9136ed177a --- /dev/null +++ b/vendor/cilex/cilex/tests/Cilex/Tests/Provider/ConfigServerProviderTest.php @@ -0,0 +1,136 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + * @author Ben Selby + */ + +namespace Cilex\Tests\Provider; + +use Cilex\Application; +use Cilex\Provider\ConfigServiceProvider; + +/** + * Test file for ConfigServiceProvider + * + * @author Ben Selby + */ +class ConfigServiceProviderTest extends \PHPUnit_Framework_TestCase +{ + /** + * Test that an exception is thrown if the config path is not present + * or valid + * + * @return void + */ + public function testRegisterWillThrowExceptionIfConfigPathIsNotThere() + { + $this->setExpectedException( + 'InvalidArgumentException', + __DIR__.'/../../../data/unknownfile is not a valid path to the configuration' + ); + + $app = new Application('Test'); + + $app->register( + new ConfigServiceProvider(), + array( + 'config.path' => __DIR__.'/../../../data/unknownfile' + ) + ); + + $config = $app['config']; + } + + /** + * Test that the config provider can parse a json + * configuration file + * + * @return void + */ + public function testRegisterCanParseAJsonConfigFile() + { + $app = new Application('Test'); + + $app->register( + new ConfigServiceProvider(), + array( + 'config.path' => __DIR__.'/../../../data/config.json' + ) + ); + + $config = $app['config']; + $this->assertEquals($config->key, 'value'); + } + + public function testCanParseAPhpConfigFile() + { + $app = new Application('Test'); + + $app->register( + new ConfigServiceProvider(), + array( + 'config.path' => __DIR__.'/../../../data/config.php' + ) + ); + $config = $app['config']; + $this->assertEquals($config['key'], 'value'); + } + + /** + * Test that the config provider can throw an exception if + * the json configuration file is invalid + * + * @return void + */ + public function testRegisterThrowsExceptionInCaseOfInvalidJsonConfigFile() + { + $configPath = __DIR__.'/../../../data/config-invalid.json'; + + $this->setExpectedException( + 'InvalidArgumentException', + 'Unable to decode the configuration file: ' . $configPath + ); + + $app = new Application('Test'); + + $app->register( + new ConfigServiceProvider(), + array( + 'config.path' => $configPath + ) + ); + + $config = $app['config']; + } + + /** + * Test that register will throw an exception if an unknown + * format is passed in + * + * @return void + */ + public function testRegisterThrowsExceptionIfAnUnknownFormatIsPassed() + { + $this->setExpectedException( + 'InvalidArgumentException', + 'Unable to load configuration; the provided file extension was not recognized. Only yml, xml or json allowed' + ); + + $app = new Application('Test'); + + $app->register( + new ConfigServiceProvider(), + array( + 'config.path' => __DIR__.'/../../../data/config.unknownfiletype' + ) + ); + + $config = $app['config']; + } +} diff --git a/vendor/cilex/cilex/tests/Cilex/Tests/Provider/ValidatorServiceProviderTest.php b/vendor/cilex/cilex/tests/Cilex/Tests/Provider/ValidatorServiceProviderTest.php new file mode 100644 index 0000000000..3172fa9298 --- /dev/null +++ b/vendor/cilex/cilex/tests/Cilex/Tests/Provider/ValidatorServiceProviderTest.php @@ -0,0 +1,52 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Cilex\Tests\Provider; + +use Cilex\Application; +use Cilex\Provider\ValidatorServiceProvider; + +/** + * ValidatorServiceProvider. + * + * Originally provided with the Silex Framework; test has been adapted for Cilex. + * + * @author Javier Lopez + * @author Mike van Riel + */ +class ValidatorServiceProviderTest extends \PHPUnit_Framework_TestCase +{ + public function setUp() + { + if (!is_dir(__DIR__.'/../../../../vendor/symfony/validator/Symfony/Component/Validator')) { + $this->markTestSkipped('Validator submodule was not installed.'); + } + } + + public function testRegister() + { + $app = new Application('Test'); + + $app->register(new ValidatorServiceProvider(), array( + 'validator.class_path' => __DIR__.'/../../../../vendor/Symfony/Component/Validator' + )); + + return $app; + } + + /** + * @depends testRegister + */ + public function testValidatorServiceIsAValidator($app) + { + $this->assertInstanceOf('Symfony\Component\Validator\Validator', $app['validator']); + } +} \ No newline at end of file diff --git a/vendor/cilex/cilex/tests/data/config-invalid.json b/vendor/cilex/cilex/tests/data/config-invalid.json new file mode 100644 index 0000000000..6d911dacc7 --- /dev/null +++ b/vendor/cilex/cilex/tests/data/config-invalid.json @@ -0,0 +1,4 @@ +{ + "key": "value" + "missing": "comma" +} \ No newline at end of file diff --git a/vendor/cilex/cilex/tests/data/config.json b/vendor/cilex/cilex/tests/data/config.json new file mode 100644 index 0000000000..a977d991bb --- /dev/null +++ b/vendor/cilex/cilex/tests/data/config.json @@ -0,0 +1,3 @@ +{ + "key": "value" +} \ No newline at end of file diff --git a/vendor/cilex/cilex/tests/data/config.php b/vendor/cilex/cilex/tests/data/config.php new file mode 100644 index 0000000000..7d6a69c12a --- /dev/null +++ b/vendor/cilex/cilex/tests/data/config.php @@ -0,0 +1,4 @@ + 'value' +); diff --git a/vendor/cilex/cilex/tests/data/config.unknownfiletype b/vendor/cilex/cilex/tests/data/config.unknownfiletype new file mode 100644 index 0000000000..e69de29bb2 diff --git a/vendor/cilex/console-service-provider/.gitignore b/vendor/cilex/console-service-provider/.gitignore new file mode 100644 index 0000000000..cb756e9ec8 --- /dev/null +++ b/vendor/cilex/console-service-provider/.gitignore @@ -0,0 +1,2 @@ +vendor +.idea \ No newline at end of file diff --git a/vendor/cilex/console-service-provider/README.md b/vendor/cilex/console-service-provider/README.md new file mode 100644 index 0000000000..9018cbb3b6 --- /dev/null +++ b/vendor/cilex/console-service-provider/README.md @@ -0,0 +1,163 @@ +Console Service Provider +======================== + +Provides [Console][symfony/console] as a service to [Pimple][pimple] applications. + + +Requirements +------------ + + * PHP 5.3+ + * Symfony Console ~2.1 + + + +Installation +------------ + +Through [Composer][composer] as [cilex/console-service-provider][cilex/console-service-provider]. + + +Usage +----- + +### Pimple + +```php +register($app); + +$app['console']->run(); +``` + + +### Silex + +To use the Console Service Provider in a Silex application register the +Console Service Provider Silex adapter. + +```php +register(new ConsoleServiceProvider(), array( + 'console.name' => 'MyApp', + 'console.version' => '1.0.5', +)); + +$app['console']->run(); +``` + +### Cilex + +The Console Service Provider is baked into the Cilex Application itself so +there is no need to register it manually. + +```php +run(); +``` + + +Configuration +------------- + +### Parameters + + * **console.name**: + Name for the console application. + * **console.version**: + Version for the console application. + * **console.class**: + Class for the console application to be created. + +### Services + + * **console**: + Console Application, instance `Symfony\Component\Console\Application`. + + +The Console Service Provider Application Class +---------------------------------------------- + +By default Console Service Provider will instantiate an instance of +`Cilex\Pimple\Provider\Console\Application`. + +### Methods + +#### getContainer() : \Pimple + +Returns the Pimple container. + +#### getService($name) : \stdClass|null + +Returns a service contained in the application container or null if none +is found with that name. Convenience method to avoid repeated calls to +`getContainer()` or having to assign the container. + + +Accessing the Container and Services from Commands +-------------------------------------------------- + +Here are some examples of accessing the Container and Services from a Command: + +```php +getApplication()->getContainer(); + + // Direct access to a service. + $service = $this->getApplication->getService('some.service'); + } +} +``` + + +Future +------ + +In the event that Pimple Service Providers become a reality, `ConsoleServiceProvider` +will implement the appropriate interface. As soon as Cilex and Silex become Pimple +Service Provider aware, their respective adapter classes can be bypassed and the +core `ConsoleServiceProvider` can be used directly. + + +License +------- + +MIT, see LICENSE. + + +[symfony/console]: http://symfony.com/doc/current/components/console/introduction.html +[pimple]: http://pimple.sensiolabs.org +[composer]: http://getcomposer.org +[cilex/console-service-provider]: https://packagist.org/packages/cilex/console-service-provider diff --git a/vendor/cilex/console-service-provider/composer.json b/vendor/cilex/console-service-provider/composer.json new file mode 100644 index 0000000000..5de9f6d21e --- /dev/null +++ b/vendor/cilex/console-service-provider/composer.json @@ -0,0 +1,27 @@ +{ + "name": "cilex/console-service-provider", + "description": "Console Service Provider", + "keywords": ["pimple", "cilex", "silex", "console", "service-provider"], + "license": "MIT", + "authors": [ + { "name": "Mike van Riel", "email": "mike.vanriel@naenius.com" }, + { "name": "Beau Simensen", "email": "beau@dflydev.com" } + ], + "require": { + "php": ">=5.3.3", + "pimple/pimple": "1.*@dev", + "symfony/console": "~2.1" + }, + "require-dev": { + "cilex/cilex": "1.*@dev", + "silex/silex": "1.*@dev" + }, + "autoload": { + "psr-0": { "Cilex\\Provider\\Console": "src" } + }, + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + } +} diff --git a/vendor/cilex/console-service-provider/composer.lock b/vendor/cilex/console-service-provider/composer.lock new file mode 100644 index 0000000000..d1e4c7c832 --- /dev/null +++ b/vendor/cilex/console-service-provider/composer.lock @@ -0,0 +1,110 @@ +{ + "hash": "52d1f50b5bb3e0f2626a352a0ed2a947", + "packages": [ + { + "name": "pimple/pimple", + "version": "dev-master", + "source": { + "type": "git", + "url": "git://github.com/fabpot/Pimple.git", + "reference": "v1.0.1" + }, + "dist": { + "type": "zip", + "url": "https://github.com/fabpot/Pimple/archive/v1.0.1.zip", + "reference": "v1.0.1", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "time": "2012-11-11 08:32:34", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "source", + "autoload": { + "psr-0": { + "Pimple": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Pimple is a simple Dependency Injection Container for PHP 5.3", + "homepage": "http://pimple.sensiolabs.org", + "keywords": [ + "dependency injection", + "container" + ] + }, + { + "name": "symfony/console", + "version": "v2.1.4", + "target-dir": "Symfony/Component/Console", + "source": { + "type": "git", + "url": "https://github.com/symfony/Console", + "reference": "v2.1.4" + }, + "dist": { + "type": "zip", + "url": "https://github.com/symfony/Console/archive/v2.1.4.zip", + "reference": "v2.1.4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "time": "2012-11-09 08:52:51", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "Symfony\\Component\\Console": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "http://symfony.com" + } + ], + "packages-dev": null, + "aliases": [ + + ], + "minimum-stability": "stable", + "stability-flags": { + "pimple/pimple": 20, + "cilex/cilex": 20, + "silex/silex": 20 + } +} diff --git a/vendor/cilex/console-service-provider/src/Cilex/Provider/Console/Adapter/Silex/ConsoleServiceProvider.php b/vendor/cilex/console-service-provider/src/Cilex/Provider/Console/Adapter/Silex/ConsoleServiceProvider.php new file mode 100644 index 0000000000..d41245c788 --- /dev/null +++ b/vendor/cilex/console-service-provider/src/Cilex/Provider/Console/Adapter/Silex/ConsoleServiceProvider.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Cilex\Provider\Console\Adapter\Silex; + +use Cilex\Provider\Console\BaseConsoleServiceProvider; +use Silex\Application; +use Silex\ServiceProviderInterface; + +/** + * Silex Console Service Provider adapter + * + * @author Beau Simensen + */ +class ConsoleServiceProvider implements ServiceProviderInterface +{ + /** + * {@inheritdoc} + */ + public function boot(Application $app) + { + } + + /** + * {@inheritdoc} + */ + public function register(Application $app) + { + $serviceProvider = new BaseConsoleServiceProvider; + $serviceProvider->register($app); + } +} diff --git a/vendor/cilex/console-service-provider/src/Cilex/Provider/Console/BaseConsoleServiceProvider.php b/vendor/cilex/console-service-provider/src/Cilex/Provider/Console/BaseConsoleServiceProvider.php new file mode 100644 index 0000000000..43da0d15ea --- /dev/null +++ b/vendor/cilex/console-service-provider/src/Cilex/Provider/Console/BaseConsoleServiceProvider.php @@ -0,0 +1,54 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Cilex\Provider\Console; + +/** + * Pimple Console Service Provider + * + * @author Beau Simensen + */ +class BaseConsoleServiceProvider +{ + /** + * {@inheritdoc} + */ + public function register(\Pimple $container) + { + foreach ($this->getDefaults() as $key => $value) { + if (!isset($container[$key])) { + $container[$key] = $value; + } + } + + $container['console'] = $container->share(function() use ($container) { + $class = $container['console.class']; + $instance = new $class( + isset($container['console.name']) ? $container['console.name'] : '', + isset($container['console.version']) ? $container['console.version'] : null + ); + + if ($instance instanceof ContainerAwareApplication) { + $instance->setContainer($container); + } + + return $instance; + }); + } + + protected function getDefaults() + { + return array( + 'console.name' => 'Cilex Application', + 'console.class' => 'Cilex\Provider\Console\ContainerAwareApplication', + ); + } +} diff --git a/vendor/cilex/console-service-provider/src/Cilex/Provider/Console/ConsoleServiceProvider.php b/vendor/cilex/console-service-provider/src/Cilex/Provider/Console/ConsoleServiceProvider.php new file mode 100644 index 0000000000..3336e164e1 --- /dev/null +++ b/vendor/cilex/console-service-provider/src/Cilex/Provider/Console/ConsoleServiceProvider.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Cilex\Provider\Console; + +use Cilex\Application; +use Cilex\ServiceProviderInterface; + +/** + * Cilex Console Service Provider + * + * @author Beau Simensen + */ +class ConsoleServiceProvider implements ServiceProviderInterface +{ + /** + * {@inheritdoc} + */ + public function register(Application $app) + { + $serviceProvider = new BaseConsoleServiceProvider(); + $serviceProvider->register($app); + } +} diff --git a/vendor/cilex/console-service-provider/src/Cilex/Provider/Console/ContainerAwareApplication.php b/vendor/cilex/console-service-provider/src/Cilex/Provider/Console/ContainerAwareApplication.php new file mode 100644 index 0000000000..608c646c5c --- /dev/null +++ b/vendor/cilex/console-service-provider/src/Cilex/Provider/Console/ContainerAwareApplication.php @@ -0,0 +1,77 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Cilex\Provider\Console; + +use Symfony\Component\Console\Application; + +/** + * Cilex Pimple Console Application + * + * @author Beau Simensen + */ +class ContainerAwareApplication extends Application +{ + /** @var \Pimple */ + private $container; + + /** + * Constructor + * + * @param string $name The name of the application + * @param string $version The version of the application + */ + public function __construct($name = 'UNKNOWN', $version = 'UNKNOWN') + { + parent::__construct($name, $version); + } + + /** + * Sets a container instance onto this application. + * + * @param \Pimple $container + * + * @return void + */ + public function setContainer(\Pimple $container) + { + $this->container = $container; + } + + /** + * Get the Container. + * + * @return \Pimple + */ + public function getContainer() + { + return $this->container; + } + + /** + * Returns a service contained in the application container or null if none is found with that name. + * + * This is a convenience method used to retrieve an element from the Application container without having to assign + * the results of the getContainer() method in every call. + * + * @param string $name Name of the service. + * + * @see self::getContainer() + * + * @api + * + * @return mixed|null + */ + public function getService($name) + { + return isset($this->container[$name]) ? $this->container[$name] : null; + } +} diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index 21b21e158c..4244e3c991 100644 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -6,6 +6,25 @@ $vendorDir = dirname(dirname(__FILE__)); $baseDir = dirname($vendorDir); return array( + 'Alchemy\\BinaryDriver\\AbstractBinary' => $vendorDir . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/AbstractBinary.php', + 'Alchemy\\BinaryDriver\\BinaryDriverTestCase' => $vendorDir . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/BinaryDriverTestCase.php', + 'Alchemy\\BinaryDriver\\BinaryInterface' => $vendorDir . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/BinaryInterface.php', + 'Alchemy\\BinaryDriver\\Configuration' => $vendorDir . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/Configuration.php', + 'Alchemy\\BinaryDriver\\ConfigurationAwareInterface' => $vendorDir . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/ConfigurationAwareInterface.php', + 'Alchemy\\BinaryDriver\\ConfigurationInterface' => $vendorDir . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/ConfigurationInterface.php', + 'Alchemy\\BinaryDriver\\Exception\\ExceptionInterface' => $vendorDir . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/Exception/ExceptionInterface.php', + 'Alchemy\\BinaryDriver\\Exception\\ExecutableNotFoundException' => $vendorDir . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/Exception/ExecutableNotFoundException.php', + 'Alchemy\\BinaryDriver\\Exception\\ExecutionFailureException' => $vendorDir . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/Exception/ExecutionFailureException.php', + 'Alchemy\\BinaryDriver\\Exception\\InvalidArgumentException' => $vendorDir . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/Exception/InvalidArgumentException.php', + 'Alchemy\\BinaryDriver\\Listeners\\DebugListener' => $vendorDir . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/Listeners/DebugListener.php', + 'Alchemy\\BinaryDriver\\Listeners\\ListenerInterface' => $vendorDir . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/Listeners/ListenerInterface.php', + 'Alchemy\\BinaryDriver\\Listeners\\Listeners' => $vendorDir . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/Listeners/Listeners.php', + 'Alchemy\\BinaryDriver\\ProcessBuilderFactory' => $vendorDir . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/ProcessBuilderFactory.php', + 'Alchemy\\BinaryDriver\\ProcessBuilderFactoryAwareInterface' => $vendorDir . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/ProcessBuilderFactoryAwareInterface.php', + 'Alchemy\\BinaryDriver\\ProcessBuilderFactoryInterface' => $vendorDir . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/ProcessBuilderFactoryInterface.php', + 'Alchemy\\BinaryDriver\\ProcessRunner' => $vendorDir . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/ProcessRunner.php', + 'Alchemy\\BinaryDriver\\ProcessRunnerAwareInterface' => $vendorDir . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/ProcessRunnerAwareInterface.php', + 'Alchemy\\BinaryDriver\\ProcessRunnerInterface' => $vendorDir . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/ProcessRunnerInterface.php', 'Auth_OpenID' => $vendorDir . '/openid/php-openid/Auth/OpenID.php', 'Auth_OpenID_AX' => $vendorDir . '/openid/php-openid/Auth/OpenID/AX.php', 'Auth_OpenID_AX_AttrInfo' => $vendorDir . '/openid/php-openid/Auth/OpenID/AX.php', @@ -145,8 +164,103 @@ return array( 'CAS_Request_MultiRequestInterface' => $vendorDir . '/apereo/phpcas/source/CAS/Request/MultiRequestInterface.php', 'CAS_Request_RequestInterface' => $vendorDir . '/apereo/phpcas/source/CAS/Request/RequestInterface.php', 'CAS_TypeMismatchException' => $vendorDir . '/apereo/phpcas/source/CAS/TypeMismatchException.php', + 'Cilex\\Application' => $vendorDir . '/cilex/cilex/src/Cilex/Application.php', + 'Cilex\\Command\\Command' => $vendorDir . '/cilex/cilex/src/Cilex/Command/Command.php', + 'Cilex\\Command\\DemoInfoCommand' => $vendorDir . '/cilex/cilex/src/Cilex/Command/DemoInfoCommand.php', + 'Cilex\\Command\\GreetCommand' => $vendorDir . '/cilex/cilex/src/Cilex/Command/GreetCommand.php', + 'Cilex\\Compiler' => $vendorDir . '/cilex/cilex/src/Cilex/Compiler.php', + 'Cilex\\Provider\\ConfigServiceProvider' => $vendorDir . '/cilex/cilex/src/Cilex/Provider/ConfigServiceProvider.php', + 'Cilex\\Provider\\Console\\Adapter\\Silex\\ConsoleServiceProvider' => $vendorDir . '/cilex/console-service-provider/src/Cilex/Provider/Console/Adapter/Silex/ConsoleServiceProvider.php', + 'Cilex\\Provider\\Console\\BaseConsoleServiceProvider' => $vendorDir . '/cilex/console-service-provider/src/Cilex/Provider/Console/BaseConsoleServiceProvider.php', + 'Cilex\\Provider\\Console\\ConsoleServiceProvider' => $vendorDir . '/cilex/console-service-provider/src/Cilex/Provider/Console/ConsoleServiceProvider.php', + 'Cilex\\Provider\\Console\\ContainerAwareApplication' => $vendorDir . '/cilex/console-service-provider/src/Cilex/Provider/Console/ContainerAwareApplication.php', + 'Cilex\\Provider\\DoctrineServiceProvider' => $vendorDir . '/cilex/cilex/src/Cilex/Provider/DoctrineServiceProvider.php', + 'Cilex\\Provider\\JmsSerializerServiceProvider' => $vendorDir . '/phpdocumentor/phpdocumentor/src/Cilex/Provider/JmsSerializerServiceProvider.php', + 'Cilex\\Provider\\MonologServiceProvider' => $vendorDir . '/cilex/cilex/src/Cilex/Provider/MonologServiceProvider.php', + 'Cilex\\Provider\\ValidatorServiceProvider' => $vendorDir . '/cilex/cilex/src/Cilex/Provider/ValidatorServiceProvider.php', + 'Cilex\\ServiceProviderInterface' => $vendorDir . '/cilex/cilex/src/Cilex/ServiceProviderInterface.php', 'Composer\\CaBundle\\CaBundle' => $vendorDir . '/composer/ca-bundle/src/CaBundle.php', 'Console_Getopt' => $vendorDir . '/pear/console_getopt/Console/Getopt.php', + 'DeepCopy\\DeepCopy' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/DeepCopy.php', + 'DeepCopy\\Exception\\CloneException' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php', + 'DeepCopy\\Exception\\PropertyException' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Exception/PropertyException.php', + 'DeepCopy\\Filter\\Doctrine\\DoctrineCollectionFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php', + 'DeepCopy\\Filter\\Doctrine\\DoctrineEmptyCollectionFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php', + 'DeepCopy\\Filter\\Doctrine\\DoctrineProxyFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php', + 'DeepCopy\\Filter\\Filter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php', + 'DeepCopy\\Filter\\KeepFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/KeepFilter.php', + 'DeepCopy\\Filter\\ReplaceFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.php', + 'DeepCopy\\Filter\\SetNullFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php', + 'DeepCopy\\Matcher\\Doctrine\\DoctrineProxyMatcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php', + 'DeepCopy\\Matcher\\Matcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php', + 'DeepCopy\\Matcher\\PropertyMatcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.php', + 'DeepCopy\\Matcher\\PropertyNameMatcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php', + 'DeepCopy\\Matcher\\PropertyTypeMatcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php', + 'DeepCopy\\Reflection\\ReflectionHelper' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php', + 'DeepCopy\\TypeFilter\\Date\\DateIntervalFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php', + 'DeepCopy\\TypeFilter\\ReplaceFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php', + 'DeepCopy\\TypeFilter\\ShallowCopyFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php', + 'DeepCopy\\TypeFilter\\Spl\\ArrayObjectFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/ArrayObjectFilter.php', + 'DeepCopy\\TypeFilter\\Spl\\SplDoublyLinkedList' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php', + 'DeepCopy\\TypeFilter\\Spl\\SplDoublyLinkedListFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.php', + 'DeepCopy\\TypeFilter\\TypeFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php', + 'DeepCopy\\TypeMatcher\\TypeMatcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.php', + 'Doctrine\\Common\\Annotations\\Annotation' => $vendorDir . '/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation.php', + 'Doctrine\\Common\\Annotations\\AnnotationException' => $vendorDir . '/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationException.php', + 'Doctrine\\Common\\Annotations\\AnnotationReader' => $vendorDir . '/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationReader.php', + 'Doctrine\\Common\\Annotations\\AnnotationRegistry' => $vendorDir . '/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationRegistry.php', + 'Doctrine\\Common\\Annotations\\Annotation\\Attribute' => $vendorDir . '/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Attribute.php', + 'Doctrine\\Common\\Annotations\\Annotation\\Attributes' => $vendorDir . '/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Attributes.php', + 'Doctrine\\Common\\Annotations\\Annotation\\Enum' => $vendorDir . '/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Enum.php', + 'Doctrine\\Common\\Annotations\\Annotation\\IgnoreAnnotation' => $vendorDir . '/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php', + 'Doctrine\\Common\\Annotations\\Annotation\\Required' => $vendorDir . '/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Required.php', + 'Doctrine\\Common\\Annotations\\Annotation\\Target' => $vendorDir . '/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Target.php', + 'Doctrine\\Common\\Annotations\\CachedReader' => $vendorDir . '/doctrine/annotations/lib/Doctrine/Common/Annotations/CachedReader.php', + 'Doctrine\\Common\\Annotations\\DocLexer' => $vendorDir . '/doctrine/annotations/lib/Doctrine/Common/Annotations/DocLexer.php', + 'Doctrine\\Common\\Annotations\\DocParser' => $vendorDir . '/doctrine/annotations/lib/Doctrine/Common/Annotations/DocParser.php', + 'Doctrine\\Common\\Annotations\\FileCacheReader' => $vendorDir . '/doctrine/annotations/lib/Doctrine/Common/Annotations/FileCacheReader.php', + 'Doctrine\\Common\\Annotations\\IndexedReader' => $vendorDir . '/doctrine/annotations/lib/Doctrine/Common/Annotations/IndexedReader.php', + 'Doctrine\\Common\\Annotations\\PhpParser' => $vendorDir . '/doctrine/annotations/lib/Doctrine/Common/Annotations/PhpParser.php', + 'Doctrine\\Common\\Annotations\\Reader' => $vendorDir . '/doctrine/annotations/lib/Doctrine/Common/Annotations/Reader.php', + 'Doctrine\\Common\\Annotations\\SimpleAnnotationReader' => $vendorDir . '/doctrine/annotations/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php', + 'Doctrine\\Common\\Annotations\\TokenParser' => $vendorDir . '/doctrine/annotations/lib/Doctrine/Common/Annotations/TokenParser.php', + 'Doctrine\\Common\\Cache\\ApcCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/ApcCache.php', + 'Doctrine\\Common\\Cache\\ApcuCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/ApcuCache.php', + 'Doctrine\\Common\\Cache\\ArrayCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/ArrayCache.php', + 'Doctrine\\Common\\Cache\\Cache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/Cache.php', + 'Doctrine\\Common\\Cache\\CacheProvider' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/CacheProvider.php', + 'Doctrine\\Common\\Cache\\ChainCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/ChainCache.php', + 'Doctrine\\Common\\Cache\\ClearableCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/ClearableCache.php', + 'Doctrine\\Common\\Cache\\CouchbaseBucketCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/CouchbaseBucketCache.php', + 'Doctrine\\Common\\Cache\\CouchbaseCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/CouchbaseCache.php', + 'Doctrine\\Common\\Cache\\ExtMongoDBCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/ExtMongoDBCache.php', + 'Doctrine\\Common\\Cache\\FileCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/FileCache.php', + 'Doctrine\\Common\\Cache\\FilesystemCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/FilesystemCache.php', + 'Doctrine\\Common\\Cache\\FlushableCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/FlushableCache.php', + 'Doctrine\\Common\\Cache\\InvalidCacheId' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/InvalidCacheId.php', + 'Doctrine\\Common\\Cache\\LegacyMongoDBCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/LegacyMongoDBCache.php', + 'Doctrine\\Common\\Cache\\MemcacheCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/MemcacheCache.php', + 'Doctrine\\Common\\Cache\\MemcachedCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/MemcachedCache.php', + 'Doctrine\\Common\\Cache\\MongoDBCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/MongoDBCache.php', + 'Doctrine\\Common\\Cache\\MultiDeleteCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/MultiDeleteCache.php', + 'Doctrine\\Common\\Cache\\MultiGetCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/MultiGetCache.php', + 'Doctrine\\Common\\Cache\\MultiOperationCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/MultiOperationCache.php', + 'Doctrine\\Common\\Cache\\MultiPutCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/MultiPutCache.php', + 'Doctrine\\Common\\Cache\\PhpFileCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/PhpFileCache.php', + 'Doctrine\\Common\\Cache\\PredisCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/PredisCache.php', + 'Doctrine\\Common\\Cache\\RedisCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/RedisCache.php', + 'Doctrine\\Common\\Cache\\SQLite3Cache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/SQLite3Cache.php', + 'Doctrine\\Common\\Cache\\Version' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/Version.php', + 'Doctrine\\Common\\Cache\\VoidCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/VoidCache.php', + 'Doctrine\\Common\\Cache\\WinCacheCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/WinCacheCache.php', + 'Doctrine\\Common\\Cache\\XcacheCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/XcacheCache.php', + 'Doctrine\\Common\\Cache\\ZendDataCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/ZendDataCache.php', + 'Doctrine\\Common\\Lexer\\AbstractLexer' => $vendorDir . '/doctrine/lexer/lib/Doctrine/Common/Lexer/AbstractLexer.php', + 'Doctrine\\Instantiator\\Exception\\ExceptionInterface' => $vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php', + 'Doctrine\\Instantiator\\Exception\\InvalidArgumentException' => $vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator/Exception/InvalidArgumentException.php', + 'Doctrine\\Instantiator\\Exception\\UnexpectedValueException' => $vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php', + 'Doctrine\\Instantiator\\Instantiator' => $vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php', + 'Doctrine\\Instantiator\\InstantiatorInterface' => $vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php', 'Embed\\Adapters\\Adapter' => $vendorDir . '/embed/embed/src/Adapters/Adapter.php', 'Embed\\Adapters\\Archive' => $vendorDir . '/embed/embed/src/Adapters/Archive.php', 'Embed\\Adapters\\Cadenaser' => $vendorDir . '/embed/embed/src/Adapters/Cadenaser.php', @@ -171,7 +285,6 @@ return array( 'Embed\\Adapters\\Sassmeister' => $vendorDir . '/embed/embed/src/Adapters/Sassmeister.php', 'Embed\\Adapters\\Slides' => $vendorDir . '/embed/embed/src/Adapters/Slides.php', 'Embed\\Adapters\\Snipplr' => $vendorDir . '/embed/embed/src/Adapters/Snipplr.php', - 'Embed\\Adapters\\Twitter' => $vendorDir . '/embed/embed/src/Adapters/Twitter.php', 'Embed\\Adapters\\Vimeo' => $vendorDir . '/embed/embed/src/Adapters/Vimeo.php', 'Embed\\Adapters\\Webpage' => $vendorDir . '/embed/embed/src/Adapters/Webpage.php', 'Embed\\Adapters\\Wikipedia' => $vendorDir . '/embed/embed/src/Adapters/Wikipedia.php', @@ -218,7 +331,6 @@ return array( 'Embed\\Providers\\OEmbed\\Jsbin' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Jsbin.php', 'Embed\\Providers\\OEmbed\\Kickstarter' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Kickstarter.php', 'Embed\\Providers\\OEmbed\\Meetup' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Meetup.php', - 'Embed\\Providers\\OEmbed\\Mixcloud' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Mixcloud.php', 'Embed\\Providers\\OEmbed\\Photobucket' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Photobucket.php', 'Embed\\Providers\\OEmbed\\Poll' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Poll.php', 'Embed\\Providers\\OEmbed\\Polldaddy' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Polldaddy.php', @@ -228,19 +340,119 @@ return array( 'Embed\\Providers\\OEmbed\\Smugmug' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Smugmug.php', 'Embed\\Providers\\OEmbed\\Soundcloud' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Soundcloud.php', 'Embed\\Providers\\OEmbed\\Spotify' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Spotify.php', - 'Embed\\Providers\\OEmbed\\Tiktok' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Tiktok.php', 'Embed\\Providers\\OEmbed\\Tumblr' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Tumblr.php', 'Embed\\Providers\\OEmbed\\Twitch' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Twitch.php', 'Embed\\Providers\\OEmbed\\Twitter' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Twitter.php', 'Embed\\Providers\\OEmbed\\Ustream' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Ustream.php', 'Embed\\Providers\\OEmbed\\Vimeo' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Vimeo.php', - 'Embed\\Providers\\OEmbed\\Wordpress' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Wordpress.php', 'Embed\\Providers\\OEmbed\\Youtube' => $vendorDir . '/embed/embed/src/Providers/OEmbed/Youtube.php', 'Embed\\Providers\\OpenGraph' => $vendorDir . '/embed/embed/src/Providers/OpenGraph.php', 'Embed\\Providers\\Provider' => $vendorDir . '/embed/embed/src/Providers/Provider.php', 'Embed\\Providers\\Sailthru' => $vendorDir . '/embed/embed/src/Providers/Sailthru.php', 'Embed\\Providers\\TwitterCards' => $vendorDir . '/embed/embed/src/Providers/TwitterCards.php', 'Embed\\Utils' => $vendorDir . '/embed/embed/src/Utils.php', + 'Evenement\\EventEmitter' => $vendorDir . '/evenement/evenement/src/Evenement/EventEmitter.php', + 'Evenement\\EventEmitterInterface' => $vendorDir . '/evenement/evenement/src/Evenement/EventEmitterInterface.php', + 'Evenement\\EventEmitterTrait' => $vendorDir . '/evenement/evenement/src/Evenement/EventEmitterTrait.php', + 'FFMpeg\\Coordinate\\AspectRatio' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Coordinate/AspectRatio.php', + 'FFMpeg\\Coordinate\\Dimension' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Coordinate/Dimension.php', + 'FFMpeg\\Coordinate\\FrameRate' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Coordinate/FrameRate.php', + 'FFMpeg\\Coordinate\\Point' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Coordinate/Point.php', + 'FFMpeg\\Coordinate\\TimeCode' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Coordinate/TimeCode.php', + 'FFMpeg\\Driver\\FFMpegDriver' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Driver/FFMpegDriver.php', + 'FFMpeg\\Driver\\FFProbeDriver' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Driver/FFProbeDriver.php', + 'FFMpeg\\Exception\\ExceptionInterface' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Exception/ExceptionInterface.php', + 'FFMpeg\\Exception\\ExecutableNotFoundException' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Exception/ExecutableNotFoundException.php', + 'FFMpeg\\Exception\\InvalidArgumentException' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Exception/InvalidArgumentException.php', + 'FFMpeg\\Exception\\LogicException' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Exception/LogicException.php', + 'FFMpeg\\Exception\\RuntimeException' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Exception/RuntimeException.php', + 'FFMpeg\\FFMpeg' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFMpeg.php', + 'FFMpeg\\FFMpegServiceProvider' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFMpegServiceProvider.php', + 'FFMpeg\\FFProbe' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe.php', + 'FFMpeg\\FFProbe\\DataMapping\\AbstractData' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/DataMapping/AbstractData.php', + 'FFMpeg\\FFProbe\\DataMapping\\Format' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/DataMapping/Format.php', + 'FFMpeg\\FFProbe\\DataMapping\\Stream' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/DataMapping/Stream.php', + 'FFMpeg\\FFProbe\\DataMapping\\StreamCollection' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/DataMapping/StreamCollection.php', + 'FFMpeg\\FFProbe\\Mapper' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/Mapper.php', + 'FFMpeg\\FFProbe\\MapperInterface' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/MapperInterface.php', + 'FFMpeg\\FFProbe\\OptionsTester' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/OptionsTester.php', + 'FFMpeg\\FFProbe\\OptionsTesterInterface' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/OptionsTesterInterface.php', + 'FFMpeg\\FFProbe\\OutputParser' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/OutputParser.php', + 'FFMpeg\\FFProbe\\OutputParserInterface' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/OutputParserInterface.php', + 'FFMpeg\\Filters\\AdvancedMedia\\ANullSrcFilter' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/ANullSrcFilter.php', + 'FFMpeg\\Filters\\AdvancedMedia\\AbstractComplexFilter' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/AbstractComplexFilter.php', + 'FFMpeg\\Filters\\AdvancedMedia\\ComplexCompatibleFilter' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/ComplexCompatibleFilter.php', + 'FFMpeg\\Filters\\AdvancedMedia\\ComplexFilterContainer' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/ComplexFilterContainer.php', + 'FFMpeg\\Filters\\AdvancedMedia\\ComplexFilterInterface' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/ComplexFilterInterface.php', + 'FFMpeg\\Filters\\AdvancedMedia\\ComplexFilters' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/ComplexFilters.php', + 'FFMpeg\\Filters\\AdvancedMedia\\CustomComplexFilter' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/CustomComplexFilter.php', + 'FFMpeg\\Filters\\AdvancedMedia\\SineFilter' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/SineFilter.php', + 'FFMpeg\\Filters\\AdvancedMedia\\TestSrcFilter' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/TestSrcFilter.php', + 'FFMpeg\\Filters\\AdvancedMedia\\XStackFilter' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/XStackFilter.php', + 'FFMpeg\\Filters\\Audio\\AddMetadataFilter' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Audio/AddMetadataFilter.php', + 'FFMpeg\\Filters\\Audio\\AudioClipFilter' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Audio/AudioClipFilter.php', + 'FFMpeg\\Filters\\Audio\\AudioFilterInterface' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Audio/AudioFilterInterface.php', + 'FFMpeg\\Filters\\Audio\\AudioFilters' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Audio/AudioFilters.php', + 'FFMpeg\\Filters\\Audio\\AudioResamplableFilter' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Audio/AudioResamplableFilter.php', + 'FFMpeg\\Filters\\Audio\\CustomFilter' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Audio/CustomFilter.php', + 'FFMpeg\\Filters\\Audio\\SimpleFilter' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Audio/SimpleFilter.php', + 'FFMpeg\\Filters\\Concat\\ConcatFilterInterface' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Concat/ConcatFilterInterface.php', + 'FFMpeg\\Filters\\Concat\\ConcatFilters' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Concat/ConcatFilters.php', + 'FFMpeg\\Filters\\FilterInterface' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/FilterInterface.php', + 'FFMpeg\\Filters\\FiltersCollection' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/FiltersCollection.php', + 'FFMpeg\\Filters\\Frame\\CustomFrameFilter' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Frame/CustomFrameFilter.php', + 'FFMpeg\\Filters\\Frame\\DisplayRatioFixerFilter' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Frame/DisplayRatioFixerFilter.php', + 'FFMpeg\\Filters\\Frame\\FrameFilterInterface' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Frame/FrameFilterInterface.php', + 'FFMpeg\\Filters\\Frame\\FrameFilters' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Frame/FrameFilters.php', + 'FFMpeg\\Filters\\Gif\\GifFilterInterface' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Gif/GifFilterInterface.php', + 'FFMpeg\\Filters\\Gif\\GifFilters' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Gif/GifFilters.php', + 'FFMpeg\\Filters\\Video\\ClipFilter' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/ClipFilter.php', + 'FFMpeg\\Filters\\Video\\CropFilter' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/CropFilter.php', + 'FFMpeg\\Filters\\Video\\CustomFilter' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/CustomFilter.php', + 'FFMpeg\\Filters\\Video\\ExtractMultipleFramesFilter' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/ExtractMultipleFramesFilter.php', + 'FFMpeg\\Filters\\Video\\FrameRateFilter' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/FrameRateFilter.php', + 'FFMpeg\\Filters\\Video\\PadFilter' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/PadFilter.php', + 'FFMpeg\\Filters\\Video\\ResizeFilter' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/ResizeFilter.php', + 'FFMpeg\\Filters\\Video\\RotateFilter' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/RotateFilter.php', + 'FFMpeg\\Filters\\Video\\SynchronizeFilter' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/SynchronizeFilter.php', + 'FFMpeg\\Filters\\Video\\VideoFilterInterface' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/VideoFilterInterface.php', + 'FFMpeg\\Filters\\Video\\VideoFilters' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/VideoFilters.php', + 'FFMpeg\\Filters\\Video\\WatermarkFilter' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/WatermarkFilter.php', + 'FFMpeg\\Filters\\Waveform\\WaveformDownmixFilter' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Waveform/WaveformDownmixFilter.php', + 'FFMpeg\\Filters\\Waveform\\WaveformFilterInterface' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Waveform/WaveformFilterInterface.php', + 'FFMpeg\\Filters\\Waveform\\WaveformFilters' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Waveform/WaveformFilters.php', + 'FFMpeg\\Format\\AudioInterface' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/AudioInterface.php', + 'FFMpeg\\Format\\Audio\\Aac' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Audio/Aac.php', + 'FFMpeg\\Format\\Audio\\DefaultAudio' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Audio/DefaultAudio.php', + 'FFMpeg\\Format\\Audio\\Flac' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Audio/Flac.php', + 'FFMpeg\\Format\\Audio\\Mp3' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Audio/Mp3.php', + 'FFMpeg\\Format\\Audio\\Vorbis' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Audio/Vorbis.php', + 'FFMpeg\\Format\\Audio\\Wav' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Audio/Wav.php', + 'FFMpeg\\Format\\FormatInterface' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/FormatInterface.php', + 'FFMpeg\\Format\\FrameInterface' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/FrameInterface.php', + 'FFMpeg\\Format\\ProgressListener\\AbstractProgressListener' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/ProgressListener/AbstractProgressListener.php', + 'FFMpeg\\Format\\ProgressListener\\AudioProgressListener' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/ProgressListener/AudioProgressListener.php', + 'FFMpeg\\Format\\ProgressListener\\VideoProgressListener' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/ProgressListener/VideoProgressListener.php', + 'FFMpeg\\Format\\ProgressableInterface' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/ProgressableInterface.php', + 'FFMpeg\\Format\\VideoInterface' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/VideoInterface.php', + 'FFMpeg\\Format\\Video\\DefaultVideo' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Video/DefaultVideo.php', + 'FFMpeg\\Format\\Video\\Ogg' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Video/Ogg.php', + 'FFMpeg\\Format\\Video\\WMV' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Video/WMV.php', + 'FFMpeg\\Format\\Video\\WMV3' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Video/WMV3.php', + 'FFMpeg\\Format\\Video\\WebM' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Video/WebM.php', + 'FFMpeg\\Format\\Video\\X264' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Video/X264.php', + 'FFMpeg\\Media\\AbstractMediaType' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/AbstractMediaType.php', + 'FFMpeg\\Media\\AbstractStreamableMedia' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/AbstractStreamableMedia.php', + 'FFMpeg\\Media\\AbstractVideo' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/AbstractVideo.php', + 'FFMpeg\\Media\\AdvancedMedia' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/AdvancedMedia.php', + 'FFMpeg\\Media\\Audio' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/Audio.php', + 'FFMpeg\\Media\\Clip' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/Clip.php', + 'FFMpeg\\Media\\Concat' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/Concat.php', + 'FFMpeg\\Media\\Frame' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/Frame.php', + 'FFMpeg\\Media\\Gif' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/Gif.php', + 'FFMpeg\\Media\\MediaTypeInterface' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/MediaTypeInterface.php', + 'FFMpeg\\Media\\Video' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/Video.php', + 'FFMpeg\\Media\\Waveform' => $vendorDir . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/Waveform.php', 'GuzzleHttp\\Psr7\\AppendStream' => $vendorDir . '/guzzlehttp/psr7/src/AppendStream.php', 'GuzzleHttp\\Psr7\\BufferStream' => $vendorDir . '/guzzlehttp/psr7/src/BufferStream.php', 'GuzzleHttp\\Psr7\\CachingStream' => $vendorDir . '/guzzlehttp/psr7/src/CachingStream.php', @@ -528,6 +740,22 @@ return array( 'Hoa\\Exception\\Test\\Unit\\Exception' => $vendorDir . '/hoa/exception/Test/Unit/Exception.php', 'Hoa\\Exception\\Test\\Unit\\Group' => $vendorDir . '/hoa/exception/Test/Unit/Group.php', 'Hoa\\Exception\\Test\\Unit\\Idle' => $vendorDir . '/hoa/exception/Test/Unit/Idle.php', + 'Humbug\\FileGetContents' => $vendorDir . '/padraic/humbug_get_contents/src/FileGetContents.php', + 'Humbug\\SelfUpdate\\Exception\\ExceptionInterface' => $vendorDir . '/padraic/phar-updater/src/Exception/ExceptionInterface.php', + 'Humbug\\SelfUpdate\\Exception\\FilesystemException' => $vendorDir . '/padraic/phar-updater/src/Exception/FilesystemException.php', + 'Humbug\\SelfUpdate\\Exception\\HttpRequestException' => $vendorDir . '/padraic/phar-updater/src/Exception/HttpRequestException.php', + 'Humbug\\SelfUpdate\\Exception\\InvalidArgumentException' => $vendorDir . '/padraic/phar-updater/src/Exception/InvalidArgumentException.php', + 'Humbug\\SelfUpdate\\Exception\\JsonParsingException' => $vendorDir . '/padraic/phar-updater/src/Exception/JsonParsingException.php', + 'Humbug\\SelfUpdate\\Exception\\NoSignatureException' => $vendorDir . '/padraic/phar-updater/src/Exception/NoSignatureException.php', + 'Humbug\\SelfUpdate\\Exception\\RuntimeException' => $vendorDir . '/padraic/phar-updater/src/Exception/RuntimeException.php', + 'Humbug\\SelfUpdate\\Strategy\\GithubStrategy' => $vendorDir . '/padraic/phar-updater/src/Strategy/GithubStrategy.php', + 'Humbug\\SelfUpdate\\Strategy\\ShaStrategy' => $vendorDir . '/padraic/phar-updater/src/Strategy/ShaStrategy.php', + 'Humbug\\SelfUpdate\\Strategy\\StrategyInterface' => $vendorDir . '/padraic/phar-updater/src/Strategy/StrategyInterface.php', + 'Humbug\\SelfUpdate\\Updater' => $vendorDir . '/padraic/phar-updater/src/Updater.php', + 'Humbug\\SelfUpdate\\VersionParser' => $vendorDir . '/padraic/phar-updater/src/VersionParser.php', + 'Interop\\Container\\ContainerInterface' => $vendorDir . '/container-interop/container-interop/src/Interop/Container/ContainerInterface.php', + 'Interop\\Container\\Exception\\ContainerException' => $vendorDir . '/container-interop/container-interop/src/Interop/Container/Exception/ContainerException.php', + 'Interop\\Container\\Exception\\NotFoundException' => $vendorDir . '/container-interop/container-interop/src/Interop/Container/Exception/NotFoundException.php', 'Intervention\\Image\\AbstractColor' => $vendorDir . '/intervention/image/src/Intervention/Image/AbstractColor.php', 'Intervention\\Image\\AbstractDecoder' => $vendorDir . '/intervention/image/src/Intervention/Image/AbstractDecoder.php', 'Intervention\\Image\\AbstractDriver' => $vendorDir . '/intervention/image/src/Intervention/Image/AbstractDriver.php', @@ -654,6 +882,141 @@ return array( 'Intervention\\Image\\Point' => $vendorDir . '/intervention/image/src/Intervention/Image/Point.php', 'Intervention\\Image\\Response' => $vendorDir . '/intervention/image/src/Intervention/Image/Response.php', 'Intervention\\Image\\Size' => $vendorDir . '/intervention/image/src/Intervention/Image/Size.php', + 'JMS\\Parser\\AbstractLexer' => $vendorDir . '/jms/parser-lib/src/JMS/Parser/AbstractLexer.php', + 'JMS\\Parser\\AbstractParser' => $vendorDir . '/jms/parser-lib/src/JMS/Parser/AbstractParser.php', + 'JMS\\Parser\\SimpleLexer' => $vendorDir . '/jms/parser-lib/src/JMS/Parser/SimpleLexer.php', + 'JMS\\Parser\\SyntaxErrorException' => $vendorDir . '/jms/parser-lib/src/JMS/Parser/SyntaxErrorException.php', + 'JMS\\Serializer\\AbstractVisitor' => $vendorDir . '/jms/serializer/src/JMS/Serializer/AbstractVisitor.php', + 'JMS\\Serializer\\Accessor\\AccessorStrategyInterface' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Accessor/AccessorStrategyInterface.php', + 'JMS\\Serializer\\Accessor\\DefaultAccessorStrategy' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Accessor/DefaultAccessorStrategy.php', + 'JMS\\Serializer\\Accessor\\ExpressionAccessorStrategy' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Accessor/ExpressionAccessorStrategy.php', + 'JMS\\Serializer\\Annotation\\AccessType' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Annotation/AccessType.php', + 'JMS\\Serializer\\Annotation\\Accessor' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Annotation/Accessor.php', + 'JMS\\Serializer\\Annotation\\AccessorOrder' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Annotation/AccessorOrder.php', + 'JMS\\Serializer\\Annotation\\Discriminator' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Annotation/Discriminator.php', + 'JMS\\Serializer\\Annotation\\Exclude' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Annotation/Exclude.php', + 'JMS\\Serializer\\Annotation\\ExclusionPolicy' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Annotation/ExclusionPolicy.php', + 'JMS\\Serializer\\Annotation\\Expose' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Annotation/Expose.php', + 'JMS\\Serializer\\Annotation\\Groups' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Annotation/Groups.php', + 'JMS\\Serializer\\Annotation\\HandlerCallback' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Annotation/HandlerCallback.php', + 'JMS\\Serializer\\Annotation\\Inline' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Annotation/Inline.php', + 'JMS\\Serializer\\Annotation\\MaxDepth' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Annotation/MaxDepth.php', + 'JMS\\Serializer\\Annotation\\PostDeserialize' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Annotation/PostDeserialize.php', + 'JMS\\Serializer\\Annotation\\PostSerialize' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Annotation/PostSerialize.php', + 'JMS\\Serializer\\Annotation\\PreSerialize' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Annotation/PreSerialize.php', + 'JMS\\Serializer\\Annotation\\ReadOnly' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Annotation/ReadOnly.php', + 'JMS\\Serializer\\Annotation\\SerializedName' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Annotation/SerializedName.php', + 'JMS\\Serializer\\Annotation\\Since' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Annotation/Since.php', + 'JMS\\Serializer\\Annotation\\SkipWhenEmpty' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Annotation/SkipWhenEmpty.php', + 'JMS\\Serializer\\Annotation\\Type' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Annotation/Type.php', + 'JMS\\Serializer\\Annotation\\Until' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Annotation/Until.php', + 'JMS\\Serializer\\Annotation\\Version' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Annotation/Version.php', + 'JMS\\Serializer\\Annotation\\VirtualProperty' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Annotation/VirtualProperty.php', + 'JMS\\Serializer\\Annotation\\XmlAttribute' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Annotation/XmlAttribute.php', + 'JMS\\Serializer\\Annotation\\XmlAttributeMap' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Annotation/XmlAttributeMap.php', + 'JMS\\Serializer\\Annotation\\XmlCollection' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Annotation/XmlCollection.php', + 'JMS\\Serializer\\Annotation\\XmlDiscriminator' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Annotation/XmlDiscriminator.php', + 'JMS\\Serializer\\Annotation\\XmlElement' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Annotation/XmlElement.php', + 'JMS\\Serializer\\Annotation\\XmlKeyValuePairs' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Annotation/XmlKeyValuePairs.php', + 'JMS\\Serializer\\Annotation\\XmlList' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Annotation/XmlList.php', + 'JMS\\Serializer\\Annotation\\XmlMap' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Annotation/XmlMap.php', + 'JMS\\Serializer\\Annotation\\XmlNamespace' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Annotation/XmlNamespace.php', + 'JMS\\Serializer\\Annotation\\XmlRoot' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Annotation/XmlRoot.php', + 'JMS\\Serializer\\Annotation\\XmlValue' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Annotation/XmlValue.php', + 'JMS\\Serializer\\ArrayTransformerInterface' => $vendorDir . '/jms/serializer/src/JMS/Serializer/ArrayTransformerInterface.php', + 'JMS\\Serializer\\Builder\\CallbackDriverFactory' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Builder/CallbackDriverFactory.php', + 'JMS\\Serializer\\Builder\\DefaultDriverFactory' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Builder/DefaultDriverFactory.php', + 'JMS\\Serializer\\Builder\\DriverFactoryInterface' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Builder/DriverFactoryInterface.php', + 'JMS\\Serializer\\Construction\\DoctrineObjectConstructor' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Construction/DoctrineObjectConstructor.php', + 'JMS\\Serializer\\Construction\\ObjectConstructorInterface' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Construction/ObjectConstructorInterface.php', + 'JMS\\Serializer\\Construction\\UnserializeObjectConstructor' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Construction/UnserializeObjectConstructor.php', + 'JMS\\Serializer\\Context' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Context.php', + 'JMS\\Serializer\\ContextFactory\\CallableContextFactory' => $vendorDir . '/jms/serializer/src/JMS/Serializer/ContextFactory/CallableContextFactory.php', + 'JMS\\Serializer\\ContextFactory\\CallableDeserializationContextFactory' => $vendorDir . '/jms/serializer/src/JMS/Serializer/ContextFactory/CallableDeserializationContextFactory.php', + 'JMS\\Serializer\\ContextFactory\\CallableSerializationContextFactory' => $vendorDir . '/jms/serializer/src/JMS/Serializer/ContextFactory/CallableSerializationContextFactory.php', + 'JMS\\Serializer\\ContextFactory\\DefaultDeserializationContextFactory' => $vendorDir . '/jms/serializer/src/JMS/Serializer/ContextFactory/DefaultDeserializationContextFactory.php', + 'JMS\\Serializer\\ContextFactory\\DefaultSerializationContextFactory' => $vendorDir . '/jms/serializer/src/JMS/Serializer/ContextFactory/DefaultSerializationContextFactory.php', + 'JMS\\Serializer\\ContextFactory\\DeserializationContextFactoryInterface' => $vendorDir . '/jms/serializer/src/JMS/Serializer/ContextFactory/DeserializationContextFactoryInterface.php', + 'JMS\\Serializer\\ContextFactory\\SerializationContextFactoryInterface' => $vendorDir . '/jms/serializer/src/JMS/Serializer/ContextFactory/SerializationContextFactoryInterface.php', + 'JMS\\Serializer\\DeserializationContext' => $vendorDir . '/jms/serializer/src/JMS/Serializer/DeserializationContext.php', + 'JMS\\Serializer\\EventDispatcher\\Event' => $vendorDir . '/jms/serializer/src/JMS/Serializer/EventDispatcher/Event.php', + 'JMS\\Serializer\\EventDispatcher\\EventDispatcher' => $vendorDir . '/jms/serializer/src/JMS/Serializer/EventDispatcher/EventDispatcher.php', + 'JMS\\Serializer\\EventDispatcher\\EventDispatcherInterface' => $vendorDir . '/jms/serializer/src/JMS/Serializer/EventDispatcher/EventDispatcherInterface.php', + 'JMS\\Serializer\\EventDispatcher\\EventSubscriberInterface' => $vendorDir . '/jms/serializer/src/JMS/Serializer/EventDispatcher/EventSubscriberInterface.php', + 'JMS\\Serializer\\EventDispatcher\\Events' => $vendorDir . '/jms/serializer/src/JMS/Serializer/EventDispatcher/Events.php', + 'JMS\\Serializer\\EventDispatcher\\LazyEventDispatcher' => $vendorDir . '/jms/serializer/src/JMS/Serializer/EventDispatcher/LazyEventDispatcher.php', + 'JMS\\Serializer\\EventDispatcher\\ObjectEvent' => $vendorDir . '/jms/serializer/src/JMS/Serializer/EventDispatcher/ObjectEvent.php', + 'JMS\\Serializer\\EventDispatcher\\PreDeserializeEvent' => $vendorDir . '/jms/serializer/src/JMS/Serializer/EventDispatcher/PreDeserializeEvent.php', + 'JMS\\Serializer\\EventDispatcher\\PreSerializeEvent' => $vendorDir . '/jms/serializer/src/JMS/Serializer/EventDispatcher/PreSerializeEvent.php', + 'JMS\\Serializer\\EventDispatcher\\Subscriber\\DoctrineProxySubscriber' => $vendorDir . '/jms/serializer/src/JMS/Serializer/EventDispatcher/Subscriber/DoctrineProxySubscriber.php', + 'JMS\\Serializer\\EventDispatcher\\Subscriber\\SymfonyValidatorSubscriber' => $vendorDir . '/jms/serializer/src/JMS/Serializer/EventDispatcher/Subscriber/SymfonyValidatorSubscriber.php', + 'JMS\\Serializer\\EventDispatcher\\Subscriber\\SymfonyValidatorValidatorSubscriber' => $vendorDir . '/jms/serializer/src/JMS/Serializer/EventDispatcher/Subscriber/SymfonyValidatorValidatorSubscriber.php', + 'JMS\\Serializer\\Exception\\Exception' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Exception/Exception.php', + 'JMS\\Serializer\\Exception\\ExpressionLanguageRequiredException' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Exception/ExpressionLanguageRequiredException.php', + 'JMS\\Serializer\\Exception\\InvalidArgumentException' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Exception/InvalidArgumentException.php', + 'JMS\\Serializer\\Exception\\LogicException' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Exception/LogicException.php', + 'JMS\\Serializer\\Exception\\ObjectConstructionException' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Exception/ObjectConstructionException.php', + 'JMS\\Serializer\\Exception\\RuntimeException' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Exception/RuntimeException.php', + 'JMS\\Serializer\\Exception\\UnsupportedFormatException' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Exception/UnsupportedFormatException.php', + 'JMS\\Serializer\\Exception\\ValidationFailedException' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Exception/ValidationFailedException.php', + 'JMS\\Serializer\\Exception\\XmlErrorException' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Exception/XmlErrorException.php', + 'JMS\\Serializer\\Exclusion\\DepthExclusionStrategy' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Exclusion/DepthExclusionStrategy.php', + 'JMS\\Serializer\\Exclusion\\DisjunctExclusionStrategy' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Exclusion/DisjunctExclusionStrategy.php', + 'JMS\\Serializer\\Exclusion\\ExclusionStrategyInterface' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Exclusion/ExclusionStrategyInterface.php', + 'JMS\\Serializer\\Exclusion\\ExpressionLanguageExclusionStrategy' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Exclusion/ExpressionLanguageExclusionStrategy.php', + 'JMS\\Serializer\\Exclusion\\GroupsExclusionStrategy' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Exclusion/GroupsExclusionStrategy.php', + 'JMS\\Serializer\\Exclusion\\VersionExclusionStrategy' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Exclusion/VersionExclusionStrategy.php', + 'JMS\\Serializer\\Expression\\ExpressionEvaluator' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Expression/ExpressionEvaluator.php', + 'JMS\\Serializer\\Expression\\ExpressionEvaluatorInterface' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Expression/ExpressionEvaluatorInterface.php', + 'JMS\\Serializer\\GenericDeserializationVisitor' => $vendorDir . '/jms/serializer/src/JMS/Serializer/GenericDeserializationVisitor.php', + 'JMS\\Serializer\\GenericSerializationVisitor' => $vendorDir . '/jms/serializer/src/JMS/Serializer/GenericSerializationVisitor.php', + 'JMS\\Serializer\\GraphNavigator' => $vendorDir . '/jms/serializer/src/JMS/Serializer/GraphNavigator.php', + 'JMS\\Serializer\\Handler\\ArrayCollectionHandler' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Handler/ArrayCollectionHandler.php', + 'JMS\\Serializer\\Handler\\ConstraintViolationHandler' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Handler/ConstraintViolationHandler.php', + 'JMS\\Serializer\\Handler\\DateHandler' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Handler/DateHandler.php', + 'JMS\\Serializer\\Handler\\FormErrorHandler' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Handler/FormErrorHandler.php', + 'JMS\\Serializer\\Handler\\HandlerRegistry' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Handler/HandlerRegistry.php', + 'JMS\\Serializer\\Handler\\HandlerRegistryInterface' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Handler/HandlerRegistryInterface.php', + 'JMS\\Serializer\\Handler\\LazyHandlerRegistry' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Handler/LazyHandlerRegistry.php', + 'JMS\\Serializer\\Handler\\PhpCollectionHandler' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Handler/PhpCollectionHandler.php', + 'JMS\\Serializer\\Handler\\PropelCollectionHandler' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Handler/PropelCollectionHandler.php', + 'JMS\\Serializer\\Handler\\StdClassHandler' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Handler/StdClassHandler.php', + 'JMS\\Serializer\\Handler\\SubscribingHandlerInterface' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Handler/SubscribingHandlerInterface.php', + 'JMS\\Serializer\\JsonDeserializationVisitor' => $vendorDir . '/jms/serializer/src/JMS/Serializer/JsonDeserializationVisitor.php', + 'JMS\\Serializer\\JsonSerializationVisitor' => $vendorDir . '/jms/serializer/src/JMS/Serializer/JsonSerializationVisitor.php', + 'JMS\\Serializer\\Metadata\\ClassMetadata' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Metadata/ClassMetadata.php', + 'JMS\\Serializer\\Metadata\\Driver\\AbstractDoctrineTypeDriver' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Metadata/Driver/AbstractDoctrineTypeDriver.php', + 'JMS\\Serializer\\Metadata\\Driver\\AnnotationDriver' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Metadata/Driver/AnnotationDriver.php', + 'JMS\\Serializer\\Metadata\\Driver\\DoctrinePHPCRTypeDriver' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Metadata/Driver/DoctrinePHPCRTypeDriver.php', + 'JMS\\Serializer\\Metadata\\Driver\\DoctrineTypeDriver' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Metadata/Driver/DoctrineTypeDriver.php', + 'JMS\\Serializer\\Metadata\\Driver\\PhpDriver' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Metadata/Driver/PhpDriver.php', + 'JMS\\Serializer\\Metadata\\Driver\\XmlDriver' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Metadata/Driver/XmlDriver.php', + 'JMS\\Serializer\\Metadata\\Driver\\YamlDriver' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Metadata/Driver/YamlDriver.php', + 'JMS\\Serializer\\Metadata\\ExpressionPropertyMetadata' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Metadata/ExpressionPropertyMetadata.php', + 'JMS\\Serializer\\Metadata\\PropertyMetadata' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Metadata/PropertyMetadata.php', + 'JMS\\Serializer\\Metadata\\StaticPropertyMetadata' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Metadata/StaticPropertyMetadata.php', + 'JMS\\Serializer\\Metadata\\VirtualPropertyMetadata' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Metadata/VirtualPropertyMetadata.php', + 'JMS\\Serializer\\Naming\\CacheNamingStrategy' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Naming/CacheNamingStrategy.php', + 'JMS\\Serializer\\Naming\\CamelCaseNamingStrategy' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Naming/CamelCaseNamingStrategy.php', + 'JMS\\Serializer\\Naming\\IdenticalPropertyNamingStrategy' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Naming/IdenticalPropertyNamingStrategy.php', + 'JMS\\Serializer\\Naming\\PropertyNamingStrategyInterface' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Naming/PropertyNamingStrategyInterface.php', + 'JMS\\Serializer\\Naming\\SerializedNameAnnotationStrategy' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Naming/SerializedNameAnnotationStrategy.php', + 'JMS\\Serializer\\SerializationContext' => $vendorDir . '/jms/serializer/src/JMS/Serializer/SerializationContext.php', + 'JMS\\Serializer\\Serializer' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Serializer.php', + 'JMS\\Serializer\\SerializerBuilder' => $vendorDir . '/jms/serializer/src/JMS/Serializer/SerializerBuilder.php', + 'JMS\\Serializer\\SerializerInterface' => $vendorDir . '/jms/serializer/src/JMS/Serializer/SerializerInterface.php', + 'JMS\\Serializer\\Twig\\SerializerExtension' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Twig/SerializerExtension.php', + 'JMS\\Serializer\\Twig\\SerializerRuntimeExtension' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Twig/SerializerRuntimeExtension.php', + 'JMS\\Serializer\\Twig\\SerializerRuntimeHelper' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Twig/SerializerRuntimeHelper.php', + 'JMS\\Serializer\\TypeParser' => $vendorDir . '/jms/serializer/src/JMS/Serializer/TypeParser.php', + 'JMS\\Serializer\\Util\\Writer' => $vendorDir . '/jms/serializer/src/JMS/Serializer/Util/Writer.php', + 'JMS\\Serializer\\VisitorInterface' => $vendorDir . '/jms/serializer/src/JMS/Serializer/VisitorInterface.php', + 'JMS\\Serializer\\XmlDeserializationVisitor' => $vendorDir . '/jms/serializer/src/JMS/Serializer/XmlDeserializationVisitor.php', + 'JMS\\Serializer\\XmlSerializationVisitor' => $vendorDir . '/jms/serializer/src/JMS/Serializer/XmlSerializationVisitor.php', + 'JMS\\Serializer\\YamlSerializationVisitor' => $vendorDir . '/jms/serializer/src/JMS/Serializer/YamlSerializationVisitor.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/Highlighter.php', 'Masterminds\\HTML5' => $vendorDir . '/masterminds/html5/src/HTML5.php', 'Masterminds\\HTML5\\Elements' => $vendorDir . '/masterminds/html5/src/HTML5/Elements.php', 'Masterminds\\HTML5\\Entities' => $vendorDir . '/masterminds/html5/src/HTML5/Entities.php', @@ -674,9 +1037,524 @@ return array( 'Masterminds\\HTML5\\Serializer\\OutputRules' => $vendorDir . '/masterminds/html5/src/HTML5/Serializer/OutputRules.php', 'Masterminds\\HTML5\\Serializer\\RulesInterface' => $vendorDir . '/masterminds/html5/src/HTML5/Serializer/RulesInterface.php', 'Masterminds\\HTML5\\Serializer\\Traverser' => $vendorDir . '/masterminds/html5/src/HTML5/Serializer/Traverser.php', + 'Metadata\\AdvancedMetadataFactoryInterface' => $vendorDir . '/jms/metadata/src/Metadata/AdvancedMetadataFactoryInterface.php', + 'Metadata\\Cache\\CacheInterface' => $vendorDir . '/jms/metadata/src/Metadata/Cache/CacheInterface.php', + 'Metadata\\Cache\\DoctrineCacheAdapter' => $vendorDir . '/jms/metadata/src/Metadata/Cache/DoctrineCacheAdapter.php', + 'Metadata\\Cache\\FileCache' => $vendorDir . '/jms/metadata/src/Metadata/Cache/FileCache.php', + 'Metadata\\Cache\\PsrCacheAdapter' => $vendorDir . '/jms/metadata/src/Metadata/Cache/PsrCacheAdapter.php', + 'Metadata\\ClassHierarchyMetadata' => $vendorDir . '/jms/metadata/src/Metadata/ClassHierarchyMetadata.php', + 'Metadata\\ClassMetadata' => $vendorDir . '/jms/metadata/src/Metadata/ClassMetadata.php', + 'Metadata\\Driver\\AbstractFileDriver' => $vendorDir . '/jms/metadata/src/Metadata/Driver/AbstractFileDriver.php', + 'Metadata\\Driver\\AdvancedDriverInterface' => $vendorDir . '/jms/metadata/src/Metadata/Driver/AdvancedDriverInterface.php', + 'Metadata\\Driver\\AdvancedFileLocatorInterface' => $vendorDir . '/jms/metadata/src/Metadata/Driver/AdvancedFileLocatorInterface.php', + 'Metadata\\Driver\\DriverChain' => $vendorDir . '/jms/metadata/src/Metadata/Driver/DriverChain.php', + 'Metadata\\Driver\\DriverInterface' => $vendorDir . '/jms/metadata/src/Metadata/Driver/DriverInterface.php', + 'Metadata\\Driver\\FileLocator' => $vendorDir . '/jms/metadata/src/Metadata/Driver/FileLocator.php', + 'Metadata\\Driver\\FileLocatorInterface' => $vendorDir . '/jms/metadata/src/Metadata/Driver/FileLocatorInterface.php', + 'Metadata\\Driver\\LazyLoadingDriver' => $vendorDir . '/jms/metadata/src/Metadata/Driver/LazyLoadingDriver.php', + 'Metadata\\MergeableClassMetadata' => $vendorDir . '/jms/metadata/src/Metadata/MergeableClassMetadata.php', + 'Metadata\\MergeableInterface' => $vendorDir . '/jms/metadata/src/Metadata/MergeableInterface.php', + 'Metadata\\MetadataFactory' => $vendorDir . '/jms/metadata/src/Metadata/MetadataFactory.php', + 'Metadata\\MetadataFactoryInterface' => $vendorDir . '/jms/metadata/src/Metadata/MetadataFactoryInterface.php', + 'Metadata\\MethodMetadata' => $vendorDir . '/jms/metadata/src/Metadata/MethodMetadata.php', + 'Metadata\\NullMetadata' => $vendorDir . '/jms/metadata/src/Metadata/NullMetadata.php', + 'Metadata\\PropertyMetadata' => $vendorDir . '/jms/metadata/src/Metadata/PropertyMetadata.php', + 'Metadata\\Version' => $vendorDir . '/jms/metadata/src/Metadata/Version.php', 'Michelf\\Markdown' => $vendorDir . '/michelf/php-markdown/Michelf/Markdown.php', 'Michelf\\MarkdownExtra' => $vendorDir . '/michelf/php-markdown/Michelf/MarkdownExtra.php', 'Michelf\\MarkdownInterface' => $vendorDir . '/michelf/php-markdown/Michelf/MarkdownInterface.php', + 'Monolog\\ErrorHandler' => $vendorDir . '/monolog/monolog/src/Monolog/ErrorHandler.php', + 'Monolog\\Formatter\\ChromePHPFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php', + 'Monolog\\Formatter\\ElasticaFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php', + 'Monolog\\Formatter\\FlowdockFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php', + 'Monolog\\Formatter\\FluentdFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php', + 'Monolog\\Formatter\\FormatterInterface' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php', + 'Monolog\\Formatter\\GelfMessageFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php', + 'Monolog\\Formatter\\HtmlFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php', + 'Monolog\\Formatter\\JsonFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php', + 'Monolog\\Formatter\\LineFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/LineFormatter.php', + 'Monolog\\Formatter\\LogglyFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php', + 'Monolog\\Formatter\\LogstashFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php', + 'Monolog\\Formatter\\MongoDBFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php', + 'Monolog\\Formatter\\NormalizerFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php', + 'Monolog\\Formatter\\ScalarFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php', + 'Monolog\\Formatter\\WildfireFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php', + 'Monolog\\Handler\\AbstractHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/AbstractHandler.php', + 'Monolog\\Handler\\AbstractProcessingHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php', + 'Monolog\\Handler\\AbstractSyslogHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php', + 'Monolog\\Handler\\AmqpHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/AmqpHandler.php', + 'Monolog\\Handler\\BrowserConsoleHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php', + 'Monolog\\Handler\\BufferHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/BufferHandler.php', + 'Monolog\\Handler\\ChromePHPHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php', + 'Monolog\\Handler\\CouchDBHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php', + 'Monolog\\Handler\\CubeHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/CubeHandler.php', + 'Monolog\\Handler\\Curl\\Util' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/Curl/Util.php', + 'Monolog\\Handler\\DeduplicationHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php', + 'Monolog\\Handler\\DoctrineCouchDBHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php', + 'Monolog\\Handler\\DynamoDbHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php', + 'Monolog\\Handler\\ElasticSearchHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php', + 'Monolog\\Handler\\ErrorLogHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php', + 'Monolog\\Handler\\FilterHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FilterHandler.php', + 'Monolog\\Handler\\FingersCrossedHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php', + 'Monolog\\Handler\\FingersCrossed\\ActivationStrategyInterface' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php', + 'Monolog\\Handler\\FingersCrossed\\ChannelLevelActivationStrategy' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php', + 'Monolog\\Handler\\FingersCrossed\\ErrorLevelActivationStrategy' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php', + 'Monolog\\Handler\\FirePHPHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php', + 'Monolog\\Handler\\FleepHookHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php', + 'Monolog\\Handler\\FlowdockHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php', + 'Monolog\\Handler\\FormattableHandlerInterface' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.php', + 'Monolog\\Handler\\FormattableHandlerTrait' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.php', + 'Monolog\\Handler\\GelfHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/GelfHandler.php', + 'Monolog\\Handler\\GroupHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/GroupHandler.php', + 'Monolog\\Handler\\HandlerInterface' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/HandlerInterface.php', + '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', + 'Monolog\\Handler\\MandrillHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/MandrillHandler.php', + 'Monolog\\Handler\\MissingExtensionException' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php', + 'Monolog\\Handler\\MongoDBHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php', + 'Monolog\\Handler\\NativeMailerHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php', + 'Monolog\\Handler\\NewRelicHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php', + 'Monolog\\Handler\\NullHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/NullHandler.php', + 'Monolog\\Handler\\PHPConsoleHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php', + 'Monolog\\Handler\\ProcessableHandlerInterface' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.php', + 'Monolog\\Handler\\ProcessableHandlerTrait' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.php', + 'Monolog\\Handler\\PsrHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/PsrHandler.php', + 'Monolog\\Handler\\PushoverHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/PushoverHandler.php', + 'Monolog\\Handler\\RavenHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/RavenHandler.php', + 'Monolog\\Handler\\RedisHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/RedisHandler.php', + 'Monolog\\Handler\\RollbarHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/RollbarHandler.php', + 'Monolog\\Handler\\RotatingFileHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php', + 'Monolog\\Handler\\SamplingHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SamplingHandler.php', + 'Monolog\\Handler\\SlackHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SlackHandler.php', + 'Monolog\\Handler\\SlackWebhookHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php', + 'Monolog\\Handler\\Slack\\SlackRecord' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php', + 'Monolog\\Handler\\SlackbotHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SlackbotHandler.php', + 'Monolog\\Handler\\SocketHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SocketHandler.php', + 'Monolog\\Handler\\StreamHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/StreamHandler.php', + 'Monolog\\Handler\\SwiftMailerHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php', + 'Monolog\\Handler\\SyslogHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SyslogHandler.php', + 'Monolog\\Handler\\SyslogUdpHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php', + 'Monolog\\Handler\\SyslogUdp\\UdpSocket' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php', + 'Monolog\\Handler\\TestHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/TestHandler.php', + 'Monolog\\Handler\\WhatFailureGroupHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php', + 'Monolog\\Handler\\ZendMonitorHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php', + 'Monolog\\Logger' => $vendorDir . '/monolog/monolog/src/Monolog/Logger.php', + 'Monolog\\Processor\\GitProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/GitProcessor.php', + 'Monolog\\Processor\\IntrospectionProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php', + 'Monolog\\Processor\\MemoryPeakUsageProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php', + 'Monolog\\Processor\\MemoryProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php', + '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', + 'Neutron\\TemporaryFilesystem\\IOException' => $vendorDir . '/neutron/temporary-filesystem/src/Neutron/TemporaryFilesystem/IOException.php', + 'Neutron\\TemporaryFilesystem\\Manager' => $vendorDir . '/neutron/temporary-filesystem/src/Neutron/TemporaryFilesystem/Manager.php', + 'Neutron\\TemporaryFilesystem\\TemporaryFilesystem' => $vendorDir . '/neutron/temporary-filesystem/src/Neutron/TemporaryFilesystem/TemporaryFilesystem.php', + 'Neutron\\TemporaryFilesystem\\TemporaryFilesystemInterface' => $vendorDir . '/neutron/temporary-filesystem/src/Neutron/TemporaryFilesystem/TemporaryFilesystemInterface.php', + 'PHPUnit\\Exception' => $vendorDir . '/phpunit/phpunit/src/Exception.php', + 'PHPUnit\\Framework\\Assert' => $vendorDir . '/phpunit/phpunit/src/Framework/Assert.php', + 'PHPUnit\\Framework\\AssertionFailedError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/AssertionFailedError.php', + 'PHPUnit\\Framework\\CodeCoverageException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/CodeCoverageException.php', + 'PHPUnit\\Framework\\Constraint\\ArrayHasKey' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ArrayHasKey.php', + 'PHPUnit\\Framework\\Constraint\\ArraySubset' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ArraySubset.php', + 'PHPUnit\\Framework\\Constraint\\Attribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Attribute.php', + 'PHPUnit\\Framework\\Constraint\\Callback' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Callback.php', + 'PHPUnit\\Framework\\Constraint\\ClassHasAttribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ClassHasAttribute.php', + 'PHPUnit\\Framework\\Constraint\\ClassHasStaticAttribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ClassHasStaticAttribute.php', + 'PHPUnit\\Framework\\Constraint\\Composite' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Composite.php', + 'PHPUnit\\Framework\\Constraint\\Constraint' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Constraint.php', + 'PHPUnit\\Framework\\Constraint\\Count' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Count.php', + 'PHPUnit\\Framework\\Constraint\\DirectoryExists' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/DirectoryExists.php', + 'PHPUnit\\Framework\\Constraint\\Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Exception.php', + 'PHPUnit\\Framework\\Constraint\\ExceptionCode' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ExceptionCode.php', + 'PHPUnit\\Framework\\Constraint\\ExceptionMessage' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessage.php', + 'PHPUnit\\Framework\\Constraint\\ExceptionMessageRegularExpression' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessageRegularExpression.php', + 'PHPUnit\\Framework\\Constraint\\FileExists' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/FileExists.php', + 'PHPUnit\\Framework\\Constraint\\GreaterThan' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/GreaterThan.php', + 'PHPUnit\\Framework\\Constraint\\IsAnything' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsAnything.php', + 'PHPUnit\\Framework\\Constraint\\IsEmpty' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsEmpty.php', + 'PHPUnit\\Framework\\Constraint\\IsEqual' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsEqual.php', + 'PHPUnit\\Framework\\Constraint\\IsFalse' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsFalse.php', + 'PHPUnit\\Framework\\Constraint\\IsFinite' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsFinite.php', + 'PHPUnit\\Framework\\Constraint\\IsIdentical' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php', + 'PHPUnit\\Framework\\Constraint\\IsInfinite' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsInfinite.php', + 'PHPUnit\\Framework\\Constraint\\IsInstanceOf' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsInstanceOf.php', + 'PHPUnit\\Framework\\Constraint\\IsJson' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsJson.php', + 'PHPUnit\\Framework\\Constraint\\IsNan' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsNan.php', + 'PHPUnit\\Framework\\Constraint\\IsNull' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsNull.php', + 'PHPUnit\\Framework\\Constraint\\IsReadable' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsReadable.php', + 'PHPUnit\\Framework\\Constraint\\IsTrue' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsTrue.php', + 'PHPUnit\\Framework\\Constraint\\IsType' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsType.php', + 'PHPUnit\\Framework\\Constraint\\IsWritable' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsWritable.php', + 'PHPUnit\\Framework\\Constraint\\JsonMatches' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php', + 'PHPUnit\\Framework\\Constraint\\JsonMatchesErrorMessageProvider' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/JsonMatchesErrorMessageProvider.php', + 'PHPUnit\\Framework\\Constraint\\LessThan' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/LessThan.php', + 'PHPUnit\\Framework\\Constraint\\LogicalAnd' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/LogicalAnd.php', + 'PHPUnit\\Framework\\Constraint\\LogicalNot' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/LogicalNot.php', + 'PHPUnit\\Framework\\Constraint\\LogicalOr' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/LogicalOr.php', + 'PHPUnit\\Framework\\Constraint\\LogicalXor' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/LogicalXor.php', + 'PHPUnit\\Framework\\Constraint\\ObjectHasAttribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ObjectHasAttribute.php', + 'PHPUnit\\Framework\\Constraint\\RegularExpression' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/RegularExpression.php', + 'PHPUnit\\Framework\\Constraint\\SameSize' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/SameSize.php', + 'PHPUnit\\Framework\\Constraint\\StringContains' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringContains.php', + 'PHPUnit\\Framework\\Constraint\\StringEndsWith' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringEndsWith.php', + 'PHPUnit\\Framework\\Constraint\\StringMatchesFormatDescription' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringMatchesFormatDescription.php', + 'PHPUnit\\Framework\\Constraint\\StringStartsWith' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringStartsWith.php', + 'PHPUnit\\Framework\\Constraint\\TraversableContains' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/TraversableContains.php', + 'PHPUnit\\Framework\\Constraint\\TraversableContainsEqual' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/TraversableContainsEqual.php', + 'PHPUnit\\Framework\\Constraint\\TraversableContainsIdentical' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/TraversableContainsIdentical.php', + 'PHPUnit\\Framework\\Constraint\\TraversableContainsOnly' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/TraversableContainsOnly.php', + 'PHPUnit\\Framework\\CoveredCodeNotExecutedException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/CoveredCodeNotExecutedException.php', + 'PHPUnit\\Framework\\DataProviderTestSuite' => $vendorDir . '/phpunit/phpunit/src/Framework/DataProviderTestSuite.php', + 'PHPUnit\\Framework\\Error\\Deprecated' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Deprecated.php', + 'PHPUnit\\Framework\\Error\\Error' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Error.php', + 'PHPUnit\\Framework\\Error\\Notice' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Notice.php', + 'PHPUnit\\Framework\\Error\\Warning' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Warning.php', + 'PHPUnit\\Framework\\Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/Exception.php', + 'PHPUnit\\Framework\\ExceptionWrapper' => $vendorDir . '/phpunit/phpunit/src/Framework/ExceptionWrapper.php', + 'PHPUnit\\Framework\\ExpectationFailedException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/ExpectationFailedException.php', + 'PHPUnit\\Framework\\IncompleteTest' => $vendorDir . '/phpunit/phpunit/src/Framework/IncompleteTest.php', + 'PHPUnit\\Framework\\IncompleteTestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/IncompleteTestCase.php', + 'PHPUnit\\Framework\\IncompleteTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/IncompleteTestError.php', + 'PHPUnit\\Framework\\InvalidArgumentException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/InvalidArgumentException.php', + 'PHPUnit\\Framework\\InvalidCoversTargetException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/InvalidCoversTargetException.php', + 'PHPUnit\\Framework\\InvalidDataProviderException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/InvalidDataProviderException.php', + 'PHPUnit\\Framework\\InvalidParameterGroupException' => $vendorDir . '/phpunit/phpunit/src/Framework/InvalidParameterGroupException.php', + 'PHPUnit\\Framework\\MissingCoversAnnotationException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/MissingCoversAnnotationException.php', + 'PHPUnit\\Framework\\MockObject\\Api' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Api/Api.php', + 'PHPUnit\\Framework\\MockObject\\BadMethodCallException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/BadMethodCallException.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\Identity' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/Identity.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\InvocationMocker' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationMocker.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\InvocationStubber' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationStubber.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\Match' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/Match.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\MethodNameMatch' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/MethodNameMatch.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\ParametersMatch' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/ParametersMatch.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\Stub' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/Stub.php', + 'PHPUnit\\Framework\\MockObject\\ConfigurableMethod' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/ConfigurableMethod.php', + 'PHPUnit\\Framework\\MockObject\\ConfigurableMethodsAlreadyInitializedException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/ConfigurableMethodsAlreadyInitializedException.php', + 'PHPUnit\\Framework\\MockObject\\Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/Exception.php', + 'PHPUnit\\Framework\\MockObject\\Generator' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator.php', + 'PHPUnit\\Framework\\MockObject\\IncompatibleReturnValueException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/IncompatibleReturnValueException.php', + 'PHPUnit\\Framework\\MockObject\\Invocation' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Invocation.php', + 'PHPUnit\\Framework\\MockObject\\InvocationHandler' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/InvocationHandler.php', + 'PHPUnit\\Framework\\MockObject\\Matcher' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Matcher.php', + 'PHPUnit\\Framework\\MockObject\\Method' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Api/Method.php', + 'PHPUnit\\Framework\\MockObject\\MethodNameConstraint' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MethodNameConstraint.php', + 'PHPUnit\\Framework\\MockObject\\MockBuilder' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php', + 'PHPUnit\\Framework\\MockObject\\MockClass' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockClass.php', + 'PHPUnit\\Framework\\MockObject\\MockMethod' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockMethod.php', + 'PHPUnit\\Framework\\MockObject\\MockMethodSet' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockMethodSet.php', + 'PHPUnit\\Framework\\MockObject\\MockObject' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockObject.php', + 'PHPUnit\\Framework\\MockObject\\MockTrait' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockTrait.php', + 'PHPUnit\\Framework\\MockObject\\MockType' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockType.php', + 'PHPUnit\\Framework\\MockObject\\MockedCloneMethod' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Api/MockedCloneMethod.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\AnyInvokedCount' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/AnyInvokedCount.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\AnyParameters' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/AnyParameters.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\ConsecutiveParameters' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/ConsecutiveParameters.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\InvocationOrder' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvocationOrder.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtIndex' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtIndex.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtLeastCount' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastCount.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtLeastOnce' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastOnce.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtMostCount' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtMostCount.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedCount' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedCount.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\MethodName' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/MethodName.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\Parameters' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/Parameters.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\ParametersRule' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/ParametersRule.php', + 'PHPUnit\\Framework\\MockObject\\RuntimeException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/RuntimeException.php', + 'PHPUnit\\Framework\\MockObject\\Stub' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ConsecutiveCalls' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ConsecutiveCalls.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/Exception.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnArgument' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnArgument.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnCallback' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnCallback.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnReference' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnReference.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnSelf' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnSelf.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnStub' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnStub.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnValueMap' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnValueMap.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\Stub' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/Stub.php', + 'PHPUnit\\Framework\\MockObject\\UnmockedCloneMethod' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Api/UnmockedCloneMethod.php', + 'PHPUnit\\Framework\\MockObject\\Verifiable' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Verifiable.php', + 'PHPUnit\\Framework\\NoChildTestSuiteException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/NoChildTestSuiteException.php', + 'PHPUnit\\Framework\\OutputError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/OutputError.php', + 'PHPUnit\\Framework\\PHPTAssertionFailedError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/PHPTAssertionFailedError.php', + 'PHPUnit\\Framework\\RiskyTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/RiskyTestError.php', + 'PHPUnit\\Framework\\SelfDescribing' => $vendorDir . '/phpunit/phpunit/src/Framework/SelfDescribing.php', + 'PHPUnit\\Framework\\SkippedTest' => $vendorDir . '/phpunit/phpunit/src/Framework/SkippedTest.php', + 'PHPUnit\\Framework\\SkippedTestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/SkippedTestCase.php', + 'PHPUnit\\Framework\\SkippedTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/SkippedTestError.php', + 'PHPUnit\\Framework\\SkippedTestSuiteError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/SkippedTestSuiteError.php', + 'PHPUnit\\Framework\\SyntheticError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/SyntheticError.php', + 'PHPUnit\\Framework\\SyntheticSkippedError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/SyntheticSkippedError.php', + 'PHPUnit\\Framework\\Test' => $vendorDir . '/phpunit/phpunit/src/Framework/Test.php', + 'PHPUnit\\Framework\\TestBuilder' => $vendorDir . '/phpunit/phpunit/src/Framework/TestBuilder.php', + 'PHPUnit\\Framework\\TestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/TestCase.php', + 'PHPUnit\\Framework\\TestFailure' => $vendorDir . '/phpunit/phpunit/src/Framework/TestFailure.php', + 'PHPUnit\\Framework\\TestListener' => $vendorDir . '/phpunit/phpunit/src/Framework/TestListener.php', + 'PHPUnit\\Framework\\TestListenerDefaultImplementation' => $vendorDir . '/phpunit/phpunit/src/Framework/TestListenerDefaultImplementation.php', + 'PHPUnit\\Framework\\TestResult' => $vendorDir . '/phpunit/phpunit/src/Framework/TestResult.php', + 'PHPUnit\\Framework\\TestSuite' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSuite.php', + 'PHPUnit\\Framework\\TestSuiteIterator' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSuiteIterator.php', + 'PHPUnit\\Framework\\UnintentionallyCoveredCodeError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/UnintentionallyCoveredCodeError.php', + 'PHPUnit\\Framework\\Warning' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/Warning.php', + 'PHPUnit\\Framework\\WarningTestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/WarningTestCase.php', + 'PHPUnit\\Runner\\AfterIncompleteTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterIncompleteTestHook.php', + 'PHPUnit\\Runner\\AfterLastTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterLastTestHook.php', + 'PHPUnit\\Runner\\AfterRiskyTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterRiskyTestHook.php', + 'PHPUnit\\Runner\\AfterSkippedTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterSkippedTestHook.php', + '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', + 'PHPUnit\\Runner\\BeforeTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/BeforeTestHook.php', + 'PHPUnit\\Runner\\DefaultTestResultCache' => $vendorDir . '/phpunit/phpunit/src/Runner/DefaultTestResultCache.php', + 'PHPUnit\\Runner\\Exception' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception.php', + 'PHPUnit\\Runner\\Filter\\ExcludeGroupFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/ExcludeGroupFilterIterator.php', + 'PHPUnit\\Runner\\Filter\\Factory' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Factory.php', + 'PHPUnit\\Runner\\Filter\\GroupFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php', + 'PHPUnit\\Runner\\Filter\\IncludeGroupFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/IncludeGroupFilterIterator.php', + 'PHPUnit\\Runner\\Filter\\NameFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php', + 'PHPUnit\\Runner\\Hook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/Hook.php', + 'PHPUnit\\Runner\\NullTestResultCache' => $vendorDir . '/phpunit/phpunit/src/Runner/NullTestResultCache.php', + 'PHPUnit\\Runner\\PhptTestCase' => $vendorDir . '/phpunit/phpunit/src/Runner/PhptTestCase.php', + 'PHPUnit\\Runner\\ResultCacheExtension' => $vendorDir . '/phpunit/phpunit/src/Runner/ResultCacheExtension.php', + 'PHPUnit\\Runner\\StandardTestSuiteLoader' => $vendorDir . '/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php', + 'PHPUnit\\Runner\\TestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/TestHook.php', + 'PHPUnit\\Runner\\TestListenerAdapter' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/TestListenerAdapter.php', + 'PHPUnit\\Runner\\TestResultCache' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResultCache.php', + 'PHPUnit\\Runner\\TestSuiteLoader' => $vendorDir . '/phpunit/phpunit/src/Runner/TestSuiteLoader.php', + 'PHPUnit\\Runner\\TestSuiteSorter' => $vendorDir . '/phpunit/phpunit/src/Runner/TestSuiteSorter.php', + 'PHPUnit\\Runner\\Version' => $vendorDir . '/phpunit/phpunit/src/Runner/Version.php', + 'PHPUnit\\TextUI\\Command' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command.php', + 'PHPUnit\\TextUI\\Exception' => $vendorDir . '/phpunit/phpunit/src/TextUI/Exception.php', + 'PHPUnit\\TextUI\\Help' => $vendorDir . '/phpunit/phpunit/src/TextUI/Help.php', + 'PHPUnit\\TextUI\\ResultPrinter' => $vendorDir . '/phpunit/phpunit/src/TextUI/ResultPrinter.php', + 'PHPUnit\\TextUI\\TestRunner' => $vendorDir . '/phpunit/phpunit/src/TextUI/TestRunner.php', + 'PHPUnit\\Util\\Annotation\\DocBlock' => $vendorDir . '/phpunit/phpunit/src/Util/Annotation/DocBlock.php', + 'PHPUnit\\Util\\Annotation\\Registry' => $vendorDir . '/phpunit/phpunit/src/Util/Annotation/Registry.php', + 'PHPUnit\\Util\\Blacklist' => $vendorDir . '/phpunit/phpunit/src/Util/Blacklist.php', + 'PHPUnit\\Util\\Color' => $vendorDir . '/phpunit/phpunit/src/Util/Color.php', + 'PHPUnit\\Util\\Configuration' => $vendorDir . '/phpunit/phpunit/src/Util/Configuration.php', + 'PHPUnit\\Util\\ConfigurationGenerator' => $vendorDir . '/phpunit/phpunit/src/Util/ConfigurationGenerator.php', + 'PHPUnit\\Util\\ErrorHandler' => $vendorDir . '/phpunit/phpunit/src/Util/ErrorHandler.php', + 'PHPUnit\\Util\\Exception' => $vendorDir . '/phpunit/phpunit/src/Util/Exception.php', + 'PHPUnit\\Util\\FileLoader' => $vendorDir . '/phpunit/phpunit/src/Util/FileLoader.php', + 'PHPUnit\\Util\\Filesystem' => $vendorDir . '/phpunit/phpunit/src/Util/Filesystem.php', + 'PHPUnit\\Util\\Filter' => $vendorDir . '/phpunit/phpunit/src/Util/Filter.php', + 'PHPUnit\\Util\\Getopt' => $vendorDir . '/phpunit/phpunit/src/Util/Getopt.php', + 'PHPUnit\\Util\\GlobalState' => $vendorDir . '/phpunit/phpunit/src/Util/GlobalState.php', + 'PHPUnit\\Util\\InvalidDataSetException' => $vendorDir . '/phpunit/phpunit/src/Util/InvalidDataSetException.php', + 'PHPUnit\\Util\\Json' => $vendorDir . '/phpunit/phpunit/src/Util/Json.php', + 'PHPUnit\\Util\\Log\\JUnit' => $vendorDir . '/phpunit/phpunit/src/Util/Log/JUnit.php', + 'PHPUnit\\Util\\Log\\TeamCity' => $vendorDir . '/phpunit/phpunit/src/Util/Log/TeamCity.php', + 'PHPUnit\\Util\\PHP\\AbstractPhpProcess' => $vendorDir . '/phpunit/phpunit/src/Util/PHP/AbstractPhpProcess.php', + 'PHPUnit\\Util\\PHP\\DefaultPhpProcess' => $vendorDir . '/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php', + 'PHPUnit\\Util\\PHP\\WindowsPhpProcess' => $vendorDir . '/phpunit/phpunit/src/Util/PHP/WindowsPhpProcess.php', + 'PHPUnit\\Util\\Printer' => $vendorDir . '/phpunit/phpunit/src/Util/Printer.php', + 'PHPUnit\\Util\\RegularExpression' => $vendorDir . '/phpunit/phpunit/src/Util/RegularExpression.php', + 'PHPUnit\\Util\\Test' => $vendorDir . '/phpunit/phpunit/src/Util/Test.php', + 'PHPUnit\\Util\\TestDox\\CliTestDoxPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php', + 'PHPUnit\\Util\\TestDox\\HtmlResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/HtmlResultPrinter.php', + 'PHPUnit\\Util\\TestDox\\NamePrettifier' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php', + 'PHPUnit\\Util\\TestDox\\ResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter.php', + 'PHPUnit\\Util\\TestDox\\TestDoxPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/TestDoxPrinter.php', + 'PHPUnit\\Util\\TestDox\\TextResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/TextResultPrinter.php', + 'PHPUnit\\Util\\TestDox\\XmlResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/XmlResultPrinter.php', + 'PHPUnit\\Util\\TextTestListRenderer' => $vendorDir . '/phpunit/phpunit/src/Util/TextTestListRenderer.php', + 'PHPUnit\\Util\\Type' => $vendorDir . '/phpunit/phpunit/src/Util/Type.php', + 'PHPUnit\\Util\\VersionComparisonOperator' => $vendorDir . '/phpunit/phpunit/src/Util/VersionComparisonOperator.php', + 'PHPUnit\\Util\\XdebugFilterScriptGenerator' => $vendorDir . '/phpunit/phpunit/src/Util/XdebugFilterScriptGenerator.php', + 'PHPUnit\\Util\\Xml' => $vendorDir . '/phpunit/phpunit/src/Util/Xml.php', + 'PHPUnit\\Util\\XmlTestListRenderer' => $vendorDir . '/phpunit/phpunit/src/Util/XmlTestListRenderer.php', + 'PHP_Token' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_TokenWithScope' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_TokenWithScopeAndVisibility' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ABSTRACT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_AMPERSAND' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_AND_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ARRAY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ARRAY_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_AS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_AT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BACKTICK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BAD_CHARACTER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BOOLEAN_AND' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BOOLEAN_OR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BOOL_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BREAK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CALLABLE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CARET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CASE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CATCH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CHARACTER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLASS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLASS_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLASS_NAME_CONSTANT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLONE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLOSE_BRACKET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLOSE_CURLY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLOSE_SQUARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLOSE_TAG' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_COALESCE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_COALESCE_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_COLON' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_COMMA' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_COMMENT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CONCAT_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CONST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CONSTANT_ENCAPSED_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CONTINUE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CURLY_OPEN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DEC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DECLARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DEFAULT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DIR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DIV' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DIV_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DNUMBER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOC_COMMENT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOLLAR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOLLAR_OPEN_CURLY_BRACES' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOUBLE_ARROW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOUBLE_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOUBLE_COLON' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOUBLE_QUOTES' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ECHO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ELLIPSIS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ELSE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ELSEIF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EMPTY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENCAPSED_AND_WHITESPACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDDECLARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDFOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDFOREACH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDIF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDSWITCH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDWHILE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_END_HEREDOC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EVAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EXCLAMATION_MARK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EXIT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EXTENDS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FILE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FINAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FINALLY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FOREACH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FUNCTION' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FUNC_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_GLOBAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_GOTO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_GT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_HALT_COMPILER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IMPLEMENTS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INCLUDE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INCLUDE_ONCE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INLINE_HTML' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INSTANCEOF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INSTEADOF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INTERFACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INT_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ISSET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_GREATER_OR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_IDENTICAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_NOT_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_NOT_IDENTICAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_SMALLER_OR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_Includes' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LINE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LIST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LNUMBER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LOGICAL_AND' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LOGICAL_OR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LOGICAL_XOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_METHOD_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_MINUS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_MINUS_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_MOD_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_MULT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_MUL_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_NAMESPACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_NEW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_NS_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_NS_SEPARATOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_NUM_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OBJECT_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OBJECT_OPERATOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OPEN_BRACKET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OPEN_CURLY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OPEN_SQUARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OPEN_TAG' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OPEN_TAG_WITH_ECHO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PAAMAYIM_NEKUDOTAYIM' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PERCENT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PIPE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PLUS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PLUS_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_POW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_POW_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PRINT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PRIVATE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PROTECTED' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PUBLIC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_QUESTION_MARK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_REQUIRE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_REQUIRE_ONCE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_RETURN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SEMICOLON' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SL_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SPACESHIP' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_START_HEREDOC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_STATIC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_STRING_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_STRING_VARNAME' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SWITCH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_Stream' => $vendorDir . '/phpunit/php-token-stream/src/Token/Stream.php', + 'PHP_Token_Stream_CachingFactory' => $vendorDir . '/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php', + 'PHP_Token_THROW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_TILDE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_TRAIT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_TRAIT_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_TRY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_UNSET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_UNSET_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_USE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_USE_FUNCTION' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_Util' => $vendorDir . '/phpunit/php-token-stream/src/Token/Util.php', + 'PHP_Token_VAR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_VARIABLE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_WHILE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_WHITESPACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_XOR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_YIELD' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_YIELD_FROM' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'ParagonIE\\ConstantTime\\Base32' => $vendorDir . '/paragonie/constant_time_encoding/src/Base32.php', 'ParagonIE\\ConstantTime\\Base32Hex' => $vendorDir . '/paragonie/constant_time_encoding/src/Base32Hex.php', 'ParagonIE\\ConstantTime\\Base64' => $vendorDir . '/paragonie/constant_time_encoding/src/Base64.php', @@ -688,6 +1566,97 @@ return array( 'ParagonIE\\ConstantTime\\Encoding' => $vendorDir . '/paragonie/constant_time_encoding/src/Encoding.php', 'ParagonIE\\ConstantTime\\Hex' => $vendorDir . '/paragonie/constant_time_encoding/src/Hex.php', 'ParagonIE\\ConstantTime\\RFC4648' => $vendorDir . '/paragonie/constant_time_encoding/src/RFC4648.php', + 'Parsedown' => $vendorDir . '/erusev/parsedown/Parsedown.php', + 'PharIo\\Manifest\\Application' => $vendorDir . '/phar-io/manifest/src/values/Application.php', + 'PharIo\\Manifest\\ApplicationName' => $vendorDir . '/phar-io/manifest/src/values/ApplicationName.php', + 'PharIo\\Manifest\\Author' => $vendorDir . '/phar-io/manifest/src/values/Author.php', + 'PharIo\\Manifest\\AuthorCollection' => $vendorDir . '/phar-io/manifest/src/values/AuthorCollection.php', + 'PharIo\\Manifest\\AuthorCollectionIterator' => $vendorDir . '/phar-io/manifest/src/values/AuthorCollectionIterator.php', + 'PharIo\\Manifest\\AuthorElement' => $vendorDir . '/phar-io/manifest/src/xml/AuthorElement.php', + 'PharIo\\Manifest\\AuthorElementCollection' => $vendorDir . '/phar-io/manifest/src/xml/AuthorElementCollection.php', + 'PharIo\\Manifest\\BundledComponent' => $vendorDir . '/phar-io/manifest/src/values/BundledComponent.php', + 'PharIo\\Manifest\\BundledComponentCollection' => $vendorDir . '/phar-io/manifest/src/values/BundledComponentCollection.php', + 'PharIo\\Manifest\\BundledComponentCollectionIterator' => $vendorDir . '/phar-io/manifest/src/values/BundledComponentCollectionIterator.php', + 'PharIo\\Manifest\\BundlesElement' => $vendorDir . '/phar-io/manifest/src/xml/BundlesElement.php', + 'PharIo\\Manifest\\ComponentElement' => $vendorDir . '/phar-io/manifest/src/xml/ComponentElement.php', + 'PharIo\\Manifest\\ComponentElementCollection' => $vendorDir . '/phar-io/manifest/src/xml/ComponentElementCollection.php', + 'PharIo\\Manifest\\ContainsElement' => $vendorDir . '/phar-io/manifest/src/xml/ContainsElement.php', + 'PharIo\\Manifest\\CopyrightElement' => $vendorDir . '/phar-io/manifest/src/xml/CopyrightElement.php', + 'PharIo\\Manifest\\CopyrightInformation' => $vendorDir . '/phar-io/manifest/src/values/CopyrightInformation.php', + 'PharIo\\Manifest\\ElementCollection' => $vendorDir . '/phar-io/manifest/src/xml/ElementCollection.php', + 'PharIo\\Manifest\\Email' => $vendorDir . '/phar-io/manifest/src/values/Email.php', + 'PharIo\\Manifest\\Exception' => $vendorDir . '/phar-io/manifest/src/exceptions/Exception.php', + 'PharIo\\Manifest\\ExtElement' => $vendorDir . '/phar-io/manifest/src/xml/ExtElement.php', + 'PharIo\\Manifest\\ExtElementCollection' => $vendorDir . '/phar-io/manifest/src/xml/ExtElementCollection.php', + 'PharIo\\Manifest\\Extension' => $vendorDir . '/phar-io/manifest/src/values/Extension.php', + 'PharIo\\Manifest\\ExtensionElement' => $vendorDir . '/phar-io/manifest/src/xml/ExtensionElement.php', + 'PharIo\\Manifest\\InvalidApplicationNameException' => $vendorDir . '/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php', + 'PharIo\\Manifest\\InvalidEmailException' => $vendorDir . '/phar-io/manifest/src/exceptions/InvalidEmailException.php', + 'PharIo\\Manifest\\InvalidUrlException' => $vendorDir . '/phar-io/manifest/src/exceptions/InvalidUrlException.php', + 'PharIo\\Manifest\\Library' => $vendorDir . '/phar-io/manifest/src/values/Library.php', + 'PharIo\\Manifest\\License' => $vendorDir . '/phar-io/manifest/src/values/License.php', + 'PharIo\\Manifest\\LicenseElement' => $vendorDir . '/phar-io/manifest/src/xml/LicenseElement.php', + 'PharIo\\Manifest\\Manifest' => $vendorDir . '/phar-io/manifest/src/values/Manifest.php', + 'PharIo\\Manifest\\ManifestDocument' => $vendorDir . '/phar-io/manifest/src/xml/ManifestDocument.php', + 'PharIo\\Manifest\\ManifestDocumentException' => $vendorDir . '/phar-io/manifest/src/exceptions/ManifestDocumentException.php', + 'PharIo\\Manifest\\ManifestDocumentLoadingException' => $vendorDir . '/phar-io/manifest/src/xml/ManifestDocumentLoadingException.php', + 'PharIo\\Manifest\\ManifestDocumentMapper' => $vendorDir . '/phar-io/manifest/src/ManifestDocumentMapper.php', + 'PharIo\\Manifest\\ManifestDocumentMapperException' => $vendorDir . '/phar-io/manifest/src/exceptions/ManifestDocumentMapperException.php', + 'PharIo\\Manifest\\ManifestElement' => $vendorDir . '/phar-io/manifest/src/xml/ManifestElement.php', + 'PharIo\\Manifest\\ManifestElementException' => $vendorDir . '/phar-io/manifest/src/exceptions/ManifestElementException.php', + 'PharIo\\Manifest\\ManifestLoader' => $vendorDir . '/phar-io/manifest/src/ManifestLoader.php', + 'PharIo\\Manifest\\ManifestLoaderException' => $vendorDir . '/phar-io/manifest/src/exceptions/ManifestLoaderException.php', + 'PharIo\\Manifest\\ManifestSerializer' => $vendorDir . '/phar-io/manifest/src/ManifestSerializer.php', + 'PharIo\\Manifest\\PhpElement' => $vendorDir . '/phar-io/manifest/src/xml/PhpElement.php', + 'PharIo\\Manifest\\PhpExtensionRequirement' => $vendorDir . '/phar-io/manifest/src/values/PhpExtensionRequirement.php', + 'PharIo\\Manifest\\PhpVersionRequirement' => $vendorDir . '/phar-io/manifest/src/values/PhpVersionRequirement.php', + 'PharIo\\Manifest\\Requirement' => $vendorDir . '/phar-io/manifest/src/values/Requirement.php', + 'PharIo\\Manifest\\RequirementCollection' => $vendorDir . '/phar-io/manifest/src/values/RequirementCollection.php', + 'PharIo\\Manifest\\RequirementCollectionIterator' => $vendorDir . '/phar-io/manifest/src/values/RequirementCollectionIterator.php', + 'PharIo\\Manifest\\RequiresElement' => $vendorDir . '/phar-io/manifest/src/xml/RequiresElement.php', + 'PharIo\\Manifest\\Type' => $vendorDir . '/phar-io/manifest/src/values/Type.php', + 'PharIo\\Manifest\\Url' => $vendorDir . '/phar-io/manifest/src/values/Url.php', + 'PharIo\\Version\\AbstractVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/AbstractVersionConstraint.php', + 'PharIo\\Version\\AndVersionConstraintGroup' => $vendorDir . '/phar-io/version/src/constraints/AndVersionConstraintGroup.php', + 'PharIo\\Version\\AnyVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/AnyVersionConstraint.php', + 'PharIo\\Version\\ExactVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/ExactVersionConstraint.php', + 'PharIo\\Version\\Exception' => $vendorDir . '/phar-io/version/src/exceptions/Exception.php', + 'PharIo\\Version\\GreaterThanOrEqualToVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php', + 'PharIo\\Version\\InvalidPreReleaseSuffixException' => $vendorDir . '/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php', + 'PharIo\\Version\\InvalidVersionException' => $vendorDir . '/phar-io/version/src/exceptions/InvalidVersionException.php', + 'PharIo\\Version\\OrVersionConstraintGroup' => $vendorDir . '/phar-io/version/src/constraints/OrVersionConstraintGroup.php', + 'PharIo\\Version\\PreReleaseSuffix' => $vendorDir . '/phar-io/version/src/PreReleaseSuffix.php', + 'PharIo\\Version\\SpecificMajorAndMinorVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php', + 'PharIo\\Version\\SpecificMajorVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php', + 'PharIo\\Version\\UnsupportedVersionConstraintException' => $vendorDir . '/phar-io/version/src/exceptions/UnsupportedVersionConstraintException.php', + 'PharIo\\Version\\Version' => $vendorDir . '/phar-io/version/src/Version.php', + 'PharIo\\Version\\VersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/VersionConstraint.php', + 'PharIo\\Version\\VersionConstraintParser' => $vendorDir . '/phar-io/version/src/VersionConstraintParser.php', + 'PharIo\\Version\\VersionConstraintValue' => $vendorDir . '/phar-io/version/src/VersionConstraintValue.php', + 'PharIo\\Version\\VersionNumber' => $vendorDir . '/phar-io/version/src/VersionNumber.php', + 'PhpCollection\\AbstractCollection' => $vendorDir . '/phpcollection/phpcollection/src/PhpCollection/AbstractCollection.php', + 'PhpCollection\\AbstractMap' => $vendorDir . '/phpcollection/phpcollection/src/PhpCollection/AbstractMap.php', + 'PhpCollection\\AbstractSequence' => $vendorDir . '/phpcollection/phpcollection/src/PhpCollection/AbstractSequence.php', + 'PhpCollection\\CollectionInterface' => $vendorDir . '/phpcollection/phpcollection/src/PhpCollection/CollectionInterface.php', + 'PhpCollection\\EntityLikeObject' => $vendorDir . '/phpcollection/phpcollection/src/PhpCollection/EntityLikeObject.php', + 'PhpCollection\\Map' => $vendorDir . '/phpcollection/phpcollection/src/PhpCollection/Map.php', + 'PhpCollection\\MapInterface' => $vendorDir . '/phpcollection/phpcollection/src/PhpCollection/MapInterface.php', + 'PhpCollection\\ObjectBasics' => $vendorDir . '/phpcollection/phpcollection/src/PhpCollection/ObjectBasics.php', + 'PhpCollection\\ObjectBasicsHandler' => $vendorDir . '/phpcollection/phpcollection/src/PhpCollection/ObjectBasicsHandler.php', + 'PhpCollection\\ObjectBasicsHandlerRegistry' => $vendorDir . '/phpcollection/phpcollection/src/PhpCollection/ObjectBasicsHandlerRegistry.php', + 'PhpCollection\\ObjectBasicsHandler\\DateTimeHandler' => $vendorDir . '/phpcollection/phpcollection/src/PhpCollection/ObjectBasicsHandler/DateTimeHandler.php', + 'PhpCollection\\ObjectBasicsHandler\\IdentityHandler' => $vendorDir . '/phpcollection/phpcollection/src/PhpCollection/ObjectBasicsHandler/IdentityHandler.php', + 'PhpCollection\\Sequence' => $vendorDir . '/phpcollection/phpcollection/src/PhpCollection/Sequence.php', + 'PhpCollection\\SequenceInterface' => $vendorDir . '/phpcollection/phpcollection/src/PhpCollection/SequenceInterface.php', + 'PhpCollection\\Set' => $vendorDir . '/phpcollection/phpcollection/src/PhpCollection/Set.php', + 'PhpCollection\\SetInterface' => $vendorDir . '/phpcollection/phpcollection/src/PhpCollection/SetInterface.php', + 'PhpCollection\\SortableInterface' => $vendorDir . '/phpcollection/phpcollection/src/PhpCollection/SortableInterface.php', + 'PhpCollection\\SortedSequence' => $vendorDir . '/phpcollection/phpcollection/src/PhpCollection/SortedSequence.php', + 'PhpOption\\LazyOption' => $vendorDir . '/phpoption/phpoption/src/PhpOption/LazyOption.php', + 'PhpOption\\None' => $vendorDir . '/phpoption/phpoption/src/PhpOption/None.php', + 'PhpOption\\Option' => $vendorDir . '/phpoption/phpoption/src/PhpOption/Option.php', + 'PhpOption\\Some' => $vendorDir . '/phpoption/phpoption/src/PhpOption/Some.php', + 'Pimple' => $vendorDir . '/pimple/pimple/lib/Pimple.php', 'Predis\\Autoloader' => $vendorDir . '/predis/predis/src/Autoloader.php', 'Predis\\Client' => $vendorDir . '/predis/predis/src/Client.php', 'Predis\\ClientContextInterface' => $vendorDir . '/predis/predis/src/ClientContextInterface.php', @@ -959,6 +1928,102 @@ return array( 'Predis\\Transaction\\AbortedMultiExecException' => $vendorDir . '/predis/predis/src/Transaction/AbortedMultiExecException.php', 'Predis\\Transaction\\MultiExec' => $vendorDir . '/predis/predis/src/Transaction/MultiExec.php', 'Predis\\Transaction\\MultiExecState' => $vendorDir . '/predis/predis/src/Transaction/MultiExecState.php', + 'Prophecy\\Argument' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument.php', + 'Prophecy\\Argument\\ArgumentsWildcard' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/ArgumentsWildcard.php', + 'Prophecy\\Argument\\Token\\AnyValueToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValueToken.php', + 'Prophecy\\Argument\\Token\\AnyValuesToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValuesToken.php', + 'Prophecy\\Argument\\Token\\ApproximateValueToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/ApproximateValueToken.php', + 'Prophecy\\Argument\\Token\\ArrayCountToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayCountToken.php', + 'Prophecy\\Argument\\Token\\ArrayEntryToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEntryToken.php', + 'Prophecy\\Argument\\Token\\ArrayEveryEntryToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEveryEntryToken.php', + 'Prophecy\\Argument\\Token\\CallbackToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/CallbackToken.php', + 'Prophecy\\Argument\\Token\\ExactValueToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/ExactValueToken.php', + 'Prophecy\\Argument\\Token\\IdenticalValueToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/IdenticalValueToken.php', + 'Prophecy\\Argument\\Token\\LogicalAndToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalAndToken.php', + 'Prophecy\\Argument\\Token\\LogicalNotToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalNotToken.php', + 'Prophecy\\Argument\\Token\\ObjectStateToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/ObjectStateToken.php', + 'Prophecy\\Argument\\Token\\StringContainsToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/StringContainsToken.php', + 'Prophecy\\Argument\\Token\\TokenInterface' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/TokenInterface.php', + 'Prophecy\\Argument\\Token\\TypeToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/TypeToken.php', + 'Prophecy\\Call\\Call' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Call/Call.php', + 'Prophecy\\Call\\CallCenter' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Call/CallCenter.php', + 'Prophecy\\Comparator\\ClosureComparator' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Comparator/ClosureComparator.php', + 'Prophecy\\Comparator\\Factory' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Comparator/Factory.php', + 'Prophecy\\Comparator\\ProphecyComparator' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Comparator/ProphecyComparator.php', + 'Prophecy\\Doubler\\CachedDoubler' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/CachedDoubler.php', + 'Prophecy\\Doubler\\ClassPatch\\ClassPatchInterface' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ClassPatchInterface.php', + 'Prophecy\\Doubler\\ClassPatch\\DisableConstructorPatch' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php', + 'Prophecy\\Doubler\\ClassPatch\\HhvmExceptionPatch' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/HhvmExceptionPatch.php', + 'Prophecy\\Doubler\\ClassPatch\\KeywordPatch' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/KeywordPatch.php', + 'Prophecy\\Doubler\\ClassPatch\\MagicCallPatch' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php', + 'Prophecy\\Doubler\\ClassPatch\\ProphecySubjectPatch' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php', + 'Prophecy\\Doubler\\ClassPatch\\ReflectionClassNewInstancePatch' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatch.php', + 'Prophecy\\Doubler\\ClassPatch\\SplFileInfoPatch' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php', + 'Prophecy\\Doubler\\ClassPatch\\ThrowablePatch' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ThrowablePatch.php', + 'Prophecy\\Doubler\\ClassPatch\\TraversablePatch' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/TraversablePatch.php', + 'Prophecy\\Doubler\\DoubleInterface' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/DoubleInterface.php', + 'Prophecy\\Doubler\\Doubler' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/Doubler.php', + 'Prophecy\\Doubler\\Generator\\ClassCodeGenerator' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCodeGenerator.php', + 'Prophecy\\Doubler\\Generator\\ClassCreator' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCreator.php', + 'Prophecy\\Doubler\\Generator\\ClassMirror' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassMirror.php', + 'Prophecy\\Doubler\\Generator\\Node\\ArgumentNode' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ArgumentNode.php', + 'Prophecy\\Doubler\\Generator\\Node\\ClassNode' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ClassNode.php', + 'Prophecy\\Doubler\\Generator\\Node\\MethodNode' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/MethodNode.php', + 'Prophecy\\Doubler\\Generator\\ReflectionInterface' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/ReflectionInterface.php', + 'Prophecy\\Doubler\\Generator\\TypeHintReference' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/TypeHintReference.php', + 'Prophecy\\Doubler\\LazyDouble' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/LazyDouble.php', + 'Prophecy\\Doubler\\NameGenerator' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/NameGenerator.php', + 'Prophecy\\Exception\\Call\\UnexpectedCallException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Call/UnexpectedCallException.php', + 'Prophecy\\Exception\\Doubler\\ClassCreatorException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassCreatorException.php', + 'Prophecy\\Exception\\Doubler\\ClassMirrorException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassMirrorException.php', + 'Prophecy\\Exception\\Doubler\\ClassNotFoundException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassNotFoundException.php', + 'Prophecy\\Exception\\Doubler\\DoubleException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoubleException.php', + 'Prophecy\\Exception\\Doubler\\DoublerException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoublerException.php', + 'Prophecy\\Exception\\Doubler\\InterfaceNotFoundException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/InterfaceNotFoundException.php', + 'Prophecy\\Exception\\Doubler\\MethodNotExtendableException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotExtendableException.php', + 'Prophecy\\Exception\\Doubler\\MethodNotFoundException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotFoundException.php', + 'Prophecy\\Exception\\Doubler\\ReturnByReferenceException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/ReturnByReferenceException.php', + 'Prophecy\\Exception\\Exception' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Exception.php', + 'Prophecy\\Exception\\InvalidArgumentException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/InvalidArgumentException.php', + 'Prophecy\\Exception\\Prediction\\AggregateException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Prediction/AggregateException.php', + 'Prophecy\\Exception\\Prediction\\FailedPredictionException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Prediction/FailedPredictionException.php', + 'Prophecy\\Exception\\Prediction\\NoCallsException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Prediction/NoCallsException.php', + 'Prophecy\\Exception\\Prediction\\PredictionException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Prediction/PredictionException.php', + 'Prophecy\\Exception\\Prediction\\UnexpectedCallsCountException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsCountException.php', + 'Prophecy\\Exception\\Prediction\\UnexpectedCallsException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsException.php', + 'Prophecy\\Exception\\Prophecy\\MethodProphecyException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Prophecy/MethodProphecyException.php', + 'Prophecy\\Exception\\Prophecy\\ObjectProphecyException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ObjectProphecyException.php', + 'Prophecy\\Exception\\Prophecy\\ProphecyException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ProphecyException.php', + 'Prophecy\\PhpDocumentor\\ClassAndInterfaceTagRetriever' => $vendorDir . '/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassAndInterfaceTagRetriever.php', + 'Prophecy\\PhpDocumentor\\ClassTagRetriever' => $vendorDir . '/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassTagRetriever.php', + 'Prophecy\\PhpDocumentor\\LegacyClassTagRetriever' => $vendorDir . '/phpspec/prophecy/src/Prophecy/PhpDocumentor/LegacyClassTagRetriever.php', + 'Prophecy\\PhpDocumentor\\MethodTagRetrieverInterface' => $vendorDir . '/phpspec/prophecy/src/Prophecy/PhpDocumentor/MethodTagRetrieverInterface.php', + 'Prophecy\\Prediction\\CallPrediction' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Prediction/CallPrediction.php', + 'Prophecy\\Prediction\\CallTimesPrediction' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Prediction/CallTimesPrediction.php', + 'Prophecy\\Prediction\\CallbackPrediction' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Prediction/CallbackPrediction.php', + 'Prophecy\\Prediction\\NoCallsPrediction' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Prediction/NoCallsPrediction.php', + 'Prophecy\\Prediction\\PredictionInterface' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Prediction/PredictionInterface.php', + 'Prophecy\\Promise\\CallbackPromise' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Promise/CallbackPromise.php', + 'Prophecy\\Promise\\PromiseInterface' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Promise/PromiseInterface.php', + 'Prophecy\\Promise\\ReturnArgumentPromise' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Promise/ReturnArgumentPromise.php', + 'Prophecy\\Promise\\ReturnPromise' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Promise/ReturnPromise.php', + 'Prophecy\\Promise\\ThrowPromise' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Promise/ThrowPromise.php', + 'Prophecy\\Prophecy\\MethodProphecy' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php', + 'Prophecy\\Prophecy\\ObjectProphecy' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Prophecy/ObjectProphecy.php', + 'Prophecy\\Prophecy\\ProphecyInterface' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Prophecy/ProphecyInterface.php', + 'Prophecy\\Prophecy\\ProphecySubjectInterface' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Prophecy/ProphecySubjectInterface.php', + 'Prophecy\\Prophecy\\Revealer' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Prophecy/Revealer.php', + 'Prophecy\\Prophecy\\RevealerInterface' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Prophecy/RevealerInterface.php', + 'Prophecy\\Prophet' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Prophet.php', + 'Prophecy\\Util\\ExportUtil' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Util/ExportUtil.php', + 'Prophecy\\Util\\StringUtil' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Util/StringUtil.php', + 'Psr\\Cache\\CacheException' => $vendorDir . '/psr/cache/src/CacheException.php', + 'Psr\\Cache\\CacheItemInterface' => $vendorDir . '/psr/cache/src/CacheItemInterface.php', + 'Psr\\Cache\\CacheItemPoolInterface' => $vendorDir . '/psr/cache/src/CacheItemPoolInterface.php', + 'Psr\\Cache\\InvalidArgumentException' => $vendorDir . '/psr/cache/src/InvalidArgumentException.php', + 'Psr\\Container\\ContainerExceptionInterface' => $vendorDir . '/psr/container/src/ContainerExceptionInterface.php', + 'Psr\\Container\\ContainerInterface' => $vendorDir . '/psr/container/src/ContainerInterface.php', + 'Psr\\Container\\NotFoundExceptionInterface' => $vendorDir . '/psr/container/src/NotFoundExceptionInterface.php', 'Psr\\Http\\Message\\MessageInterface' => $vendorDir . '/psr/http-message/src/MessageInterface.php', 'Psr\\Http\\Message\\RequestInterface' => $vendorDir . '/psr/http-message/src/RequestInterface.php', 'Psr\\Http\\Message\\ResponseInterface' => $vendorDir . '/psr/http-message/src/ResponseInterface.php', @@ -966,6 +2031,270 @@ return array( 'Psr\\Http\\Message\\StreamInterface' => $vendorDir . '/psr/http-message/src/StreamInterface.php', 'Psr\\Http\\Message\\UploadedFileInterface' => $vendorDir . '/psr/http-message/src/UploadedFileInterface.php', 'Psr\\Http\\Message\\UriInterface' => $vendorDir . '/psr/http-message/src/UriInterface.php', + 'Psr\\Log\\AbstractLogger' => $vendorDir . '/psr/log/Psr/Log/AbstractLogger.php', + 'Psr\\Log\\InvalidArgumentException' => $vendorDir . '/psr/log/Psr/Log/InvalidArgumentException.php', + 'Psr\\Log\\LogLevel' => $vendorDir . '/psr/log/Psr/Log/LogLevel.php', + 'Psr\\Log\\LoggerAwareInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerAwareInterface.php', + 'Psr\\Log\\LoggerAwareTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerAwareTrait.php', + 'Psr\\Log\\LoggerInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerInterface.php', + 'Psr\\Log\\LoggerTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerTrait.php', + 'Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/Psr/Log/NullLogger.php', + 'Psr\\Log\\Test\\DummyTest' => $vendorDir . '/psr/log/Psr/Log/Test/DummyTest.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', + 'Psy\\CodeCleaner' => $vendorDir . '/psy/psysh/src/CodeCleaner.php', + 'Psy\\CodeCleaner\\AbstractClassPass' => $vendorDir . '/psy/psysh/src/CodeCleaner/AbstractClassPass.php', + 'Psy\\CodeCleaner\\AssignThisVariablePass' => $vendorDir . '/psy/psysh/src/CodeCleaner/AssignThisVariablePass.php', + 'Psy\\CodeCleaner\\CallTimePassByReferencePass' => $vendorDir . '/psy/psysh/src/CodeCleaner/CallTimePassByReferencePass.php', + 'Psy\\CodeCleaner\\CalledClassPass' => $vendorDir . '/psy/psysh/src/CodeCleaner/CalledClassPass.php', + 'Psy\\CodeCleaner\\CodeCleanerPass' => $vendorDir . '/psy/psysh/src/CodeCleaner/CodeCleanerPass.php', + 'Psy\\CodeCleaner\\ExitPass' => $vendorDir . '/psy/psysh/src/CodeCleaner/ExitPass.php', + 'Psy\\CodeCleaner\\FinalClassPass' => $vendorDir . '/psy/psysh/src/CodeCleaner/FinalClassPass.php', + 'Psy\\CodeCleaner\\FunctionContextPass' => $vendorDir . '/psy/psysh/src/CodeCleaner/FunctionContextPass.php', + 'Psy\\CodeCleaner\\FunctionReturnInWriteContextPass' => $vendorDir . '/psy/psysh/src/CodeCleaner/FunctionReturnInWriteContextPass.php', + 'Psy\\CodeCleaner\\ImplicitReturnPass' => $vendorDir . '/psy/psysh/src/CodeCleaner/ImplicitReturnPass.php', + 'Psy\\CodeCleaner\\InstanceOfPass' => $vendorDir . '/psy/psysh/src/CodeCleaner/InstanceOfPass.php', + 'Psy\\CodeCleaner\\LeavePsyshAlonePass' => $vendorDir . '/psy/psysh/src/CodeCleaner/LeavePsyshAlonePass.php', + 'Psy\\CodeCleaner\\LegacyEmptyPass' => $vendorDir . '/psy/psysh/src/CodeCleaner/LegacyEmptyPass.php', + 'Psy\\CodeCleaner\\ListPass' => $vendorDir . '/psy/psysh/src/CodeCleaner/ListPass.php', + 'Psy\\CodeCleaner\\LoopContextPass' => $vendorDir . '/psy/psysh/src/CodeCleaner/LoopContextPass.php', + 'Psy\\CodeCleaner\\MagicConstantsPass' => $vendorDir . '/psy/psysh/src/CodeCleaner/MagicConstantsPass.php', + 'Psy\\CodeCleaner\\NamespaceAwarePass' => $vendorDir . '/psy/psysh/src/CodeCleaner/NamespaceAwarePass.php', + 'Psy\\CodeCleaner\\NamespacePass' => $vendorDir . '/psy/psysh/src/CodeCleaner/NamespacePass.php', + 'Psy\\CodeCleaner\\NoReturnValue' => $vendorDir . '/psy/psysh/src/CodeCleaner/NoReturnValue.php', + 'Psy\\CodeCleaner\\PassableByReferencePass' => $vendorDir . '/psy/psysh/src/CodeCleaner/PassableByReferencePass.php', + 'Psy\\CodeCleaner\\RequirePass' => $vendorDir . '/psy/psysh/src/CodeCleaner/RequirePass.php', + 'Psy\\CodeCleaner\\StrictTypesPass' => $vendorDir . '/psy/psysh/src/CodeCleaner/StrictTypesPass.php', + 'Psy\\CodeCleaner\\UseStatementPass' => $vendorDir . '/psy/psysh/src/CodeCleaner/UseStatementPass.php', + 'Psy\\CodeCleaner\\ValidClassNamePass' => $vendorDir . '/psy/psysh/src/CodeCleaner/ValidClassNamePass.php', + 'Psy\\CodeCleaner\\ValidConstantPass' => $vendorDir . '/psy/psysh/src/CodeCleaner/ValidConstantPass.php', + 'Psy\\CodeCleaner\\ValidConstructorPass' => $vendorDir . '/psy/psysh/src/CodeCleaner/ValidConstructorPass.php', + 'Psy\\CodeCleaner\\ValidFunctionNamePass' => $vendorDir . '/psy/psysh/src/CodeCleaner/ValidFunctionNamePass.php', + 'Psy\\Command\\BufferCommand' => $vendorDir . '/psy/psysh/src/Command/BufferCommand.php', + 'Psy\\Command\\ClearCommand' => $vendorDir . '/psy/psysh/src/Command/ClearCommand.php', + 'Psy\\Command\\Command' => $vendorDir . '/psy/psysh/src/Command/Command.php', + 'Psy\\Command\\DocCommand' => $vendorDir . '/psy/psysh/src/Command/DocCommand.php', + 'Psy\\Command\\DumpCommand' => $vendorDir . '/psy/psysh/src/Command/DumpCommand.php', + 'Psy\\Command\\EditCommand' => $vendorDir . '/psy/psysh/src/Command/EditCommand.php', + 'Psy\\Command\\ExitCommand' => $vendorDir . '/psy/psysh/src/Command/ExitCommand.php', + 'Psy\\Command\\HelpCommand' => $vendorDir . '/psy/psysh/src/Command/HelpCommand.php', + 'Psy\\Command\\HistoryCommand' => $vendorDir . '/psy/psysh/src/Command/HistoryCommand.php', + 'Psy\\Command\\ListCommand' => $vendorDir . '/psy/psysh/src/Command/ListCommand.php', + 'Psy\\Command\\ListCommand\\ClassConstantEnumerator' => $vendorDir . '/psy/psysh/src/Command/ListCommand/ClassConstantEnumerator.php', + 'Psy\\Command\\ListCommand\\ClassEnumerator' => $vendorDir . '/psy/psysh/src/Command/ListCommand/ClassEnumerator.php', + 'Psy\\Command\\ListCommand\\ConstantEnumerator' => $vendorDir . '/psy/psysh/src/Command/ListCommand/ConstantEnumerator.php', + 'Psy\\Command\\ListCommand\\Enumerator' => $vendorDir . '/psy/psysh/src/Command/ListCommand/Enumerator.php', + 'Psy\\Command\\ListCommand\\FunctionEnumerator' => $vendorDir . '/psy/psysh/src/Command/ListCommand/FunctionEnumerator.php', + 'Psy\\Command\\ListCommand\\GlobalVariableEnumerator' => $vendorDir . '/psy/psysh/src/Command/ListCommand/GlobalVariableEnumerator.php', + 'Psy\\Command\\ListCommand\\InterfaceEnumerator' => $vendorDir . '/psy/psysh/src/Command/ListCommand/InterfaceEnumerator.php', + 'Psy\\Command\\ListCommand\\MethodEnumerator' => $vendorDir . '/psy/psysh/src/Command/ListCommand/MethodEnumerator.php', + 'Psy\\Command\\ListCommand\\PropertyEnumerator' => $vendorDir . '/psy/psysh/src/Command/ListCommand/PropertyEnumerator.php', + 'Psy\\Command\\ListCommand\\TraitEnumerator' => $vendorDir . '/psy/psysh/src/Command/ListCommand/TraitEnumerator.php', + 'Psy\\Command\\ListCommand\\VariableEnumerator' => $vendorDir . '/psy/psysh/src/Command/ListCommand/VariableEnumerator.php', + 'Psy\\Command\\ParseCommand' => $vendorDir . '/psy/psysh/src/Command/ParseCommand.php', + 'Psy\\Command\\PsyVersionCommand' => $vendorDir . '/psy/psysh/src/Command/PsyVersionCommand.php', + 'Psy\\Command\\ReflectingCommand' => $vendorDir . '/psy/psysh/src/Command/ReflectingCommand.php', + 'Psy\\Command\\ShowCommand' => $vendorDir . '/psy/psysh/src/Command/ShowCommand.php', + 'Psy\\Command\\SudoCommand' => $vendorDir . '/psy/psysh/src/Command/SudoCommand.php', + 'Psy\\Command\\ThrowUpCommand' => $vendorDir . '/psy/psysh/src/Command/ThrowUpCommand.php', + 'Psy\\Command\\TimeitCommand' => $vendorDir . '/psy/psysh/src/Command/TimeitCommand.php', + 'Psy\\Command\\TimeitCommand\\TimeitVisitor' => $vendorDir . '/psy/psysh/src/Command/TimeitCommand/TimeitVisitor.php', + 'Psy\\Command\\TraceCommand' => $vendorDir . '/psy/psysh/src/Command/TraceCommand.php', + 'Psy\\Command\\WhereamiCommand' => $vendorDir . '/psy/psysh/src/Command/WhereamiCommand.php', + 'Psy\\Command\\WtfCommand' => $vendorDir . '/psy/psysh/src/Command/WtfCommand.php', + 'Psy\\ConfigPaths' => $vendorDir . '/psy/psysh/src/ConfigPaths.php', + 'Psy\\Configuration' => $vendorDir . '/psy/psysh/src/Configuration.php', + 'Psy\\ConsoleColorFactory' => $vendorDir . '/psy/psysh/src/ConsoleColorFactory.php', + 'Psy\\Context' => $vendorDir . '/psy/psysh/src/Context.php', + 'Psy\\ContextAware' => $vendorDir . '/psy/psysh/src/ContextAware.php', + 'Psy\\Exception\\BreakException' => $vendorDir . '/psy/psysh/src/Exception/BreakException.php', + 'Psy\\Exception\\DeprecatedException' => $vendorDir . '/psy/psysh/src/Exception/DeprecatedException.php', + 'Psy\\Exception\\ErrorException' => $vendorDir . '/psy/psysh/src/Exception/ErrorException.php', + 'Psy\\Exception\\Exception' => $vendorDir . '/psy/psysh/src/Exception/Exception.php', + 'Psy\\Exception\\FatalErrorException' => $vendorDir . '/psy/psysh/src/Exception/FatalErrorException.php', + 'Psy\\Exception\\ParseErrorException' => $vendorDir . '/psy/psysh/src/Exception/ParseErrorException.php', + 'Psy\\Exception\\RuntimeException' => $vendorDir . '/psy/psysh/src/Exception/RuntimeException.php', + 'Psy\\Exception\\ThrowUpException' => $vendorDir . '/psy/psysh/src/Exception/ThrowUpException.php', + 'Psy\\Exception\\TypeErrorException' => $vendorDir . '/psy/psysh/src/Exception/TypeErrorException.php', + 'Psy\\ExecutionClosure' => $vendorDir . '/psy/psysh/src/ExecutionClosure.php', + 'Psy\\ExecutionLoop' => $vendorDir . '/psy/psysh/src/ExecutionLoop.php', + 'Psy\\ExecutionLoopClosure' => $vendorDir . '/psy/psysh/src/ExecutionLoopClosure.php', + 'Psy\\ExecutionLoop\\AbstractListener' => $vendorDir . '/psy/psysh/src/ExecutionLoop/AbstractListener.php', + 'Psy\\ExecutionLoop\\Listener' => $vendorDir . '/psy/psysh/src/ExecutionLoop/Listener.php', + 'Psy\\ExecutionLoop\\ProcessForker' => $vendorDir . '/psy/psysh/src/ExecutionLoop/ProcessForker.php', + 'Psy\\ExecutionLoop\\RunkitReloader' => $vendorDir . '/psy/psysh/src/ExecutionLoop/RunkitReloader.php', + 'Psy\\Formatter\\CodeFormatter' => $vendorDir . '/psy/psysh/src/Formatter/CodeFormatter.php', + 'Psy\\Formatter\\DocblockFormatter' => $vendorDir . '/psy/psysh/src/Formatter/DocblockFormatter.php', + 'Psy\\Formatter\\Formatter' => $vendorDir . '/psy/psysh/src/Formatter/Formatter.php', + 'Psy\\Formatter\\SignatureFormatter' => $vendorDir . '/psy/psysh/src/Formatter/SignatureFormatter.php', + 'Psy\\Input\\CodeArgument' => $vendorDir . '/psy/psysh/src/Input/CodeArgument.php', + 'Psy\\Input\\FilterOptions' => $vendorDir . '/psy/psysh/src/Input/FilterOptions.php', + 'Psy\\Input\\ShellInput' => $vendorDir . '/psy/psysh/src/Input/ShellInput.php', + 'Psy\\Input\\SilentInput' => $vendorDir . '/psy/psysh/src/Input/SilentInput.php', + 'Psy\\Output\\OutputPager' => $vendorDir . '/psy/psysh/src/Output/OutputPager.php', + 'Psy\\Output\\PassthruPager' => $vendorDir . '/psy/psysh/src/Output/PassthruPager.php', + 'Psy\\Output\\ProcOutputPager' => $vendorDir . '/psy/psysh/src/Output/ProcOutputPager.php', + 'Psy\\Output\\ShellOutput' => $vendorDir . '/psy/psysh/src/Output/ShellOutput.php', + 'Psy\\ParserFactory' => $vendorDir . '/psy/psysh/src/ParserFactory.php', + 'Psy\\Readline\\GNUReadline' => $vendorDir . '/psy/psysh/src/Readline/GNUReadline.php', + 'Psy\\Readline\\HoaConsole' => $vendorDir . '/psy/psysh/src/Readline/HoaConsole.php', + 'Psy\\Readline\\Libedit' => $vendorDir . '/psy/psysh/src/Readline/Libedit.php', + 'Psy\\Readline\\Readline' => $vendorDir . '/psy/psysh/src/Readline/Readline.php', + 'Psy\\Readline\\Transient' => $vendorDir . '/psy/psysh/src/Readline/Transient.php', + 'Psy\\Reflection\\ReflectionClassConstant' => $vendorDir . '/psy/psysh/src/Reflection/ReflectionClassConstant.php', + 'Psy\\Reflection\\ReflectionConstant' => $vendorDir . '/psy/psysh/src/Reflection/ReflectionConstant.php', + 'Psy\\Reflection\\ReflectionConstant_' => $vendorDir . '/psy/psysh/src/Reflection/ReflectionConstant_.php', + 'Psy\\Reflection\\ReflectionLanguageConstruct' => $vendorDir . '/psy/psysh/src/Reflection/ReflectionLanguageConstruct.php', + 'Psy\\Reflection\\ReflectionLanguageConstructParameter' => $vendorDir . '/psy/psysh/src/Reflection/ReflectionLanguageConstructParameter.php', + 'Psy\\Shell' => $vendorDir . '/psy/psysh/src/Shell.php', + 'Psy\\Sudo' => $vendorDir . '/psy/psysh/src/Sudo.php', + 'Psy\\Sudo\\SudoVisitor' => $vendorDir . '/psy/psysh/src/Sudo/SudoVisitor.php', + 'Psy\\TabCompletion\\AutoCompleter' => $vendorDir . '/psy/psysh/src/TabCompletion/AutoCompleter.php', + 'Psy\\TabCompletion\\Matcher\\AbstractContextAwareMatcher' => $vendorDir . '/psy/psysh/src/TabCompletion/Matcher/AbstractContextAwareMatcher.php', + 'Psy\\TabCompletion\\Matcher\\AbstractDefaultParametersMatcher' => $vendorDir . '/psy/psysh/src/TabCompletion/Matcher/AbstractDefaultParametersMatcher.php', + 'Psy\\TabCompletion\\Matcher\\AbstractMatcher' => $vendorDir . '/psy/psysh/src/TabCompletion/Matcher/AbstractMatcher.php', + 'Psy\\TabCompletion\\Matcher\\ClassAttributesMatcher' => $vendorDir . '/psy/psysh/src/TabCompletion/Matcher/ClassAttributesMatcher.php', + 'Psy\\TabCompletion\\Matcher\\ClassMethodDefaultParametersMatcher' => $vendorDir . '/psy/psysh/src/TabCompletion/Matcher/ClassMethodDefaultParametersMatcher.php', + 'Psy\\TabCompletion\\Matcher\\ClassMethodsMatcher' => $vendorDir . '/psy/psysh/src/TabCompletion/Matcher/ClassMethodsMatcher.php', + 'Psy\\TabCompletion\\Matcher\\ClassNamesMatcher' => $vendorDir . '/psy/psysh/src/TabCompletion/Matcher/ClassNamesMatcher.php', + 'Psy\\TabCompletion\\Matcher\\CommandsMatcher' => $vendorDir . '/psy/psysh/src/TabCompletion/Matcher/CommandsMatcher.php', + 'Psy\\TabCompletion\\Matcher\\ConstantsMatcher' => $vendorDir . '/psy/psysh/src/TabCompletion/Matcher/ConstantsMatcher.php', + 'Psy\\TabCompletion\\Matcher\\FunctionDefaultParametersMatcher' => $vendorDir . '/psy/psysh/src/TabCompletion/Matcher/FunctionDefaultParametersMatcher.php', + 'Psy\\TabCompletion\\Matcher\\FunctionsMatcher' => $vendorDir . '/psy/psysh/src/TabCompletion/Matcher/FunctionsMatcher.php', + 'Psy\\TabCompletion\\Matcher\\KeywordsMatcher' => $vendorDir . '/psy/psysh/src/TabCompletion/Matcher/KeywordsMatcher.php', + 'Psy\\TabCompletion\\Matcher\\MongoClientMatcher' => $vendorDir . '/psy/psysh/src/TabCompletion/Matcher/MongoClientMatcher.php', + 'Psy\\TabCompletion\\Matcher\\MongoDatabaseMatcher' => $vendorDir . '/psy/psysh/src/TabCompletion/Matcher/MongoDatabaseMatcher.php', + 'Psy\\TabCompletion\\Matcher\\ObjectAttributesMatcher' => $vendorDir . '/psy/psysh/src/TabCompletion/Matcher/ObjectAttributesMatcher.php', + 'Psy\\TabCompletion\\Matcher\\ObjectMethodDefaultParametersMatcher' => $vendorDir . '/psy/psysh/src/TabCompletion/Matcher/ObjectMethodDefaultParametersMatcher.php', + 'Psy\\TabCompletion\\Matcher\\ObjectMethodsMatcher' => $vendorDir . '/psy/psysh/src/TabCompletion/Matcher/ObjectMethodsMatcher.php', + 'Psy\\TabCompletion\\Matcher\\VariablesMatcher' => $vendorDir . '/psy/psysh/src/TabCompletion/Matcher/VariablesMatcher.php', + 'Psy\\Util\\Docblock' => $vendorDir . '/psy/psysh/src/Util/Docblock.php', + 'Psy\\Util\\Json' => $vendorDir . '/psy/psysh/src/Util/Json.php', + 'Psy\\Util\\Mirror' => $vendorDir . '/psy/psysh/src/Util/Mirror.php', + 'Psy\\Util\\Str' => $vendorDir . '/psy/psysh/src/Util/Str.php', + 'Psy\\VarDumper\\Cloner' => $vendorDir . '/psy/psysh/src/VarDumper/Cloner.php', + 'Psy\\VarDumper\\Dumper' => $vendorDir . '/psy/psysh/src/VarDumper/Dumper.php', + 'Psy\\VarDumper\\Presenter' => $vendorDir . '/psy/psysh/src/VarDumper/Presenter.php', + 'Psy\\VarDumper\\PresenterAware' => $vendorDir . '/psy/psysh/src/VarDumper/PresenterAware.php', + 'Psy\\VersionUpdater\\Checker' => $vendorDir . '/psy/psysh/src/VersionUpdater/Checker.php', + 'Psy\\VersionUpdater\\GitHubChecker' => $vendorDir . '/psy/psysh/src/VersionUpdater/GitHubChecker.php', + 'Psy\\VersionUpdater\\IntervalChecker' => $vendorDir . '/psy/psysh/src/VersionUpdater/IntervalChecker.php', + 'Psy\\VersionUpdater\\NoopChecker' => $vendorDir . '/psy/psysh/src/VersionUpdater/NoopChecker.php', + 'SebastianBergmann\\CodeCoverage\\CodeCoverage' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage.php', + 'SebastianBergmann\\CodeCoverage\\CoveredCodeNotExecutedException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/CoveredCodeNotExecutedException.php', + 'SebastianBergmann\\CodeCoverage\\Driver\\Driver' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/Driver.php', + 'SebastianBergmann\\CodeCoverage\\Driver\\PCOV' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/PCOV.php', + 'SebastianBergmann\\CodeCoverage\\Driver\\PHPDBG' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/PHPDBG.php', + 'SebastianBergmann\\CodeCoverage\\Driver\\Xdebug' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/Xdebug.php', + 'SebastianBergmann\\CodeCoverage\\Exception' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/Exception.php', + 'SebastianBergmann\\CodeCoverage\\Filter' => $vendorDir . '/phpunit/php-code-coverage/src/Filter.php', + 'SebastianBergmann\\CodeCoverage\\InvalidArgumentException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/InvalidArgumentException.php', + 'SebastianBergmann\\CodeCoverage\\MissingCoversAnnotationException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/MissingCoversAnnotationException.php', + 'SebastianBergmann\\CodeCoverage\\Node\\AbstractNode' => $vendorDir . '/phpunit/php-code-coverage/src/Node/AbstractNode.php', + 'SebastianBergmann\\CodeCoverage\\Node\\Builder' => $vendorDir . '/phpunit/php-code-coverage/src/Node/Builder.php', + 'SebastianBergmann\\CodeCoverage\\Node\\Directory' => $vendorDir . '/phpunit/php-code-coverage/src/Node/Directory.php', + 'SebastianBergmann\\CodeCoverage\\Node\\File' => $vendorDir . '/phpunit/php-code-coverage/src/Node/File.php', + 'SebastianBergmann\\CodeCoverage\\Node\\Iterator' => $vendorDir . '/phpunit/php-code-coverage/src/Node/Iterator.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Clover' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Clover.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Crap4j' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Crap4j.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Dashboard' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Directory' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Facade' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Facade.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Html\\File' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Renderer' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer.php', + 'SebastianBergmann\\CodeCoverage\\Report\\PHP' => $vendorDir . '/phpunit/php-code-coverage/src/Report/PHP.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Text' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Text.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\BuildInformation' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/BuildInformation.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Coverage' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Coverage.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Directory' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Directory.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Facade' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Facade.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\File' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/File.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Method' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Method.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Node' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Node.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Project' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Project.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Report' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Report.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Source' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Source.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Tests' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Tests.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Totals' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Totals.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Unit' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Unit.php', + 'SebastianBergmann\\CodeCoverage\\RuntimeException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/RuntimeException.php', + 'SebastianBergmann\\CodeCoverage\\UnintentionallyCoveredCodeException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/UnintentionallyCoveredCodeException.php', + 'SebastianBergmann\\CodeCoverage\\Util' => $vendorDir . '/phpunit/php-code-coverage/src/Util.php', + 'SebastianBergmann\\CodeCoverage\\Version' => $vendorDir . '/phpunit/php-code-coverage/src/Version.php', + 'SebastianBergmann\\CodeUnitReverseLookup\\Wizard' => $vendorDir . '/sebastian/code-unit-reverse-lookup/src/Wizard.php', + 'SebastianBergmann\\Comparator\\ArrayComparator' => $vendorDir . '/sebastian/comparator/src/ArrayComparator.php', + 'SebastianBergmann\\Comparator\\Comparator' => $vendorDir . '/sebastian/comparator/src/Comparator.php', + 'SebastianBergmann\\Comparator\\ComparisonFailure' => $vendorDir . '/sebastian/comparator/src/ComparisonFailure.php', + 'SebastianBergmann\\Comparator\\DOMNodeComparator' => $vendorDir . '/sebastian/comparator/src/DOMNodeComparator.php', + 'SebastianBergmann\\Comparator\\DateTimeComparator' => $vendorDir . '/sebastian/comparator/src/DateTimeComparator.php', + 'SebastianBergmann\\Comparator\\DoubleComparator' => $vendorDir . '/sebastian/comparator/src/DoubleComparator.php', + 'SebastianBergmann\\Comparator\\ExceptionComparator' => $vendorDir . '/sebastian/comparator/src/ExceptionComparator.php', + 'SebastianBergmann\\Comparator\\Factory' => $vendorDir . '/sebastian/comparator/src/Factory.php', + 'SebastianBergmann\\Comparator\\MockObjectComparator' => $vendorDir . '/sebastian/comparator/src/MockObjectComparator.php', + 'SebastianBergmann\\Comparator\\NumericComparator' => $vendorDir . '/sebastian/comparator/src/NumericComparator.php', + 'SebastianBergmann\\Comparator\\ObjectComparator' => $vendorDir . '/sebastian/comparator/src/ObjectComparator.php', + 'SebastianBergmann\\Comparator\\ResourceComparator' => $vendorDir . '/sebastian/comparator/src/ResourceComparator.php', + 'SebastianBergmann\\Comparator\\ScalarComparator' => $vendorDir . '/sebastian/comparator/src/ScalarComparator.php', + 'SebastianBergmann\\Comparator\\SplObjectStorageComparator' => $vendorDir . '/sebastian/comparator/src/SplObjectStorageComparator.php', + 'SebastianBergmann\\Comparator\\TypeComparator' => $vendorDir . '/sebastian/comparator/src/TypeComparator.php', + 'SebastianBergmann\\Diff\\Chunk' => $vendorDir . '/sebastian/diff/src/Chunk.php', + 'SebastianBergmann\\Diff\\ConfigurationException' => $vendorDir . '/sebastian/diff/src/Exception/ConfigurationException.php', + 'SebastianBergmann\\Diff\\Diff' => $vendorDir . '/sebastian/diff/src/Diff.php', + 'SebastianBergmann\\Diff\\Differ' => $vendorDir . '/sebastian/diff/src/Differ.php', + 'SebastianBergmann\\Diff\\Exception' => $vendorDir . '/sebastian/diff/src/Exception/Exception.php', + 'SebastianBergmann\\Diff\\InvalidArgumentException' => $vendorDir . '/sebastian/diff/src/Exception/InvalidArgumentException.php', + 'SebastianBergmann\\Diff\\Line' => $vendorDir . '/sebastian/diff/src/Line.php', + 'SebastianBergmann\\Diff\\LongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/LongestCommonSubsequenceCalculator.php', + 'SebastianBergmann\\Diff\\MemoryEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php', + 'SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php', + 'SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php', + 'SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => $vendorDir . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php', + 'SebastianBergmann\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php', + 'SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php', + 'SebastianBergmann\\Diff\\Parser' => $vendorDir . '/sebastian/diff/src/Parser.php', + 'SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', + 'SebastianBergmann\\Environment\\Console' => $vendorDir . '/sebastian/environment/src/Console.php', + 'SebastianBergmann\\Environment\\OperatingSystem' => $vendorDir . '/sebastian/environment/src/OperatingSystem.php', + 'SebastianBergmann\\Environment\\Runtime' => $vendorDir . '/sebastian/environment/src/Runtime.php', + 'SebastianBergmann\\Exporter\\Exporter' => $vendorDir . '/sebastian/exporter/src/Exporter.php', + 'SebastianBergmann\\FileIterator\\Facade' => $vendorDir . '/phpunit/php-file-iterator/src/Facade.php', + 'SebastianBergmann\\FileIterator\\Factory' => $vendorDir . '/phpunit/php-file-iterator/src/Factory.php', + 'SebastianBergmann\\FileIterator\\Iterator' => $vendorDir . '/phpunit/php-file-iterator/src/Iterator.php', + 'SebastianBergmann\\GlobalState\\Blacklist' => $vendorDir . '/sebastian/global-state/src/Blacklist.php', + 'SebastianBergmann\\GlobalState\\CodeExporter' => $vendorDir . '/sebastian/global-state/src/CodeExporter.php', + 'SebastianBergmann\\GlobalState\\Exception' => $vendorDir . '/sebastian/global-state/src/exceptions/Exception.php', + 'SebastianBergmann\\GlobalState\\Restorer' => $vendorDir . '/sebastian/global-state/src/Restorer.php', + 'SebastianBergmann\\GlobalState\\RuntimeException' => $vendorDir . '/sebastian/global-state/src/exceptions/RuntimeException.php', + 'SebastianBergmann\\GlobalState\\Snapshot' => $vendorDir . '/sebastian/global-state/src/Snapshot.php', + 'SebastianBergmann\\ObjectEnumerator\\Enumerator' => $vendorDir . '/sebastian/object-enumerator/src/Enumerator.php', + 'SebastianBergmann\\ObjectEnumerator\\Exception' => $vendorDir . '/sebastian/object-enumerator/src/Exception.php', + 'SebastianBergmann\\ObjectEnumerator\\InvalidArgumentException' => $vendorDir . '/sebastian/object-enumerator/src/InvalidArgumentException.php', + 'SebastianBergmann\\ObjectReflector\\Exception' => $vendorDir . '/sebastian/object-reflector/src/Exception.php', + 'SebastianBergmann\\ObjectReflector\\InvalidArgumentException' => $vendorDir . '/sebastian/object-reflector/src/InvalidArgumentException.php', + 'SebastianBergmann\\ObjectReflector\\ObjectReflector' => $vendorDir . '/sebastian/object-reflector/src/ObjectReflector.php', + 'SebastianBergmann\\RecursionContext\\Context' => $vendorDir . '/sebastian/recursion-context/src/Context.php', + 'SebastianBergmann\\RecursionContext\\Exception' => $vendorDir . '/sebastian/recursion-context/src/Exception.php', + 'SebastianBergmann\\RecursionContext\\InvalidArgumentException' => $vendorDir . '/sebastian/recursion-context/src/InvalidArgumentException.php', + 'SebastianBergmann\\ResourceOperations\\ResourceOperations' => $vendorDir . '/sebastian/resource-operations/src/ResourceOperations.php', + 'SebastianBergmann\\Timer\\Exception' => $vendorDir . '/phpunit/php-timer/src/Exception.php', + 'SebastianBergmann\\Timer\\RuntimeException' => $vendorDir . '/phpunit/php-timer/src/RuntimeException.php', + 'SebastianBergmann\\Timer\\Timer' => $vendorDir . '/phpunit/php-timer/src/Timer.php', + 'SebastianBergmann\\Type\\CallableType' => $vendorDir . '/sebastian/type/src/CallableType.php', + 'SebastianBergmann\\Type\\Exception' => $vendorDir . '/sebastian/type/src/exception/Exception.php', + 'SebastianBergmann\\Type\\GenericObjectType' => $vendorDir . '/sebastian/type/src/GenericObjectType.php', + 'SebastianBergmann\\Type\\IterableType' => $vendorDir . '/sebastian/type/src/IterableType.php', + 'SebastianBergmann\\Type\\NullType' => $vendorDir . '/sebastian/type/src/NullType.php', + 'SebastianBergmann\\Type\\ObjectType' => $vendorDir . '/sebastian/type/src/ObjectType.php', + 'SebastianBergmann\\Type\\RuntimeException' => $vendorDir . '/sebastian/type/src/exception/RuntimeException.php', + 'SebastianBergmann\\Type\\SimpleType' => $vendorDir . '/sebastian/type/src/SimpleType.php', + 'SebastianBergmann\\Type\\Type' => $vendorDir . '/sebastian/type/src/Type.php', + 'SebastianBergmann\\Type\\TypeName' => $vendorDir . '/sebastian/type/src/TypeName.php', + 'SebastianBergmann\\Type\\UnknownType' => $vendorDir . '/sebastian/type/src/UnknownType.php', + 'SebastianBergmann\\Type\\VoidType' => $vendorDir . '/sebastian/type/src/VoidType.php', + 'SebastianBergmann\\Version' => $vendorDir . '/sebastian/version/src/Version.php', 'Stomp\\Broker\\ActiveMq\\ActiveMq' => $vendorDir . '/stomp-php/stomp-php/src/Broker/ActiveMq/ActiveMq.php', 'Stomp\\Broker\\ActiveMq\\Mode\\ActiveMqMode' => $vendorDir . '/stomp-php/stomp-php/src/Broker/ActiveMq/Mode/ActiveMqMode.php', 'Stomp\\Broker\\ActiveMq\\Mode\\DurableSubscription' => $vendorDir . '/stomp-php/stomp-php/src/Broker/ActiveMq/Mode/DurableSubscription.php', @@ -1011,6 +2340,906 @@ return array( 'Stomp\\Transport\\Message' => $vendorDir . '/stomp-php/stomp-php/src/Transport/Message.php', 'Stomp\\Transport\\Parser' => $vendorDir . '/stomp-php/stomp-php/src/Transport/Parser.php', 'Stomp\\Util\\IdGenerator' => $vendorDir . '/stomp-php/stomp-php/src/Util/IdGenerator.php', + 'Symfony\\Component\\Config\\ConfigCache' => $vendorDir . '/symfony/config/ConfigCache.php', + 'Symfony\\Component\\Config\\ConfigCacheFactory' => $vendorDir . '/symfony/config/ConfigCacheFactory.php', + 'Symfony\\Component\\Config\\ConfigCacheFactoryInterface' => $vendorDir . '/symfony/config/ConfigCacheFactoryInterface.php', + 'Symfony\\Component\\Config\\ConfigCacheInterface' => $vendorDir . '/symfony/config/ConfigCacheInterface.php', + 'Symfony\\Component\\Config\\Definition\\ArrayNode' => $vendorDir . '/symfony/config/Definition/ArrayNode.php', + 'Symfony\\Component\\Config\\Definition\\BaseNode' => $vendorDir . '/symfony/config/Definition/BaseNode.php', + 'Symfony\\Component\\Config\\Definition\\BooleanNode' => $vendorDir . '/symfony/config/Definition/BooleanNode.php', + 'Symfony\\Component\\Config\\Definition\\Builder\\ArrayNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/ArrayNodeDefinition.php', + 'Symfony\\Component\\Config\\Definition\\Builder\\BooleanNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/BooleanNodeDefinition.php', + 'Symfony\\Component\\Config\\Definition\\Builder\\EnumNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/EnumNodeDefinition.php', + 'Symfony\\Component\\Config\\Definition\\Builder\\ExprBuilder' => $vendorDir . '/symfony/config/Definition/Builder/ExprBuilder.php', + 'Symfony\\Component\\Config\\Definition\\Builder\\FloatNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/FloatNodeDefinition.php', + 'Symfony\\Component\\Config\\Definition\\Builder\\IntegerNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/IntegerNodeDefinition.php', + 'Symfony\\Component\\Config\\Definition\\Builder\\MergeBuilder' => $vendorDir . '/symfony/config/Definition/Builder/MergeBuilder.php', + 'Symfony\\Component\\Config\\Definition\\Builder\\NodeBuilder' => $vendorDir . '/symfony/config/Definition/Builder/NodeBuilder.php', + 'Symfony\\Component\\Config\\Definition\\Builder\\NodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/NodeDefinition.php', + 'Symfony\\Component\\Config\\Definition\\Builder\\NodeParentInterface' => $vendorDir . '/symfony/config/Definition/Builder/NodeParentInterface.php', + 'Symfony\\Component\\Config\\Definition\\Builder\\NormalizationBuilder' => $vendorDir . '/symfony/config/Definition/Builder/NormalizationBuilder.php', + 'Symfony\\Component\\Config\\Definition\\Builder\\NumericNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/NumericNodeDefinition.php', + 'Symfony\\Component\\Config\\Definition\\Builder\\ParentNodeDefinitionInterface' => $vendorDir . '/symfony/config/Definition/Builder/ParentNodeDefinitionInterface.php', + 'Symfony\\Component\\Config\\Definition\\Builder\\ScalarNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/ScalarNodeDefinition.php', + 'Symfony\\Component\\Config\\Definition\\Builder\\TreeBuilder' => $vendorDir . '/symfony/config/Definition/Builder/TreeBuilder.php', + 'Symfony\\Component\\Config\\Definition\\Builder\\ValidationBuilder' => $vendorDir . '/symfony/config/Definition/Builder/ValidationBuilder.php', + 'Symfony\\Component\\Config\\Definition\\Builder\\VariableNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/VariableNodeDefinition.php', + 'Symfony\\Component\\Config\\Definition\\ConfigurationInterface' => $vendorDir . '/symfony/config/Definition/ConfigurationInterface.php', + 'Symfony\\Component\\Config\\Definition\\Dumper\\XmlReferenceDumper' => $vendorDir . '/symfony/config/Definition/Dumper/XmlReferenceDumper.php', + 'Symfony\\Component\\Config\\Definition\\Dumper\\YamlReferenceDumper' => $vendorDir . '/symfony/config/Definition/Dumper/YamlReferenceDumper.php', + 'Symfony\\Component\\Config\\Definition\\EnumNode' => $vendorDir . '/symfony/config/Definition/EnumNode.php', + 'Symfony\\Component\\Config\\Definition\\Exception\\DuplicateKeyException' => $vendorDir . '/symfony/config/Definition/Exception/DuplicateKeyException.php', + 'Symfony\\Component\\Config\\Definition\\Exception\\Exception' => $vendorDir . '/symfony/config/Definition/Exception/Exception.php', + 'Symfony\\Component\\Config\\Definition\\Exception\\ForbiddenOverwriteException' => $vendorDir . '/symfony/config/Definition/Exception/ForbiddenOverwriteException.php', + 'Symfony\\Component\\Config\\Definition\\Exception\\InvalidConfigurationException' => $vendorDir . '/symfony/config/Definition/Exception/InvalidConfigurationException.php', + 'Symfony\\Component\\Config\\Definition\\Exception\\InvalidDefinitionException' => $vendorDir . '/symfony/config/Definition/Exception/InvalidDefinitionException.php', + 'Symfony\\Component\\Config\\Definition\\Exception\\InvalidTypeException' => $vendorDir . '/symfony/config/Definition/Exception/InvalidTypeException.php', + 'Symfony\\Component\\Config\\Definition\\Exception\\UnsetKeyException' => $vendorDir . '/symfony/config/Definition/Exception/UnsetKeyException.php', + 'Symfony\\Component\\Config\\Definition\\FloatNode' => $vendorDir . '/symfony/config/Definition/FloatNode.php', + 'Symfony\\Component\\Config\\Definition\\IntegerNode' => $vendorDir . '/symfony/config/Definition/IntegerNode.php', + 'Symfony\\Component\\Config\\Definition\\NodeInterface' => $vendorDir . '/symfony/config/Definition/NodeInterface.php', + 'Symfony\\Component\\Config\\Definition\\NumericNode' => $vendorDir . '/symfony/config/Definition/NumericNode.php', + 'Symfony\\Component\\Config\\Definition\\Processor' => $vendorDir . '/symfony/config/Definition/Processor.php', + 'Symfony\\Component\\Config\\Definition\\PrototypeNodeInterface' => $vendorDir . '/symfony/config/Definition/PrototypeNodeInterface.php', + 'Symfony\\Component\\Config\\Definition\\PrototypedArrayNode' => $vendorDir . '/symfony/config/Definition/PrototypedArrayNode.php', + 'Symfony\\Component\\Config\\Definition\\ReferenceDumper' => $vendorDir . '/symfony/config/Definition/ReferenceDumper.php', + 'Symfony\\Component\\Config\\Definition\\ScalarNode' => $vendorDir . '/symfony/config/Definition/ScalarNode.php', + 'Symfony\\Component\\Config\\Definition\\VariableNode' => $vendorDir . '/symfony/config/Definition/VariableNode.php', + 'Symfony\\Component\\Config\\Exception\\FileLoaderImportCircularReferenceException' => $vendorDir . '/symfony/config/Exception/FileLoaderImportCircularReferenceException.php', + 'Symfony\\Component\\Config\\Exception\\FileLoaderLoadException' => $vendorDir . '/symfony/config/Exception/FileLoaderLoadException.php', + 'Symfony\\Component\\Config\\FileLocator' => $vendorDir . '/symfony/config/FileLocator.php', + 'Symfony\\Component\\Config\\FileLocatorInterface' => $vendorDir . '/symfony/config/FileLocatorInterface.php', + 'Symfony\\Component\\Config\\Loader\\DelegatingLoader' => $vendorDir . '/symfony/config/Loader/DelegatingLoader.php', + 'Symfony\\Component\\Config\\Loader\\FileLoader' => $vendorDir . '/symfony/config/Loader/FileLoader.php', + 'Symfony\\Component\\Config\\Loader\\Loader' => $vendorDir . '/symfony/config/Loader/Loader.php', + 'Symfony\\Component\\Config\\Loader\\LoaderInterface' => $vendorDir . '/symfony/config/Loader/LoaderInterface.php', + 'Symfony\\Component\\Config\\Loader\\LoaderResolver' => $vendorDir . '/symfony/config/Loader/LoaderResolver.php', + 'Symfony\\Component\\Config\\Loader\\LoaderResolverInterface' => $vendorDir . '/symfony/config/Loader/LoaderResolverInterface.php', + 'Symfony\\Component\\Config\\ResourceCheckerConfigCache' => $vendorDir . '/symfony/config/ResourceCheckerConfigCache.php', + 'Symfony\\Component\\Config\\ResourceCheckerConfigCacheFactory' => $vendorDir . '/symfony/config/ResourceCheckerConfigCacheFactory.php', + 'Symfony\\Component\\Config\\ResourceCheckerInterface' => $vendorDir . '/symfony/config/ResourceCheckerInterface.php', + 'Symfony\\Component\\Config\\Resource\\BCResourceInterfaceChecker' => $vendorDir . '/symfony/config/Resource/BCResourceInterfaceChecker.php', + 'Symfony\\Component\\Config\\Resource\\DirectoryResource' => $vendorDir . '/symfony/config/Resource/DirectoryResource.php', + 'Symfony\\Component\\Config\\Resource\\FileExistenceResource' => $vendorDir . '/symfony/config/Resource/FileExistenceResource.php', + 'Symfony\\Component\\Config\\Resource\\FileResource' => $vendorDir . '/symfony/config/Resource/FileResource.php', + 'Symfony\\Component\\Config\\Resource\\ResourceInterface' => $vendorDir . '/symfony/config/Resource/ResourceInterface.php', + 'Symfony\\Component\\Config\\Resource\\SelfCheckingResourceChecker' => $vendorDir . '/symfony/config/Resource/SelfCheckingResourceChecker.php', + 'Symfony\\Component\\Config\\Resource\\SelfCheckingResourceInterface' => $vendorDir . '/symfony/config/Resource/SelfCheckingResourceInterface.php', + 'Symfony\\Component\\Config\\Util\\XmlUtils' => $vendorDir . '/symfony/config/Util/XmlUtils.php', + 'Symfony\\Component\\Console\\Application' => $vendorDir . '/symfony/console/Application.php', + 'Symfony\\Component\\Console\\Command\\Command' => $vendorDir . '/symfony/console/Command/Command.php', + 'Symfony\\Component\\Console\\Command\\HelpCommand' => $vendorDir . '/symfony/console/Command/HelpCommand.php', + 'Symfony\\Component\\Console\\Command\\ListCommand' => $vendorDir . '/symfony/console/Command/ListCommand.php', + 'Symfony\\Component\\Console\\ConsoleEvents' => $vendorDir . '/symfony/console/ConsoleEvents.php', + 'Symfony\\Component\\Console\\Descriptor\\ApplicationDescription' => $vendorDir . '/symfony/console/Descriptor/ApplicationDescription.php', + 'Symfony\\Component\\Console\\Descriptor\\Descriptor' => $vendorDir . '/symfony/console/Descriptor/Descriptor.php', + 'Symfony\\Component\\Console\\Descriptor\\DescriptorInterface' => $vendorDir . '/symfony/console/Descriptor/DescriptorInterface.php', + 'Symfony\\Component\\Console\\Descriptor\\JsonDescriptor' => $vendorDir . '/symfony/console/Descriptor/JsonDescriptor.php', + 'Symfony\\Component\\Console\\Descriptor\\MarkdownDescriptor' => $vendorDir . '/symfony/console/Descriptor/MarkdownDescriptor.php', + 'Symfony\\Component\\Console\\Descriptor\\TextDescriptor' => $vendorDir . '/symfony/console/Descriptor/TextDescriptor.php', + 'Symfony\\Component\\Console\\Descriptor\\XmlDescriptor' => $vendorDir . '/symfony/console/Descriptor/XmlDescriptor.php', + 'Symfony\\Component\\Console\\Event\\ConsoleCommandEvent' => $vendorDir . '/symfony/console/Event/ConsoleCommandEvent.php', + 'Symfony\\Component\\Console\\Event\\ConsoleEvent' => $vendorDir . '/symfony/console/Event/ConsoleEvent.php', + 'Symfony\\Component\\Console\\Event\\ConsoleExceptionEvent' => $vendorDir . '/symfony/console/Event/ConsoleExceptionEvent.php', + 'Symfony\\Component\\Console\\Event\\ConsoleTerminateEvent' => $vendorDir . '/symfony/console/Event/ConsoleTerminateEvent.php', + 'Symfony\\Component\\Console\\Exception\\CommandNotFoundException' => $vendorDir . '/symfony/console/Exception/CommandNotFoundException.php', + 'Symfony\\Component\\Console\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/console/Exception/ExceptionInterface.php', + 'Symfony\\Component\\Console\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/console/Exception/InvalidArgumentException.php', + 'Symfony\\Component\\Console\\Exception\\InvalidOptionException' => $vendorDir . '/symfony/console/Exception/InvalidOptionException.php', + 'Symfony\\Component\\Console\\Exception\\LogicException' => $vendorDir . '/symfony/console/Exception/LogicException.php', + 'Symfony\\Component\\Console\\Exception\\RuntimeException' => $vendorDir . '/symfony/console/Exception/RuntimeException.php', + 'Symfony\\Component\\Console\\Formatter\\OutputFormatter' => $vendorDir . '/symfony/console/Formatter/OutputFormatter.php', + 'Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface' => $vendorDir . '/symfony/console/Formatter/OutputFormatterInterface.php', + '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\\Helper\\DebugFormatterHelper' => $vendorDir . '/symfony/console/Helper/DebugFormatterHelper.php', + 'Symfony\\Component\\Console\\Helper\\DescriptorHelper' => $vendorDir . '/symfony/console/Helper/DescriptorHelper.php', + 'Symfony\\Component\\Console\\Helper\\DialogHelper' => $vendorDir . '/symfony/console/Helper/DialogHelper.php', + 'Symfony\\Component\\Console\\Helper\\FormatterHelper' => $vendorDir . '/symfony/console/Helper/FormatterHelper.php', + 'Symfony\\Component\\Console\\Helper\\Helper' => $vendorDir . '/symfony/console/Helper/Helper.php', + 'Symfony\\Component\\Console\\Helper\\HelperInterface' => $vendorDir . '/symfony/console/Helper/HelperInterface.php', + 'Symfony\\Component\\Console\\Helper\\HelperSet' => $vendorDir . '/symfony/console/Helper/HelperSet.php', + 'Symfony\\Component\\Console\\Helper\\InputAwareHelper' => $vendorDir . '/symfony/console/Helper/InputAwareHelper.php', + 'Symfony\\Component\\Console\\Helper\\ProcessHelper' => $vendorDir . '/symfony/console/Helper/ProcessHelper.php', + 'Symfony\\Component\\Console\\Helper\\ProgressBar' => $vendorDir . '/symfony/console/Helper/ProgressBar.php', + 'Symfony\\Component\\Console\\Helper\\ProgressHelper' => $vendorDir . '/symfony/console/Helper/ProgressHelper.php', + 'Symfony\\Component\\Console\\Helper\\ProgressIndicator' => $vendorDir . '/symfony/console/Helper/ProgressIndicator.php', + 'Symfony\\Component\\Console\\Helper\\QuestionHelper' => $vendorDir . '/symfony/console/Helper/QuestionHelper.php', + 'Symfony\\Component\\Console\\Helper\\SymfonyQuestionHelper' => $vendorDir . '/symfony/console/Helper/SymfonyQuestionHelper.php', + 'Symfony\\Component\\Console\\Helper\\Table' => $vendorDir . '/symfony/console/Helper/Table.php', + 'Symfony\\Component\\Console\\Helper\\TableCell' => $vendorDir . '/symfony/console/Helper/TableCell.php', + 'Symfony\\Component\\Console\\Helper\\TableHelper' => $vendorDir . '/symfony/console/Helper/TableHelper.php', + 'Symfony\\Component\\Console\\Helper\\TableSeparator' => $vendorDir . '/symfony/console/Helper/TableSeparator.php', + 'Symfony\\Component\\Console\\Helper\\TableStyle' => $vendorDir . '/symfony/console/Helper/TableStyle.php', + 'Symfony\\Component\\Console\\Input\\ArgvInput' => $vendorDir . '/symfony/console/Input/ArgvInput.php', + 'Symfony\\Component\\Console\\Input\\ArrayInput' => $vendorDir . '/symfony/console/Input/ArrayInput.php', + 'Symfony\\Component\\Console\\Input\\Input' => $vendorDir . '/symfony/console/Input/Input.php', + 'Symfony\\Component\\Console\\Input\\InputArgument' => $vendorDir . '/symfony/console/Input/InputArgument.php', + 'Symfony\\Component\\Console\\Input\\InputAwareInterface' => $vendorDir . '/symfony/console/Input/InputAwareInterface.php', + 'Symfony\\Component\\Console\\Input\\InputDefinition' => $vendorDir . '/symfony/console/Input/InputDefinition.php', + 'Symfony\\Component\\Console\\Input\\InputInterface' => $vendorDir . '/symfony/console/Input/InputInterface.php', + 'Symfony\\Component\\Console\\Input\\InputOption' => $vendorDir . '/symfony/console/Input/InputOption.php', + 'Symfony\\Component\\Console\\Input\\StringInput' => $vendorDir . '/symfony/console/Input/StringInput.php', + 'Symfony\\Component\\Console\\Logger\\ConsoleLogger' => $vendorDir . '/symfony/console/Logger/ConsoleLogger.php', + 'Symfony\\Component\\Console\\Output\\BufferedOutput' => $vendorDir . '/symfony/console/Output/BufferedOutput.php', + 'Symfony\\Component\\Console\\Output\\ConsoleOutput' => $vendorDir . '/symfony/console/Output/ConsoleOutput.php', + 'Symfony\\Component\\Console\\Output\\ConsoleOutputInterface' => $vendorDir . '/symfony/console/Output/ConsoleOutputInterface.php', + 'Symfony\\Component\\Console\\Output\\NullOutput' => $vendorDir . '/symfony/console/Output/NullOutput.php', + 'Symfony\\Component\\Console\\Output\\Output' => $vendorDir . '/symfony/console/Output/Output.php', + 'Symfony\\Component\\Console\\Output\\OutputInterface' => $vendorDir . '/symfony/console/Output/OutputInterface.php', + 'Symfony\\Component\\Console\\Output\\StreamOutput' => $vendorDir . '/symfony/console/Output/StreamOutput.php', + 'Symfony\\Component\\Console\\Question\\ChoiceQuestion' => $vendorDir . '/symfony/console/Question/ChoiceQuestion.php', + 'Symfony\\Component\\Console\\Question\\ConfirmationQuestion' => $vendorDir . '/symfony/console/Question/ConfirmationQuestion.php', + 'Symfony\\Component\\Console\\Question\\Question' => $vendorDir . '/symfony/console/Question/Question.php', + 'Symfony\\Component\\Console\\Shell' => $vendorDir . '/symfony/console/Shell.php', + 'Symfony\\Component\\Console\\Style\\OutputStyle' => $vendorDir . '/symfony/console/Style/OutputStyle.php', + 'Symfony\\Component\\Console\\Style\\StyleInterface' => $vendorDir . '/symfony/console/Style/StyleInterface.php', + 'Symfony\\Component\\Console\\Style\\SymfonyStyle' => $vendorDir . '/symfony/console/Style/SymfonyStyle.php', + 'Symfony\\Component\\Console\\Tester\\ApplicationTester' => $vendorDir . '/symfony/console/Tester/ApplicationTester.php', + 'Symfony\\Component\\Console\\Tester\\CommandTester' => $vendorDir . '/symfony/console/Tester/CommandTester.php', + 'Symfony\\Component\\Debug\\BufferingLogger' => $vendorDir . '/symfony/debug/BufferingLogger.php', + 'Symfony\\Component\\Debug\\Debug' => $vendorDir . '/symfony/debug/Debug.php', + 'Symfony\\Component\\Debug\\DebugClassLoader' => $vendorDir . '/symfony/debug/DebugClassLoader.php', + 'Symfony\\Component\\Debug\\ErrorHandler' => $vendorDir . '/symfony/debug/ErrorHandler.php', + 'Symfony\\Component\\Debug\\ExceptionHandler' => $vendorDir . '/symfony/debug/ExceptionHandler.php', + 'Symfony\\Component\\Debug\\Exception\\ClassNotFoundException' => $vendorDir . '/symfony/debug/Exception/ClassNotFoundException.php', + 'Symfony\\Component\\Debug\\Exception\\ContextErrorException' => $vendorDir . '/symfony/debug/Exception/ContextErrorException.php', + 'Symfony\\Component\\Debug\\Exception\\FatalErrorException' => $vendorDir . '/symfony/debug/Exception/FatalErrorException.php', + 'Symfony\\Component\\Debug\\Exception\\FatalThrowableError' => $vendorDir . '/symfony/debug/Exception/FatalThrowableError.php', + 'Symfony\\Component\\Debug\\Exception\\FlattenException' => $vendorDir . '/symfony/debug/Exception/FlattenException.php', + 'Symfony\\Component\\Debug\\Exception\\OutOfMemoryException' => $vendorDir . '/symfony/debug/Exception/OutOfMemoryException.php', + 'Symfony\\Component\\Debug\\Exception\\UndefinedFunctionException' => $vendorDir . '/symfony/debug/Exception/UndefinedFunctionException.php', + 'Symfony\\Component\\Debug\\Exception\\UndefinedMethodException' => $vendorDir . '/symfony/debug/Exception/UndefinedMethodException.php', + 'Symfony\\Component\\Debug\\FatalErrorHandler\\ClassNotFoundFatalErrorHandler' => $vendorDir . '/symfony/debug/FatalErrorHandler/ClassNotFoundFatalErrorHandler.php', + 'Symfony\\Component\\Debug\\FatalErrorHandler\\FatalErrorHandlerInterface' => $vendorDir . '/symfony/debug/FatalErrorHandler/FatalErrorHandlerInterface.php', + 'Symfony\\Component\\Debug\\FatalErrorHandler\\UndefinedFunctionFatalErrorHandler' => $vendorDir . '/symfony/debug/FatalErrorHandler/UndefinedFunctionFatalErrorHandler.php', + 'Symfony\\Component\\Debug\\FatalErrorHandler\\UndefinedMethodFatalErrorHandler' => $vendorDir . '/symfony/debug/FatalErrorHandler/UndefinedMethodFatalErrorHandler.php', + 'Symfony\\Component\\EventDispatcher\\ContainerAwareEventDispatcher' => $vendorDir . '/symfony/event-dispatcher/ContainerAwareEventDispatcher.php', + 'Symfony\\Component\\EventDispatcher\\Debug\\TraceableEventDispatcher' => $vendorDir . '/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php', + 'Symfony\\Component\\EventDispatcher\\Debug\\TraceableEventDispatcherInterface' => $vendorDir . '/symfony/event-dispatcher/Debug/TraceableEventDispatcherInterface.php', + 'Symfony\\Component\\EventDispatcher\\Debug\\WrappedListener' => $vendorDir . '/symfony/event-dispatcher/Debug/WrappedListener.php', + 'Symfony\\Component\\EventDispatcher\\DependencyInjection\\RegisterListenersPass' => $vendorDir . '/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php', + 'Symfony\\Component\\EventDispatcher\\Event' => $vendorDir . '/symfony/event-dispatcher/Event.php', + 'Symfony\\Component\\EventDispatcher\\EventDispatcher' => $vendorDir . '/symfony/event-dispatcher/EventDispatcher.php', + 'Symfony\\Component\\EventDispatcher\\EventDispatcherInterface' => $vendorDir . '/symfony/event-dispatcher/EventDispatcherInterface.php', + 'Symfony\\Component\\EventDispatcher\\EventSubscriberInterface' => $vendorDir . '/symfony/event-dispatcher/EventSubscriberInterface.php', + 'Symfony\\Component\\EventDispatcher\\GenericEvent' => $vendorDir . '/symfony/event-dispatcher/GenericEvent.php', + 'Symfony\\Component\\EventDispatcher\\ImmutableEventDispatcher' => $vendorDir . '/symfony/event-dispatcher/ImmutableEventDispatcher.php', + 'Symfony\\Component\\Filesystem\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/filesystem/Exception/ExceptionInterface.php', + 'Symfony\\Component\\Filesystem\\Exception\\FileNotFoundException' => $vendorDir . '/symfony/filesystem/Exception/FileNotFoundException.php', + 'Symfony\\Component\\Filesystem\\Exception\\IOException' => $vendorDir . '/symfony/filesystem/Exception/IOException.php', + 'Symfony\\Component\\Filesystem\\Exception\\IOExceptionInterface' => $vendorDir . '/symfony/filesystem/Exception/IOExceptionInterface.php', + 'Symfony\\Component\\Filesystem\\Filesystem' => $vendorDir . '/symfony/filesystem/Filesystem.php', + 'Symfony\\Component\\Filesystem\\LockHandler' => $vendorDir . '/symfony/filesystem/LockHandler.php', + 'Symfony\\Component\\Finder\\Adapter\\AbstractAdapter' => $vendorDir . '/symfony/finder/Adapter/AbstractAdapter.php', + 'Symfony\\Component\\Finder\\Adapter\\AbstractFindAdapter' => $vendorDir . '/symfony/finder/Adapter/AbstractFindAdapter.php', + 'Symfony\\Component\\Finder\\Adapter\\AdapterInterface' => $vendorDir . '/symfony/finder/Adapter/AdapterInterface.php', + 'Symfony\\Component\\Finder\\Adapter\\BsdFindAdapter' => $vendorDir . '/symfony/finder/Adapter/BsdFindAdapter.php', + 'Symfony\\Component\\Finder\\Adapter\\GnuFindAdapter' => $vendorDir . '/symfony/finder/Adapter/GnuFindAdapter.php', + 'Symfony\\Component\\Finder\\Adapter\\PhpAdapter' => $vendorDir . '/symfony/finder/Adapter/PhpAdapter.php', + 'Symfony\\Component\\Finder\\Comparator\\Comparator' => $vendorDir . '/symfony/finder/Comparator/Comparator.php', + 'Symfony\\Component\\Finder\\Comparator\\DateComparator' => $vendorDir . '/symfony/finder/Comparator/DateComparator.php', + 'Symfony\\Component\\Finder\\Comparator\\NumberComparator' => $vendorDir . '/symfony/finder/Comparator/NumberComparator.php', + 'Symfony\\Component\\Finder\\Exception\\AccessDeniedException' => $vendorDir . '/symfony/finder/Exception/AccessDeniedException.php', + 'Symfony\\Component\\Finder\\Exception\\AdapterFailureException' => $vendorDir . '/symfony/finder/Exception/AdapterFailureException.php', + 'Symfony\\Component\\Finder\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/finder/Exception/ExceptionInterface.php', + 'Symfony\\Component\\Finder\\Exception\\OperationNotPermitedException' => $vendorDir . '/symfony/finder/Exception/OperationNotPermitedException.php', + 'Symfony\\Component\\Finder\\Exception\\ShellCommandFailureException' => $vendorDir . '/symfony/finder/Exception/ShellCommandFailureException.php', + 'Symfony\\Component\\Finder\\Expression\\Expression' => $vendorDir . '/symfony/finder/Expression/Expression.php', + 'Symfony\\Component\\Finder\\Expression\\Glob' => $vendorDir . '/symfony/finder/Expression/Glob.php', + 'Symfony\\Component\\Finder\\Expression\\Regex' => $vendorDir . '/symfony/finder/Expression/Regex.php', + 'Symfony\\Component\\Finder\\Expression\\ValueInterface' => $vendorDir . '/symfony/finder/Expression/ValueInterface.php', + 'Symfony\\Component\\Finder\\Finder' => $vendorDir . '/symfony/finder/Finder.php', + 'Symfony\\Component\\Finder\\Glob' => $vendorDir . '/symfony/finder/Glob.php', + 'Symfony\\Component\\Finder\\Iterator\\CustomFilterIterator' => $vendorDir . '/symfony/finder/Iterator/CustomFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\DateRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/DateRangeFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\DepthRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/DepthRangeFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\ExcludeDirectoryFilterIterator' => $vendorDir . '/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\FilePathsIterator' => $vendorDir . '/symfony/finder/Iterator/FilePathsIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\FileTypeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FileTypeFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\FilecontentFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FilecontentFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\FilenameFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FilenameFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\FilterIterator' => $vendorDir . '/symfony/finder/Iterator/FilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\MultiplePcreFilterIterator' => $vendorDir . '/symfony/finder/Iterator/MultiplePcreFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\PathFilterIterator' => $vendorDir . '/symfony/finder/Iterator/PathFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\RecursiveDirectoryIterator' => $vendorDir . '/symfony/finder/Iterator/RecursiveDirectoryIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\SizeRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/SizeRangeFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\SortableIterator' => $vendorDir . '/symfony/finder/Iterator/SortableIterator.php', + 'Symfony\\Component\\Finder\\Shell\\Command' => $vendorDir . '/symfony/finder/Shell/Command.php', + 'Symfony\\Component\\Finder\\Shell\\Shell' => $vendorDir . '/symfony/finder/Shell/Shell.php', + 'Symfony\\Component\\Finder\\SplFileInfo' => $vendorDir . '/symfony/finder/SplFileInfo.php', + 'Symfony\\Component\\Process\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/process/Exception/ExceptionInterface.php', + 'Symfony\\Component\\Process\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/process/Exception/InvalidArgumentException.php', + 'Symfony\\Component\\Process\\Exception\\LogicException' => $vendorDir . '/symfony/process/Exception/LogicException.php', + 'Symfony\\Component\\Process\\Exception\\ProcessFailedException' => $vendorDir . '/symfony/process/Exception/ProcessFailedException.php', + 'Symfony\\Component\\Process\\Exception\\ProcessTimedOutException' => $vendorDir . '/symfony/process/Exception/ProcessTimedOutException.php', + 'Symfony\\Component\\Process\\Exception\\RuntimeException' => $vendorDir . '/symfony/process/Exception/RuntimeException.php', + 'Symfony\\Component\\Process\\ExecutableFinder' => $vendorDir . '/symfony/process/ExecutableFinder.php', + 'Symfony\\Component\\Process\\PhpExecutableFinder' => $vendorDir . '/symfony/process/PhpExecutableFinder.php', + 'Symfony\\Component\\Process\\PhpProcess' => $vendorDir . '/symfony/process/PhpProcess.php', + 'Symfony\\Component\\Process\\Pipes\\AbstractPipes' => $vendorDir . '/symfony/process/Pipes/AbstractPipes.php', + 'Symfony\\Component\\Process\\Pipes\\PipesInterface' => $vendorDir . '/symfony/process/Pipes/PipesInterface.php', + 'Symfony\\Component\\Process\\Pipes\\UnixPipes' => $vendorDir . '/symfony/process/Pipes/UnixPipes.php', + 'Symfony\\Component\\Process\\Pipes\\WindowsPipes' => $vendorDir . '/symfony/process/Pipes/WindowsPipes.php', + 'Symfony\\Component\\Process\\Process' => $vendorDir . '/symfony/process/Process.php', + 'Symfony\\Component\\Process\\ProcessBuilder' => $vendorDir . '/symfony/process/ProcessBuilder.php', + 'Symfony\\Component\\Process\\ProcessUtils' => $vendorDir . '/symfony/process/ProcessUtils.php', + 'Symfony\\Component\\Stopwatch\\Section' => $vendorDir . '/symfony/stopwatch/Section.php', + 'Symfony\\Component\\Stopwatch\\Stopwatch' => $vendorDir . '/symfony/stopwatch/Stopwatch.php', + 'Symfony\\Component\\Stopwatch\\StopwatchEvent' => $vendorDir . '/symfony/stopwatch/StopwatchEvent.php', + 'Symfony\\Component\\Stopwatch\\StopwatchPeriod' => $vendorDir . '/symfony/stopwatch/StopwatchPeriod.php', + 'Symfony\\Component\\Translation\\Catalogue\\AbstractOperation' => $vendorDir . '/symfony/translation/Catalogue/AbstractOperation.php', + 'Symfony\\Component\\Translation\\Catalogue\\MergeOperation' => $vendorDir . '/symfony/translation/Catalogue/MergeOperation.php', + 'Symfony\\Component\\Translation\\Catalogue\\OperationInterface' => $vendorDir . '/symfony/translation/Catalogue/OperationInterface.php', + 'Symfony\\Component\\Translation\\Catalogue\\TargetOperation' => $vendorDir . '/symfony/translation/Catalogue/TargetOperation.php', + 'Symfony\\Component\\Translation\\DataCollectorTranslator' => $vendorDir . '/symfony/translation/DataCollectorTranslator.php', + 'Symfony\\Component\\Translation\\DataCollector\\TranslationDataCollector' => $vendorDir . '/symfony/translation/DataCollector/TranslationDataCollector.php', + 'Symfony\\Component\\Translation\\Dumper\\CsvFileDumper' => $vendorDir . '/symfony/translation/Dumper/CsvFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\DumperInterface' => $vendorDir . '/symfony/translation/Dumper/DumperInterface.php', + 'Symfony\\Component\\Translation\\Dumper\\FileDumper' => $vendorDir . '/symfony/translation/Dumper/FileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\IcuResFileDumper' => $vendorDir . '/symfony/translation/Dumper/IcuResFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\IniFileDumper' => $vendorDir . '/symfony/translation/Dumper/IniFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\JsonFileDumper' => $vendorDir . '/symfony/translation/Dumper/JsonFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\MoFileDumper' => $vendorDir . '/symfony/translation/Dumper/MoFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\PhpFileDumper' => $vendorDir . '/symfony/translation/Dumper/PhpFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\PoFileDumper' => $vendorDir . '/symfony/translation/Dumper/PoFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\QtFileDumper' => $vendorDir . '/symfony/translation/Dumper/QtFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\XliffFileDumper' => $vendorDir . '/symfony/translation/Dumper/XliffFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\YamlFileDumper' => $vendorDir . '/symfony/translation/Dumper/YamlFileDumper.php', + 'Symfony\\Component\\Translation\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/translation/Exception/ExceptionInterface.php', + 'Symfony\\Component\\Translation\\Exception\\InvalidResourceException' => $vendorDir . '/symfony/translation/Exception/InvalidResourceException.php', + 'Symfony\\Component\\Translation\\Exception\\NotFoundResourceException' => $vendorDir . '/symfony/translation/Exception/NotFoundResourceException.php', + 'Symfony\\Component\\Translation\\Extractor\\AbstractFileExtractor' => $vendorDir . '/symfony/translation/Extractor/AbstractFileExtractor.php', + 'Symfony\\Component\\Translation\\Extractor\\ChainExtractor' => $vendorDir . '/symfony/translation/Extractor/ChainExtractor.php', + 'Symfony\\Component\\Translation\\Extractor\\ExtractorInterface' => $vendorDir . '/symfony/translation/Extractor/ExtractorInterface.php', + 'Symfony\\Component\\Translation\\IdentityTranslator' => $vendorDir . '/symfony/translation/IdentityTranslator.php', + 'Symfony\\Component\\Translation\\Interval' => $vendorDir . '/symfony/translation/Interval.php', + 'Symfony\\Component\\Translation\\Loader\\ArrayLoader' => $vendorDir . '/symfony/translation/Loader/ArrayLoader.php', + 'Symfony\\Component\\Translation\\Loader\\CsvFileLoader' => $vendorDir . '/symfony/translation/Loader/CsvFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\FileLoader' => $vendorDir . '/symfony/translation/Loader/FileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\IcuDatFileLoader' => $vendorDir . '/symfony/translation/Loader/IcuDatFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\IcuResFileLoader' => $vendorDir . '/symfony/translation/Loader/IcuResFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\IniFileLoader' => $vendorDir . '/symfony/translation/Loader/IniFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\JsonFileLoader' => $vendorDir . '/symfony/translation/Loader/JsonFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\LoaderInterface' => $vendorDir . '/symfony/translation/Loader/LoaderInterface.php', + 'Symfony\\Component\\Translation\\Loader\\MoFileLoader' => $vendorDir . '/symfony/translation/Loader/MoFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\PhpFileLoader' => $vendorDir . '/symfony/translation/Loader/PhpFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\PoFileLoader' => $vendorDir . '/symfony/translation/Loader/PoFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\QtFileLoader' => $vendorDir . '/symfony/translation/Loader/QtFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\XliffFileLoader' => $vendorDir . '/symfony/translation/Loader/XliffFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\YamlFileLoader' => $vendorDir . '/symfony/translation/Loader/YamlFileLoader.php', + 'Symfony\\Component\\Translation\\LoggingTranslator' => $vendorDir . '/symfony/translation/LoggingTranslator.php', + 'Symfony\\Component\\Translation\\MessageCatalogue' => $vendorDir . '/symfony/translation/MessageCatalogue.php', + 'Symfony\\Component\\Translation\\MessageCatalogueInterface' => $vendorDir . '/symfony/translation/MessageCatalogueInterface.php', + 'Symfony\\Component\\Translation\\MessageSelector' => $vendorDir . '/symfony/translation/MessageSelector.php', + 'Symfony\\Component\\Translation\\MetadataAwareInterface' => $vendorDir . '/symfony/translation/MetadataAwareInterface.php', + 'Symfony\\Component\\Translation\\PluralizationRules' => $vendorDir . '/symfony/translation/PluralizationRules.php', + 'Symfony\\Component\\Translation\\Translator' => $vendorDir . '/symfony/translation/Translator.php', + '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\\Writer\\TranslationWriter' => $vendorDir . '/symfony/translation/Writer/TranslationWriter.php', + 'Symfony\\Component\\Validator\\ClassBasedInterface' => $vendorDir . '/symfony/validator/ClassBasedInterface.php', + 'Symfony\\Component\\Validator\\Constraint' => $vendorDir . '/symfony/validator/Constraint.php', + 'Symfony\\Component\\Validator\\ConstraintValidator' => $vendorDir . '/symfony/validator/ConstraintValidator.php', + 'Symfony\\Component\\Validator\\ConstraintValidatorFactory' => $vendorDir . '/symfony/validator/ConstraintValidatorFactory.php', + 'Symfony\\Component\\Validator\\ConstraintValidatorFactoryInterface' => $vendorDir . '/symfony/validator/ConstraintValidatorFactoryInterface.php', + 'Symfony\\Component\\Validator\\ConstraintValidatorInterface' => $vendorDir . '/symfony/validator/ConstraintValidatorInterface.php', + 'Symfony\\Component\\Validator\\ConstraintViolation' => $vendorDir . '/symfony/validator/ConstraintViolation.php', + 'Symfony\\Component\\Validator\\ConstraintViolationInterface' => $vendorDir . '/symfony/validator/ConstraintViolationInterface.php', + 'Symfony\\Component\\Validator\\ConstraintViolationList' => $vendorDir . '/symfony/validator/ConstraintViolationList.php', + 'Symfony\\Component\\Validator\\ConstraintViolationListInterface' => $vendorDir . '/symfony/validator/ConstraintViolationListInterface.php', + 'Symfony\\Component\\Validator\\Constraints\\AbstractComparison' => $vendorDir . '/symfony/validator/Constraints/AbstractComparison.php', + 'Symfony\\Component\\Validator\\Constraints\\AbstractComparisonValidator' => $vendorDir . '/symfony/validator/Constraints/AbstractComparisonValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\All' => $vendorDir . '/symfony/validator/Constraints/All.php', + 'Symfony\\Component\\Validator\\Constraints\\AllValidator' => $vendorDir . '/symfony/validator/Constraints/AllValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Bic' => $vendorDir . '/symfony/validator/Constraints/Bic.php', + 'Symfony\\Component\\Validator\\Constraints\\BicValidator' => $vendorDir . '/symfony/validator/Constraints/BicValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Blank' => $vendorDir . '/symfony/validator/Constraints/Blank.php', + 'Symfony\\Component\\Validator\\Constraints\\BlankValidator' => $vendorDir . '/symfony/validator/Constraints/BlankValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Callback' => $vendorDir . '/symfony/validator/Constraints/Callback.php', + 'Symfony\\Component\\Validator\\Constraints\\CallbackValidator' => $vendorDir . '/symfony/validator/Constraints/CallbackValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\CardScheme' => $vendorDir . '/symfony/validator/Constraints/CardScheme.php', + 'Symfony\\Component\\Validator\\Constraints\\CardSchemeValidator' => $vendorDir . '/symfony/validator/Constraints/CardSchemeValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Choice' => $vendorDir . '/symfony/validator/Constraints/Choice.php', + 'Symfony\\Component\\Validator\\Constraints\\ChoiceValidator' => $vendorDir . '/symfony/validator/Constraints/ChoiceValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Collection' => $vendorDir . '/symfony/validator/Constraints/Collection.php', + 'Symfony\\Component\\Validator\\Constraints\\CollectionValidator' => $vendorDir . '/symfony/validator/Constraints/CollectionValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Collection\\Optional' => $vendorDir . '/symfony/validator/Constraints/Collection/Optional.php', + 'Symfony\\Component\\Validator\\Constraints\\Collection\\Required' => $vendorDir . '/symfony/validator/Constraints/Collection/Required.php', + 'Symfony\\Component\\Validator\\Constraints\\Composite' => $vendorDir . '/symfony/validator/Constraints/Composite.php', + 'Symfony\\Component\\Validator\\Constraints\\Count' => $vendorDir . '/symfony/validator/Constraints/Count.php', + 'Symfony\\Component\\Validator\\Constraints\\CountValidator' => $vendorDir . '/symfony/validator/Constraints/CountValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Country' => $vendorDir . '/symfony/validator/Constraints/Country.php', + 'Symfony\\Component\\Validator\\Constraints\\CountryValidator' => $vendorDir . '/symfony/validator/Constraints/CountryValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Currency' => $vendorDir . '/symfony/validator/Constraints/Currency.php', + 'Symfony\\Component\\Validator\\Constraints\\CurrencyValidator' => $vendorDir . '/symfony/validator/Constraints/CurrencyValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Date' => $vendorDir . '/symfony/validator/Constraints/Date.php', + 'Symfony\\Component\\Validator\\Constraints\\DateTime' => $vendorDir . '/symfony/validator/Constraints/DateTime.php', + 'Symfony\\Component\\Validator\\Constraints\\DateTimeValidator' => $vendorDir . '/symfony/validator/Constraints/DateTimeValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\DateValidator' => $vendorDir . '/symfony/validator/Constraints/DateValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Email' => $vendorDir . '/symfony/validator/Constraints/Email.php', + 'Symfony\\Component\\Validator\\Constraints\\EmailValidator' => $vendorDir . '/symfony/validator/Constraints/EmailValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\EqualTo' => $vendorDir . '/symfony/validator/Constraints/EqualTo.php', + 'Symfony\\Component\\Validator\\Constraints\\EqualToValidator' => $vendorDir . '/symfony/validator/Constraints/EqualToValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Existence' => $vendorDir . '/symfony/validator/Constraints/Existence.php', + 'Symfony\\Component\\Validator\\Constraints\\Expression' => $vendorDir . '/symfony/validator/Constraints/Expression.php', + 'Symfony\\Component\\Validator\\Constraints\\ExpressionValidator' => $vendorDir . '/symfony/validator/Constraints/ExpressionValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\False' => $vendorDir . '/symfony/validator/Constraints/False.php', + 'Symfony\\Component\\Validator\\Constraints\\FalseValidator' => $vendorDir . '/symfony/validator/Constraints/FalseValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\File' => $vendorDir . '/symfony/validator/Constraints/File.php', + 'Symfony\\Component\\Validator\\Constraints\\FileValidator' => $vendorDir . '/symfony/validator/Constraints/FileValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\GreaterThan' => $vendorDir . '/symfony/validator/Constraints/GreaterThan.php', + 'Symfony\\Component\\Validator\\Constraints\\GreaterThanOrEqual' => $vendorDir . '/symfony/validator/Constraints/GreaterThanOrEqual.php', + 'Symfony\\Component\\Validator\\Constraints\\GreaterThanOrEqualValidator' => $vendorDir . '/symfony/validator/Constraints/GreaterThanOrEqualValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\GreaterThanValidator' => $vendorDir . '/symfony/validator/Constraints/GreaterThanValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\GroupSequence' => $vendorDir . '/symfony/validator/Constraints/GroupSequence.php', + 'Symfony\\Component\\Validator\\Constraints\\GroupSequenceProvider' => $vendorDir . '/symfony/validator/Constraints/GroupSequenceProvider.php', + 'Symfony\\Component\\Validator\\Constraints\\Iban' => $vendorDir . '/symfony/validator/Constraints/Iban.php', + 'Symfony\\Component\\Validator\\Constraints\\IbanValidator' => $vendorDir . '/symfony/validator/Constraints/IbanValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\IdenticalTo' => $vendorDir . '/symfony/validator/Constraints/IdenticalTo.php', + 'Symfony\\Component\\Validator\\Constraints\\IdenticalToValidator' => $vendorDir . '/symfony/validator/Constraints/IdenticalToValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Image' => $vendorDir . '/symfony/validator/Constraints/Image.php', + 'Symfony\\Component\\Validator\\Constraints\\ImageValidator' => $vendorDir . '/symfony/validator/Constraints/ImageValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Ip' => $vendorDir . '/symfony/validator/Constraints/Ip.php', + 'Symfony\\Component\\Validator\\Constraints\\IpValidator' => $vendorDir . '/symfony/validator/Constraints/IpValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\IsFalse' => $vendorDir . '/symfony/validator/Constraints/IsFalse.php', + 'Symfony\\Component\\Validator\\Constraints\\IsFalseValidator' => $vendorDir . '/symfony/validator/Constraints/IsFalseValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\IsNull' => $vendorDir . '/symfony/validator/Constraints/IsNull.php', + 'Symfony\\Component\\Validator\\Constraints\\IsNullValidator' => $vendorDir . '/symfony/validator/Constraints/IsNullValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\IsTrue' => $vendorDir . '/symfony/validator/Constraints/IsTrue.php', + 'Symfony\\Component\\Validator\\Constraints\\IsTrueValidator' => $vendorDir . '/symfony/validator/Constraints/IsTrueValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Isbn' => $vendorDir . '/symfony/validator/Constraints/Isbn.php', + 'Symfony\\Component\\Validator\\Constraints\\IsbnValidator' => $vendorDir . '/symfony/validator/Constraints/IsbnValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Issn' => $vendorDir . '/symfony/validator/Constraints/Issn.php', + 'Symfony\\Component\\Validator\\Constraints\\IssnValidator' => $vendorDir . '/symfony/validator/Constraints/IssnValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Language' => $vendorDir . '/symfony/validator/Constraints/Language.php', + 'Symfony\\Component\\Validator\\Constraints\\LanguageValidator' => $vendorDir . '/symfony/validator/Constraints/LanguageValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Length' => $vendorDir . '/symfony/validator/Constraints/Length.php', + 'Symfony\\Component\\Validator\\Constraints\\LengthValidator' => $vendorDir . '/symfony/validator/Constraints/LengthValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\LessThan' => $vendorDir . '/symfony/validator/Constraints/LessThan.php', + 'Symfony\\Component\\Validator\\Constraints\\LessThanOrEqual' => $vendorDir . '/symfony/validator/Constraints/LessThanOrEqual.php', + 'Symfony\\Component\\Validator\\Constraints\\LessThanOrEqualValidator' => $vendorDir . '/symfony/validator/Constraints/LessThanOrEqualValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\LessThanValidator' => $vendorDir . '/symfony/validator/Constraints/LessThanValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Locale' => $vendorDir . '/symfony/validator/Constraints/Locale.php', + 'Symfony\\Component\\Validator\\Constraints\\LocaleValidator' => $vendorDir . '/symfony/validator/Constraints/LocaleValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Luhn' => $vendorDir . '/symfony/validator/Constraints/Luhn.php', + 'Symfony\\Component\\Validator\\Constraints\\LuhnValidator' => $vendorDir . '/symfony/validator/Constraints/LuhnValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\NotBlank' => $vendorDir . '/symfony/validator/Constraints/NotBlank.php', + 'Symfony\\Component\\Validator\\Constraints\\NotBlankValidator' => $vendorDir . '/symfony/validator/Constraints/NotBlankValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\NotEqualTo' => $vendorDir . '/symfony/validator/Constraints/NotEqualTo.php', + 'Symfony\\Component\\Validator\\Constraints\\NotEqualToValidator' => $vendorDir . '/symfony/validator/Constraints/NotEqualToValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\NotIdenticalTo' => $vendorDir . '/symfony/validator/Constraints/NotIdenticalTo.php', + 'Symfony\\Component\\Validator\\Constraints\\NotIdenticalToValidator' => $vendorDir . '/symfony/validator/Constraints/NotIdenticalToValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\NotNull' => $vendorDir . '/symfony/validator/Constraints/NotNull.php', + 'Symfony\\Component\\Validator\\Constraints\\NotNullValidator' => $vendorDir . '/symfony/validator/Constraints/NotNullValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Null' => $vendorDir . '/symfony/validator/Constraints/Null.php', + 'Symfony\\Component\\Validator\\Constraints\\NullValidator' => $vendorDir . '/symfony/validator/Constraints/NullValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Optional' => $vendorDir . '/symfony/validator/Constraints/Optional.php', + 'Symfony\\Component\\Validator\\Constraints\\Range' => $vendorDir . '/symfony/validator/Constraints/Range.php', + 'Symfony\\Component\\Validator\\Constraints\\RangeValidator' => $vendorDir . '/symfony/validator/Constraints/RangeValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Regex' => $vendorDir . '/symfony/validator/Constraints/Regex.php', + 'Symfony\\Component\\Validator\\Constraints\\RegexValidator' => $vendorDir . '/symfony/validator/Constraints/RegexValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Required' => $vendorDir . '/symfony/validator/Constraints/Required.php', + 'Symfony\\Component\\Validator\\Constraints\\Time' => $vendorDir . '/symfony/validator/Constraints/Time.php', + 'Symfony\\Component\\Validator\\Constraints\\TimeValidator' => $vendorDir . '/symfony/validator/Constraints/TimeValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Traverse' => $vendorDir . '/symfony/validator/Constraints/Traverse.php', + 'Symfony\\Component\\Validator\\Constraints\\True' => $vendorDir . '/symfony/validator/Constraints/True.php', + 'Symfony\\Component\\Validator\\Constraints\\TrueValidator' => $vendorDir . '/symfony/validator/Constraints/TrueValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Type' => $vendorDir . '/symfony/validator/Constraints/Type.php', + 'Symfony\\Component\\Validator\\Constraints\\TypeValidator' => $vendorDir . '/symfony/validator/Constraints/TypeValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Url' => $vendorDir . '/symfony/validator/Constraints/Url.php', + 'Symfony\\Component\\Validator\\Constraints\\UrlValidator' => $vendorDir . '/symfony/validator/Constraints/UrlValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Uuid' => $vendorDir . '/symfony/validator/Constraints/Uuid.php', + 'Symfony\\Component\\Validator\\Constraints\\UuidValidator' => $vendorDir . '/symfony/validator/Constraints/UuidValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Valid' => $vendorDir . '/symfony/validator/Constraints/Valid.php', + 'Symfony\\Component\\Validator\\Context\\ExecutionContext' => $vendorDir . '/symfony/validator/Context/ExecutionContext.php', + 'Symfony\\Component\\Validator\\Context\\ExecutionContextFactory' => $vendorDir . '/symfony/validator/Context/ExecutionContextFactory.php', + 'Symfony\\Component\\Validator\\Context\\ExecutionContextFactoryInterface' => $vendorDir . '/symfony/validator/Context/ExecutionContextFactoryInterface.php', + 'Symfony\\Component\\Validator\\Context\\ExecutionContextInterface' => $vendorDir . '/symfony/validator/Context/ExecutionContextInterface.php', + 'Symfony\\Component\\Validator\\Context\\LegacyExecutionContext' => $vendorDir . '/symfony/validator/Context/LegacyExecutionContext.php', + 'Symfony\\Component\\Validator\\Context\\LegacyExecutionContextFactory' => $vendorDir . '/symfony/validator/Context/LegacyExecutionContextFactory.php', + 'Symfony\\Component\\Validator\\DefaultTranslator' => $vendorDir . '/symfony/validator/DefaultTranslator.php', + 'Symfony\\Component\\Validator\\Exception\\BadMethodCallException' => $vendorDir . '/symfony/validator/Exception/BadMethodCallException.php', + 'Symfony\\Component\\Validator\\Exception\\ConstraintDefinitionException' => $vendorDir . '/symfony/validator/Exception/ConstraintDefinitionException.php', + 'Symfony\\Component\\Validator\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/validator/Exception/ExceptionInterface.php', + 'Symfony\\Component\\Validator\\Exception\\GroupDefinitionException' => $vendorDir . '/symfony/validator/Exception/GroupDefinitionException.php', + 'Symfony\\Component\\Validator\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/validator/Exception/InvalidArgumentException.php', + 'Symfony\\Component\\Validator\\Exception\\InvalidOptionsException' => $vendorDir . '/symfony/validator/Exception/InvalidOptionsException.php', + 'Symfony\\Component\\Validator\\Exception\\MappingException' => $vendorDir . '/symfony/validator/Exception/MappingException.php', + 'Symfony\\Component\\Validator\\Exception\\MissingOptionsException' => $vendorDir . '/symfony/validator/Exception/MissingOptionsException.php', + 'Symfony\\Component\\Validator\\Exception\\NoSuchMetadataException' => $vendorDir . '/symfony/validator/Exception/NoSuchMetadataException.php', + 'Symfony\\Component\\Validator\\Exception\\OutOfBoundsException' => $vendorDir . '/symfony/validator/Exception/OutOfBoundsException.php', + 'Symfony\\Component\\Validator\\Exception\\RuntimeException' => $vendorDir . '/symfony/validator/Exception/RuntimeException.php', + 'Symfony\\Component\\Validator\\Exception\\UnexpectedTypeException' => $vendorDir . '/symfony/validator/Exception/UnexpectedTypeException.php', + 'Symfony\\Component\\Validator\\Exception\\UnsupportedMetadataException' => $vendorDir . '/symfony/validator/Exception/UnsupportedMetadataException.php', + 'Symfony\\Component\\Validator\\Exception\\ValidatorException' => $vendorDir . '/symfony/validator/Exception/ValidatorException.php', + 'Symfony\\Component\\Validator\\ExecutionContext' => $vendorDir . '/symfony/validator/ExecutionContext.php', + 'Symfony\\Component\\Validator\\ExecutionContextInterface' => $vendorDir . '/symfony/validator/ExecutionContextInterface.php', + 'Symfony\\Component\\Validator\\GlobalExecutionContextInterface' => $vendorDir . '/symfony/validator/GlobalExecutionContextInterface.php', + 'Symfony\\Component\\Validator\\GroupSequenceProviderInterface' => $vendorDir . '/symfony/validator/GroupSequenceProviderInterface.php', + 'Symfony\\Component\\Validator\\Mapping\\BlackholeMetadataFactory' => $vendorDir . '/symfony/validator/Mapping/BlackholeMetadataFactory.php', + 'Symfony\\Component\\Validator\\Mapping\\Cache\\ApcCache' => $vendorDir . '/symfony/validator/Mapping/Cache/ApcCache.php', + 'Symfony\\Component\\Validator\\Mapping\\Cache\\CacheInterface' => $vendorDir . '/symfony/validator/Mapping/Cache/CacheInterface.php', + 'Symfony\\Component\\Validator\\Mapping\\Cache\\DoctrineCache' => $vendorDir . '/symfony/validator/Mapping/Cache/DoctrineCache.php', + 'Symfony\\Component\\Validator\\Mapping\\CascadingStrategy' => $vendorDir . '/symfony/validator/Mapping/CascadingStrategy.php', + 'Symfony\\Component\\Validator\\Mapping\\ClassMetadata' => $vendorDir . '/symfony/validator/Mapping/ClassMetadata.php', + 'Symfony\\Component\\Validator\\Mapping\\ClassMetadataFactory' => $vendorDir . '/symfony/validator/Mapping/ClassMetadataFactory.php', + 'Symfony\\Component\\Validator\\Mapping\\ClassMetadataInterface' => $vendorDir . '/symfony/validator/Mapping/ClassMetadataInterface.php', + 'Symfony\\Component\\Validator\\Mapping\\ElementMetadata' => $vendorDir . '/symfony/validator/Mapping/ElementMetadata.php', + 'Symfony\\Component\\Validator\\Mapping\\Factory\\BlackHoleMetadataFactory' => $vendorDir . '/symfony/validator/Mapping/Factory/BlackHoleMetadataFactory.php', + 'Symfony\\Component\\Validator\\Mapping\\Factory\\LazyLoadingMetadataFactory' => $vendorDir . '/symfony/validator/Mapping/Factory/LazyLoadingMetadataFactory.php', + 'Symfony\\Component\\Validator\\Mapping\\Factory\\MetadataFactoryInterface' => $vendorDir . '/symfony/validator/Mapping/Factory/MetadataFactoryInterface.php', + 'Symfony\\Component\\Validator\\Mapping\\GenericMetadata' => $vendorDir . '/symfony/validator/Mapping/GenericMetadata.php', + 'Symfony\\Component\\Validator\\Mapping\\GetterMetadata' => $vendorDir . '/symfony/validator/Mapping/GetterMetadata.php', + 'Symfony\\Component\\Validator\\Mapping\\Loader\\AbstractLoader' => $vendorDir . '/symfony/validator/Mapping/Loader/AbstractLoader.php', + 'Symfony\\Component\\Validator\\Mapping\\Loader\\AnnotationLoader' => $vendorDir . '/symfony/validator/Mapping/Loader/AnnotationLoader.php', + 'Symfony\\Component\\Validator\\Mapping\\Loader\\FileLoader' => $vendorDir . '/symfony/validator/Mapping/Loader/FileLoader.php', + 'Symfony\\Component\\Validator\\Mapping\\Loader\\FilesLoader' => $vendorDir . '/symfony/validator/Mapping/Loader/FilesLoader.php', + 'Symfony\\Component\\Validator\\Mapping\\Loader\\LoaderChain' => $vendorDir . '/symfony/validator/Mapping/Loader/LoaderChain.php', + 'Symfony\\Component\\Validator\\Mapping\\Loader\\LoaderInterface' => $vendorDir . '/symfony/validator/Mapping/Loader/LoaderInterface.php', + 'Symfony\\Component\\Validator\\Mapping\\Loader\\StaticMethodLoader' => $vendorDir . '/symfony/validator/Mapping/Loader/StaticMethodLoader.php', + 'Symfony\\Component\\Validator\\Mapping\\Loader\\XmlFileLoader' => $vendorDir . '/symfony/validator/Mapping/Loader/XmlFileLoader.php', + 'Symfony\\Component\\Validator\\Mapping\\Loader\\XmlFilesLoader' => $vendorDir . '/symfony/validator/Mapping/Loader/XmlFilesLoader.php', + 'Symfony\\Component\\Validator\\Mapping\\Loader\\YamlFileLoader' => $vendorDir . '/symfony/validator/Mapping/Loader/YamlFileLoader.php', + 'Symfony\\Component\\Validator\\Mapping\\Loader\\YamlFilesLoader' => $vendorDir . '/symfony/validator/Mapping/Loader/YamlFilesLoader.php', + 'Symfony\\Component\\Validator\\Mapping\\MemberMetadata' => $vendorDir . '/symfony/validator/Mapping/MemberMetadata.php', + 'Symfony\\Component\\Validator\\Mapping\\MetadataInterface' => $vendorDir . '/symfony/validator/Mapping/MetadataInterface.php', + 'Symfony\\Component\\Validator\\Mapping\\PropertyMetadata' => $vendorDir . '/symfony/validator/Mapping/PropertyMetadata.php', + 'Symfony\\Component\\Validator\\Mapping\\PropertyMetadataInterface' => $vendorDir . '/symfony/validator/Mapping/PropertyMetadataInterface.php', + 'Symfony\\Component\\Validator\\Mapping\\TraversalStrategy' => $vendorDir . '/symfony/validator/Mapping/TraversalStrategy.php', + 'Symfony\\Component\\Validator\\MetadataFactoryInterface' => $vendorDir . '/symfony/validator/MetadataFactoryInterface.php', + 'Symfony\\Component\\Validator\\MetadataInterface' => $vendorDir . '/symfony/validator/MetadataInterface.php', + 'Symfony\\Component\\Validator\\ObjectInitializerInterface' => $vendorDir . '/symfony/validator/ObjectInitializerInterface.php', + 'Symfony\\Component\\Validator\\PropertyMetadataContainerInterface' => $vendorDir . '/symfony/validator/PropertyMetadataContainerInterface.php', + 'Symfony\\Component\\Validator\\PropertyMetadataInterface' => $vendorDir . '/symfony/validator/PropertyMetadataInterface.php', + 'Symfony\\Component\\Validator\\Util\\PropertyPath' => $vendorDir . '/symfony/validator/Util/PropertyPath.php', + 'Symfony\\Component\\Validator\\Validation' => $vendorDir . '/symfony/validator/Validation.php', + 'Symfony\\Component\\Validator\\ValidationVisitor' => $vendorDir . '/symfony/validator/ValidationVisitor.php', + 'Symfony\\Component\\Validator\\ValidationVisitorInterface' => $vendorDir . '/symfony/validator/ValidationVisitorInterface.php', + 'Symfony\\Component\\Validator\\Validator' => $vendorDir . '/symfony/validator/Validator.php', + 'Symfony\\Component\\Validator\\ValidatorBuilder' => $vendorDir . '/symfony/validator/ValidatorBuilder.php', + 'Symfony\\Component\\Validator\\ValidatorBuilderInterface' => $vendorDir . '/symfony/validator/ValidatorBuilderInterface.php', + 'Symfony\\Component\\Validator\\ValidatorInterface' => $vendorDir . '/symfony/validator/ValidatorInterface.php', + 'Symfony\\Component\\Validator\\Validator\\ContextualValidatorInterface' => $vendorDir . '/symfony/validator/Validator/ContextualValidatorInterface.php', + 'Symfony\\Component\\Validator\\Validator\\LegacyValidator' => $vendorDir . '/symfony/validator/Validator/LegacyValidator.php', + 'Symfony\\Component\\Validator\\Validator\\RecursiveContextualValidator' => $vendorDir . '/symfony/validator/Validator/RecursiveContextualValidator.php', + 'Symfony\\Component\\Validator\\Validator\\RecursiveValidator' => $vendorDir . '/symfony/validator/Validator/RecursiveValidator.php', + 'Symfony\\Component\\Validator\\Validator\\ValidatorInterface' => $vendorDir . '/symfony/validator/Validator/ValidatorInterface.php', + 'Symfony\\Component\\Validator\\Violation\\ConstraintViolationBuilder' => $vendorDir . '/symfony/validator/Violation/ConstraintViolationBuilder.php', + 'Symfony\\Component\\Validator\\Violation\\ConstraintViolationBuilderInterface' => $vendorDir . '/symfony/validator/Violation/ConstraintViolationBuilderInterface.php', + 'Symfony\\Component\\Validator\\Violation\\LegacyConstraintViolationBuilder' => $vendorDir . '/symfony/validator/Violation/LegacyConstraintViolationBuilder.php', + 'Symfony\\Component\\VarDumper\\Caster\\AmqpCaster' => $vendorDir . '/symfony/var-dumper/Caster/AmqpCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\ArgsStub' => $vendorDir . '/symfony/var-dumper/Caster/ArgsStub.php', + 'Symfony\\Component\\VarDumper\\Caster\\Caster' => $vendorDir . '/symfony/var-dumper/Caster/Caster.php', + 'Symfony\\Component\\VarDumper\\Caster\\ClassStub' => $vendorDir . '/symfony/var-dumper/Caster/ClassStub.php', + 'Symfony\\Component\\VarDumper\\Caster\\ConstStub' => $vendorDir . '/symfony/var-dumper/Caster/ConstStub.php', + 'Symfony\\Component\\VarDumper\\Caster\\CutArrayStub' => $vendorDir . '/symfony/var-dumper/Caster/CutArrayStub.php', + 'Symfony\\Component\\VarDumper\\Caster\\CutStub' => $vendorDir . '/symfony/var-dumper/Caster/CutStub.php', + 'Symfony\\Component\\VarDumper\\Caster\\DOMCaster' => $vendorDir . '/symfony/var-dumper/Caster/DOMCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\DateCaster' => $vendorDir . '/symfony/var-dumper/Caster/DateCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\DoctrineCaster' => $vendorDir . '/symfony/var-dumper/Caster/DoctrineCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\EnumStub' => $vendorDir . '/symfony/var-dumper/Caster/EnumStub.php', + '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\\LinkStub' => $vendorDir . '/symfony/var-dumper/Caster/LinkStub.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\\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', + 'Symfony\\Component\\VarDumper\\Caster\\SplCaster' => $vendorDir . '/symfony/var-dumper/Caster/SplCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\StubCaster' => $vendorDir . '/symfony/var-dumper/Caster/StubCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\SymfonyCaster' => $vendorDir . '/symfony/var-dumper/Caster/SymfonyCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\TraceStub' => $vendorDir . '/symfony/var-dumper/Caster/TraceStub.php', + 'Symfony\\Component\\VarDumper\\Caster\\XmlReaderCaster' => $vendorDir . '/symfony/var-dumper/Caster/XmlReaderCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\XmlResourceCaster' => $vendorDir . '/symfony/var-dumper/Caster/XmlResourceCaster.php', + 'Symfony\\Component\\VarDumper\\Cloner\\AbstractCloner' => $vendorDir . '/symfony/var-dumper/Cloner/AbstractCloner.php', + 'Symfony\\Component\\VarDumper\\Cloner\\ClonerInterface' => $vendorDir . '/symfony/var-dumper/Cloner/ClonerInterface.php', + 'Symfony\\Component\\VarDumper\\Cloner\\Cursor' => $vendorDir . '/symfony/var-dumper/Cloner/Cursor.php', + 'Symfony\\Component\\VarDumper\\Cloner\\Data' => $vendorDir . '/symfony/var-dumper/Cloner/Data.php', + 'Symfony\\Component\\VarDumper\\Cloner\\DumperInterface' => $vendorDir . '/symfony/var-dumper/Cloner/DumperInterface.php', + 'Symfony\\Component\\VarDumper\\Cloner\\Stub' => $vendorDir . '/symfony/var-dumper/Cloner/Stub.php', + 'Symfony\\Component\\VarDumper\\Cloner\\VarCloner' => $vendorDir . '/symfony/var-dumper/Cloner/VarCloner.php', + 'Symfony\\Component\\VarDumper\\Dumper\\AbstractDumper' => $vendorDir . '/symfony/var-dumper/Dumper/AbstractDumper.php', + 'Symfony\\Component\\VarDumper\\Dumper\\CliDumper' => $vendorDir . '/symfony/var-dumper/Dumper/CliDumper.php', + 'Symfony\\Component\\VarDumper\\Dumper\\DataDumperInterface' => $vendorDir . '/symfony/var-dumper/Dumper/DataDumperInterface.php', + 'Symfony\\Component\\VarDumper\\Dumper\\HtmlDumper' => $vendorDir . '/symfony/var-dumper/Dumper/HtmlDumper.php', + 'Symfony\\Component\\VarDumper\\Exception\\ThrowingCasterException' => $vendorDir . '/symfony/var-dumper/Exception/ThrowingCasterException.php', + 'Symfony\\Component\\VarDumper\\Test\\VarDumperTestTrait' => $vendorDir . '/symfony/var-dumper/Test/VarDumperTestTrait.php', + 'Symfony\\Component\\VarDumper\\VarDumper' => $vendorDir . '/symfony/var-dumper/VarDumper.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', + 'Text_Template' => $vendorDir . '/phpunit/php-text-template/src/Template.php', + 'TheSeer\\Tokenizer\\Exception' => $vendorDir . '/theseer/tokenizer/src/Exception.php', + 'TheSeer\\Tokenizer\\NamespaceUri' => $vendorDir . '/theseer/tokenizer/src/NamespaceUri.php', + 'TheSeer\\Tokenizer\\NamespaceUriException' => $vendorDir . '/theseer/tokenizer/src/NamespaceUriException.php', + 'TheSeer\\Tokenizer\\Token' => $vendorDir . '/theseer/tokenizer/src/Token.php', + 'TheSeer\\Tokenizer\\TokenCollection' => $vendorDir . '/theseer/tokenizer/src/TokenCollection.php', + 'TheSeer\\Tokenizer\\TokenCollectionException' => $vendorDir . '/theseer/tokenizer/src/TokenCollectionException.php', + 'TheSeer\\Tokenizer\\Tokenizer' => $vendorDir . '/theseer/tokenizer/src/Tokenizer.php', + 'TheSeer\\Tokenizer\\XMLSerializer' => $vendorDir . '/theseer/tokenizer/src/XMLSerializer.php', + 'Twig\\Cache\\CacheInterface' => $vendorDir . '/twig/twig/src/Cache/CacheInterface.php', + 'Twig\\Cache\\FilesystemCache' => $vendorDir . '/twig/twig/src/Cache/FilesystemCache.php', + 'Twig\\Cache\\NullCache' => $vendorDir . '/twig/twig/src/Cache/NullCache.php', + 'Twig\\Compiler' => $vendorDir . '/twig/twig/src/Compiler.php', + 'Twig\\Environment' => $vendorDir . '/twig/twig/src/Environment.php', + 'Twig\\Error\\Error' => $vendorDir . '/twig/twig/src/Error/Error.php', + 'Twig\\Error\\LoaderError' => $vendorDir . '/twig/twig/src/Error/LoaderError.php', + 'Twig\\Error\\RuntimeError' => $vendorDir . '/twig/twig/src/Error/RuntimeError.php', + 'Twig\\Error\\SyntaxError' => $vendorDir . '/twig/twig/src/Error/SyntaxError.php', + 'Twig\\ExpressionParser' => $vendorDir . '/twig/twig/src/ExpressionParser.php', + 'Twig\\Extension\\AbstractExtension' => $vendorDir . '/twig/twig/src/Extension/AbstractExtension.php', + 'Twig\\Extension\\CoreExtension' => $vendorDir . '/twig/twig/src/Extension/CoreExtension.php', + 'Twig\\Extension\\DebugExtension' => $vendorDir . '/twig/twig/src/Extension/DebugExtension.php', + 'Twig\\Extension\\EscaperExtension' => $vendorDir . '/twig/twig/src/Extension/EscaperExtension.php', + 'Twig\\Extension\\ExtensionInterface' => $vendorDir . '/twig/twig/src/Extension/ExtensionInterface.php', + 'Twig\\Extension\\GlobalsInterface' => $vendorDir . '/twig/twig/src/Extension/GlobalsInterface.php', + 'Twig\\Extension\\InitRuntimeInterface' => $vendorDir . '/twig/twig/src/Extension/InitRuntimeInterface.php', + 'Twig\\Extension\\OptimizerExtension' => $vendorDir . '/twig/twig/src/Extension/OptimizerExtension.php', + 'Twig\\Extension\\ProfilerExtension' => $vendorDir . '/twig/twig/src/Extension/ProfilerExtension.php', + 'Twig\\Extension\\RuntimeExtensionInterface' => $vendorDir . '/twig/twig/src/Extension/RuntimeExtensionInterface.php', + 'Twig\\Extension\\SandboxExtension' => $vendorDir . '/twig/twig/src/Extension/SandboxExtension.php', + 'Twig\\Extension\\StagingExtension' => $vendorDir . '/twig/twig/src/Extension/StagingExtension.php', + 'Twig\\Extension\\StringLoaderExtension' => $vendorDir . '/twig/twig/src/Extension/StringLoaderExtension.php', + 'Twig\\FileExtensionEscapingStrategy' => $vendorDir . '/twig/twig/src/FileExtensionEscapingStrategy.php', + 'Twig\\Lexer' => $vendorDir . '/twig/twig/src/Lexer.php', + 'Twig\\Loader\\ArrayLoader' => $vendorDir . '/twig/twig/src/Loader/ArrayLoader.php', + 'Twig\\Loader\\ChainLoader' => $vendorDir . '/twig/twig/src/Loader/ChainLoader.php', + 'Twig\\Loader\\ExistsLoaderInterface' => $vendorDir . '/twig/twig/src/Loader/ExistsLoaderInterface.php', + 'Twig\\Loader\\FilesystemLoader' => $vendorDir . '/twig/twig/src/Loader/FilesystemLoader.php', + 'Twig\\Loader\\LoaderInterface' => $vendorDir . '/twig/twig/src/Loader/LoaderInterface.php', + 'Twig\\Loader\\SourceContextLoaderInterface' => $vendorDir . '/twig/twig/src/Loader/SourceContextLoaderInterface.php', + 'Twig\\Markup' => $vendorDir . '/twig/twig/src/Markup.php', + 'Twig\\NodeTraverser' => $vendorDir . '/twig/twig/src/NodeTraverser.php', + 'Twig\\NodeVisitor\\AbstractNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/AbstractNodeVisitor.php', + 'Twig\\NodeVisitor\\EscaperNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/EscaperNodeVisitor.php', + 'Twig\\NodeVisitor\\NodeVisitorInterface' => $vendorDir . '/twig/twig/src/NodeVisitor/NodeVisitorInterface.php', + 'Twig\\NodeVisitor\\OptimizerNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/OptimizerNodeVisitor.php', + 'Twig\\NodeVisitor\\SafeAnalysisNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.php', + 'Twig\\NodeVisitor\\SandboxNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/SandboxNodeVisitor.php', + 'Twig\\Node\\AutoEscapeNode' => $vendorDir . '/twig/twig/src/Node/AutoEscapeNode.php', + 'Twig\\Node\\BlockNode' => $vendorDir . '/twig/twig/src/Node/BlockNode.php', + 'Twig\\Node\\BlockReferenceNode' => $vendorDir . '/twig/twig/src/Node/BlockReferenceNode.php', + 'Twig\\Node\\BodyNode' => $vendorDir . '/twig/twig/src/Node/BodyNode.php', + 'Twig\\Node\\CheckSecurityNode' => $vendorDir . '/twig/twig/src/Node/CheckSecurityNode.php', + 'Twig\\Node\\CheckToStringNode' => $vendorDir . '/twig/twig/src/Node/CheckToStringNode.php', + 'Twig\\Node\\DeprecatedNode' => $vendorDir . '/twig/twig/src/Node/DeprecatedNode.php', + 'Twig\\Node\\DoNode' => $vendorDir . '/twig/twig/src/Node/DoNode.php', + 'Twig\\Node\\EmbedNode' => $vendorDir . '/twig/twig/src/Node/EmbedNode.php', + 'Twig\\Node\\Expression\\AbstractExpression' => $vendorDir . '/twig/twig/src/Node/Expression/AbstractExpression.php', + 'Twig\\Node\\Expression\\ArrayExpression' => $vendorDir . '/twig/twig/src/Node/Expression/ArrayExpression.php', + 'Twig\\Node\\Expression\\ArrowFunctionExpression' => $vendorDir . '/twig/twig/src/Node/Expression/ArrowFunctionExpression.php', + 'Twig\\Node\\Expression\\AssignNameExpression' => $vendorDir . '/twig/twig/src/Node/Expression/AssignNameExpression.php', + 'Twig\\Node\\Expression\\Binary\\AbstractBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/AbstractBinary.php', + 'Twig\\Node\\Expression\\Binary\\AddBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/AddBinary.php', + 'Twig\\Node\\Expression\\Binary\\AndBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/AndBinary.php', + 'Twig\\Node\\Expression\\Binary\\BitwiseAndBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/BitwiseAndBinary.php', + 'Twig\\Node\\Expression\\Binary\\BitwiseOrBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/BitwiseOrBinary.php', + 'Twig\\Node\\Expression\\Binary\\BitwiseXorBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/BitwiseXorBinary.php', + 'Twig\\Node\\Expression\\Binary\\ConcatBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/ConcatBinary.php', + 'Twig\\Node\\Expression\\Binary\\DivBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/DivBinary.php', + 'Twig\\Node\\Expression\\Binary\\EndsWithBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/EndsWithBinary.php', + 'Twig\\Node\\Expression\\Binary\\EqualBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/EqualBinary.php', + 'Twig\\Node\\Expression\\Binary\\FloorDivBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/FloorDivBinary.php', + 'Twig\\Node\\Expression\\Binary\\GreaterBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/GreaterBinary.php', + 'Twig\\Node\\Expression\\Binary\\GreaterEqualBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/GreaterEqualBinary.php', + 'Twig\\Node\\Expression\\Binary\\InBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/InBinary.php', + 'Twig\\Node\\Expression\\Binary\\LessBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/LessBinary.php', + 'Twig\\Node\\Expression\\Binary\\LessEqualBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/LessEqualBinary.php', + 'Twig\\Node\\Expression\\Binary\\MatchesBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/MatchesBinary.php', + 'Twig\\Node\\Expression\\Binary\\ModBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/ModBinary.php', + 'Twig\\Node\\Expression\\Binary\\MulBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/MulBinary.php', + 'Twig\\Node\\Expression\\Binary\\NotEqualBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/NotEqualBinary.php', + 'Twig\\Node\\Expression\\Binary\\NotInBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/NotInBinary.php', + 'Twig\\Node\\Expression\\Binary\\OrBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/OrBinary.php', + 'Twig\\Node\\Expression\\Binary\\PowerBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/PowerBinary.php', + 'Twig\\Node\\Expression\\Binary\\RangeBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/RangeBinary.php', + 'Twig\\Node\\Expression\\Binary\\StartsWithBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/StartsWithBinary.php', + 'Twig\\Node\\Expression\\Binary\\SubBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/SubBinary.php', + 'Twig\\Node\\Expression\\BlockReferenceExpression' => $vendorDir . '/twig/twig/src/Node/Expression/BlockReferenceExpression.php', + 'Twig\\Node\\Expression\\CallExpression' => $vendorDir . '/twig/twig/src/Node/Expression/CallExpression.php', + 'Twig\\Node\\Expression\\ConditionalExpression' => $vendorDir . '/twig/twig/src/Node/Expression/ConditionalExpression.php', + 'Twig\\Node\\Expression\\ConstantExpression' => $vendorDir . '/twig/twig/src/Node/Expression/ConstantExpression.php', + 'Twig\\Node\\Expression\\FilterExpression' => $vendorDir . '/twig/twig/src/Node/Expression/FilterExpression.php', + 'Twig\\Node\\Expression\\Filter\\DefaultFilter' => $vendorDir . '/twig/twig/src/Node/Expression/Filter/DefaultFilter.php', + 'Twig\\Node\\Expression\\FunctionExpression' => $vendorDir . '/twig/twig/src/Node/Expression/FunctionExpression.php', + 'Twig\\Node\\Expression\\GetAttrExpression' => $vendorDir . '/twig/twig/src/Node/Expression/GetAttrExpression.php', + 'Twig\\Node\\Expression\\InlinePrint' => $vendorDir . '/twig/twig/src/Node/Expression/InlinePrint.php', + 'Twig\\Node\\Expression\\MethodCallExpression' => $vendorDir . '/twig/twig/src/Node/Expression/MethodCallExpression.php', + 'Twig\\Node\\Expression\\NameExpression' => $vendorDir . '/twig/twig/src/Node/Expression/NameExpression.php', + 'Twig\\Node\\Expression\\NullCoalesceExpression' => $vendorDir . '/twig/twig/src/Node/Expression/NullCoalesceExpression.php', + 'Twig\\Node\\Expression\\ParentExpression' => $vendorDir . '/twig/twig/src/Node/Expression/ParentExpression.php', + 'Twig\\Node\\Expression\\TempNameExpression' => $vendorDir . '/twig/twig/src/Node/Expression/TempNameExpression.php', + 'Twig\\Node\\Expression\\TestExpression' => $vendorDir . '/twig/twig/src/Node/Expression/TestExpression.php', + 'Twig\\Node\\Expression\\Test\\ConstantTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/ConstantTest.php', + 'Twig\\Node\\Expression\\Test\\DefinedTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/DefinedTest.php', + 'Twig\\Node\\Expression\\Test\\DivisiblebyTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/DivisiblebyTest.php', + 'Twig\\Node\\Expression\\Test\\EvenTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/EvenTest.php', + 'Twig\\Node\\Expression\\Test\\NullTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/NullTest.php', + 'Twig\\Node\\Expression\\Test\\OddTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/OddTest.php', + 'Twig\\Node\\Expression\\Test\\SameasTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/SameasTest.php', + 'Twig\\Node\\Expression\\Unary\\AbstractUnary' => $vendorDir . '/twig/twig/src/Node/Expression/Unary/AbstractUnary.php', + 'Twig\\Node\\Expression\\Unary\\NegUnary' => $vendorDir . '/twig/twig/src/Node/Expression/Unary/NegUnary.php', + 'Twig\\Node\\Expression\\Unary\\NotUnary' => $vendorDir . '/twig/twig/src/Node/Expression/Unary/NotUnary.php', + 'Twig\\Node\\Expression\\Unary\\PosUnary' => $vendorDir . '/twig/twig/src/Node/Expression/Unary/PosUnary.php', + 'Twig\\Node\\FlushNode' => $vendorDir . '/twig/twig/src/Node/FlushNode.php', + 'Twig\\Node\\ForLoopNode' => $vendorDir . '/twig/twig/src/Node/ForLoopNode.php', + 'Twig\\Node\\ForNode' => $vendorDir . '/twig/twig/src/Node/ForNode.php', + 'Twig\\Node\\IfNode' => $vendorDir . '/twig/twig/src/Node/IfNode.php', + 'Twig\\Node\\ImportNode' => $vendorDir . '/twig/twig/src/Node/ImportNode.php', + 'Twig\\Node\\IncludeNode' => $vendorDir . '/twig/twig/src/Node/IncludeNode.php', + 'Twig\\Node\\MacroNode' => $vendorDir . '/twig/twig/src/Node/MacroNode.php', + 'Twig\\Node\\ModuleNode' => $vendorDir . '/twig/twig/src/Node/ModuleNode.php', + 'Twig\\Node\\Node' => $vendorDir . '/twig/twig/src/Node/Node.php', + 'Twig\\Node\\NodeCaptureInterface' => $vendorDir . '/twig/twig/src/Node/NodeCaptureInterface.php', + 'Twig\\Node\\NodeOutputInterface' => $vendorDir . '/twig/twig/src/Node/NodeOutputInterface.php', + 'Twig\\Node\\PrintNode' => $vendorDir . '/twig/twig/src/Node/PrintNode.php', + 'Twig\\Node\\SandboxNode' => $vendorDir . '/twig/twig/src/Node/SandboxNode.php', + 'Twig\\Node\\SandboxedPrintNode' => $vendorDir . '/twig/twig/src/Node/SandboxedPrintNode.php', + 'Twig\\Node\\SetNode' => $vendorDir . '/twig/twig/src/Node/SetNode.php', + 'Twig\\Node\\SetTempNode' => $vendorDir . '/twig/twig/src/Node/SetTempNode.php', + 'Twig\\Node\\SpacelessNode' => $vendorDir . '/twig/twig/src/Node/SpacelessNode.php', + 'Twig\\Node\\TextNode' => $vendorDir . '/twig/twig/src/Node/TextNode.php', + 'Twig\\Node\\WithNode' => $vendorDir . '/twig/twig/src/Node/WithNode.php', + 'Twig\\Parser' => $vendorDir . '/twig/twig/src/Parser.php', + 'Twig\\Profiler\\Dumper\\BaseDumper' => $vendorDir . '/twig/twig/src/Profiler/Dumper/BaseDumper.php', + 'Twig\\Profiler\\Dumper\\BlackfireDumper' => $vendorDir . '/twig/twig/src/Profiler/Dumper/BlackfireDumper.php', + 'Twig\\Profiler\\Dumper\\HtmlDumper' => $vendorDir . '/twig/twig/src/Profiler/Dumper/HtmlDumper.php', + 'Twig\\Profiler\\Dumper\\TextDumper' => $vendorDir . '/twig/twig/src/Profiler/Dumper/TextDumper.php', + 'Twig\\Profiler\\NodeVisitor\\ProfilerNodeVisitor' => $vendorDir . '/twig/twig/src/Profiler/NodeVisitor/ProfilerNodeVisitor.php', + 'Twig\\Profiler\\Node\\EnterProfileNode' => $vendorDir . '/twig/twig/src/Profiler/Node/EnterProfileNode.php', + 'Twig\\Profiler\\Node\\LeaveProfileNode' => $vendorDir . '/twig/twig/src/Profiler/Node/LeaveProfileNode.php', + 'Twig\\Profiler\\Profile' => $vendorDir . '/twig/twig/src/Profiler/Profile.php', + 'Twig\\RuntimeLoader\\ContainerRuntimeLoader' => $vendorDir . '/twig/twig/src/RuntimeLoader/ContainerRuntimeLoader.php', + 'Twig\\RuntimeLoader\\FactoryRuntimeLoader' => $vendorDir . '/twig/twig/src/RuntimeLoader/FactoryRuntimeLoader.php', + 'Twig\\RuntimeLoader\\RuntimeLoaderInterface' => $vendorDir . '/twig/twig/src/RuntimeLoader/RuntimeLoaderInterface.php', + 'Twig\\Sandbox\\SecurityError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityError.php', + 'Twig\\Sandbox\\SecurityNotAllowedFilterError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityNotAllowedFilterError.php', + 'Twig\\Sandbox\\SecurityNotAllowedFunctionError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityNotAllowedFunctionError.php', + 'Twig\\Sandbox\\SecurityNotAllowedMethodError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityNotAllowedMethodError.php', + 'Twig\\Sandbox\\SecurityNotAllowedPropertyError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityNotAllowedPropertyError.php', + 'Twig\\Sandbox\\SecurityNotAllowedTagError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityNotAllowedTagError.php', + 'Twig\\Sandbox\\SecurityPolicy' => $vendorDir . '/twig/twig/src/Sandbox/SecurityPolicy.php', + 'Twig\\Sandbox\\SecurityPolicyInterface' => $vendorDir . '/twig/twig/src/Sandbox/SecurityPolicyInterface.php', + 'Twig\\Source' => $vendorDir . '/twig/twig/src/Source.php', + 'Twig\\Template' => $vendorDir . '/twig/twig/src/Template.php', + 'Twig\\TemplateWrapper' => $vendorDir . '/twig/twig/src/TemplateWrapper.php', + 'Twig\\Test\\IntegrationTestCase' => $vendorDir . '/twig/twig/src/Test/IntegrationTestCase.php', + 'Twig\\Test\\NodeTestCase' => $vendorDir . '/twig/twig/src/Test/NodeTestCase.php', + 'Twig\\Token' => $vendorDir . '/twig/twig/src/Token.php', + 'Twig\\TokenParser\\AbstractTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/AbstractTokenParser.php', + 'Twig\\TokenParser\\ApplyTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/ApplyTokenParser.php', + 'Twig\\TokenParser\\AutoEscapeTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/AutoEscapeTokenParser.php', + 'Twig\\TokenParser\\BlockTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/BlockTokenParser.php', + 'Twig\\TokenParser\\DeprecatedTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/DeprecatedTokenParser.php', + 'Twig\\TokenParser\\DoTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/DoTokenParser.php', + 'Twig\\TokenParser\\EmbedTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/EmbedTokenParser.php', + 'Twig\\TokenParser\\ExtendsTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/ExtendsTokenParser.php', + 'Twig\\TokenParser\\FilterTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/FilterTokenParser.php', + 'Twig\\TokenParser\\FlushTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/FlushTokenParser.php', + 'Twig\\TokenParser\\ForTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/ForTokenParser.php', + 'Twig\\TokenParser\\FromTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/FromTokenParser.php', + 'Twig\\TokenParser\\IfTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/IfTokenParser.php', + 'Twig\\TokenParser\\ImportTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/ImportTokenParser.php', + 'Twig\\TokenParser\\IncludeTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/IncludeTokenParser.php', + 'Twig\\TokenParser\\MacroTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/MacroTokenParser.php', + 'Twig\\TokenParser\\SandboxTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/SandboxTokenParser.php', + 'Twig\\TokenParser\\SetTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/SetTokenParser.php', + 'Twig\\TokenParser\\SpacelessTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/SpacelessTokenParser.php', + 'Twig\\TokenParser\\TokenParserInterface' => $vendorDir . '/twig/twig/src/TokenParser/TokenParserInterface.php', + 'Twig\\TokenParser\\UseTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/UseTokenParser.php', + 'Twig\\TokenParser\\WithTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/WithTokenParser.php', + 'Twig\\TokenStream' => $vendorDir . '/twig/twig/src/TokenStream.php', + 'Twig\\TwigFilter' => $vendorDir . '/twig/twig/src/TwigFilter.php', + 'Twig\\TwigFunction' => $vendorDir . '/twig/twig/src/TwigFunction.php', + 'Twig\\TwigTest' => $vendorDir . '/twig/twig/src/TwigTest.php', + 'Twig\\Util\\DeprecationCollector' => $vendorDir . '/twig/twig/src/Util/DeprecationCollector.php', + 'Twig\\Util\\TemplateDirIterator' => $vendorDir . '/twig/twig/src/Util/TemplateDirIterator.php', + 'Twig_Autoloader' => $vendorDir . '/twig/twig/lib/Twig/Autoloader.php', + 'Twig_BaseNodeVisitor' => $vendorDir . '/twig/twig/lib/Twig/BaseNodeVisitor.php', + 'Twig_CacheInterface' => $vendorDir . '/twig/twig/lib/Twig/CacheInterface.php', + 'Twig_Cache_Filesystem' => $vendorDir . '/twig/twig/lib/Twig/Cache/Filesystem.php', + 'Twig_Cache_Null' => $vendorDir . '/twig/twig/lib/Twig/Cache/Null.php', + 'Twig_Compiler' => $vendorDir . '/twig/twig/lib/Twig/Compiler.php', + 'Twig_CompilerInterface' => $vendorDir . '/twig/twig/lib/Twig/CompilerInterface.php', + 'Twig_ContainerRuntimeLoader' => $vendorDir . '/twig/twig/lib/Twig/ContainerRuntimeLoader.php', + 'Twig_Environment' => $vendorDir . '/twig/twig/lib/Twig/Environment.php', + 'Twig_Error' => $vendorDir . '/twig/twig/lib/Twig/Error.php', + 'Twig_Error_Loader' => $vendorDir . '/twig/twig/lib/Twig/Error/Loader.php', + 'Twig_Error_Runtime' => $vendorDir . '/twig/twig/lib/Twig/Error/Runtime.php', + 'Twig_Error_Syntax' => $vendorDir . '/twig/twig/lib/Twig/Error/Syntax.php', + 'Twig_ExistsLoaderInterface' => $vendorDir . '/twig/twig/lib/Twig/ExistsLoaderInterface.php', + 'Twig_ExpressionParser' => $vendorDir . '/twig/twig/lib/Twig/ExpressionParser.php', + 'Twig_Extension' => $vendorDir . '/twig/twig/lib/Twig/Extension.php', + 'Twig_ExtensionInterface' => $vendorDir . '/twig/twig/lib/Twig/ExtensionInterface.php', + 'Twig_Extension_Core' => $vendorDir . '/twig/twig/lib/Twig/Extension/Core.php', + 'Twig_Extension_Debug' => $vendorDir . '/twig/twig/lib/Twig/Extension/Debug.php', + 'Twig_Extension_Escaper' => $vendorDir . '/twig/twig/lib/Twig/Extension/Escaper.php', + 'Twig_Extension_GlobalsInterface' => $vendorDir . '/twig/twig/lib/Twig/Extension/GlobalsInterface.php', + 'Twig_Extension_InitRuntimeInterface' => $vendorDir . '/twig/twig/lib/Twig/Extension/InitRuntimeInterface.php', + 'Twig_Extension_Optimizer' => $vendorDir . '/twig/twig/lib/Twig/Extension/Optimizer.php', + 'Twig_Extension_Profiler' => $vendorDir . '/twig/twig/lib/Twig/Extension/Profiler.php', + 'Twig_Extension_Sandbox' => $vendorDir . '/twig/twig/lib/Twig/Extension/Sandbox.php', + 'Twig_Extension_Staging' => $vendorDir . '/twig/twig/lib/Twig/Extension/Staging.php', + 'Twig_Extension_StringLoader' => $vendorDir . '/twig/twig/lib/Twig/Extension/StringLoader.php', + 'Twig_FactoryRuntimeLoader' => $vendorDir . '/twig/twig/lib/Twig/FactoryRuntimeLoader.php', + 'Twig_FileExtensionEscapingStrategy' => $vendorDir . '/twig/twig/lib/Twig/FileExtensionEscapingStrategy.php', + 'Twig_Filter' => $vendorDir . '/twig/twig/lib/Twig/Filter.php', + 'Twig_FilterCallableInterface' => $vendorDir . '/twig/twig/lib/Twig/FilterCallableInterface.php', + 'Twig_FilterInterface' => $vendorDir . '/twig/twig/lib/Twig/FilterInterface.php', + 'Twig_Filter_Function' => $vendorDir . '/twig/twig/lib/Twig/Filter/Function.php', + 'Twig_Filter_Method' => $vendorDir . '/twig/twig/lib/Twig/Filter/Method.php', + 'Twig_Filter_Node' => $vendorDir . '/twig/twig/lib/Twig/Filter/Node.php', + 'Twig_Function' => $vendorDir . '/twig/twig/lib/Twig/Function.php', + 'Twig_FunctionCallableInterface' => $vendorDir . '/twig/twig/lib/Twig/FunctionCallableInterface.php', + 'Twig_FunctionInterface' => $vendorDir . '/twig/twig/lib/Twig/FunctionInterface.php', + 'Twig_Function_Function' => $vendorDir . '/twig/twig/lib/Twig/Function/Function.php', + 'Twig_Function_Method' => $vendorDir . '/twig/twig/lib/Twig/Function/Method.php', + 'Twig_Function_Node' => $vendorDir . '/twig/twig/lib/Twig/Function/Node.php', + 'Twig_Lexer' => $vendorDir . '/twig/twig/lib/Twig/Lexer.php', + 'Twig_LexerInterface' => $vendorDir . '/twig/twig/lib/Twig/LexerInterface.php', + 'Twig_LoaderInterface' => $vendorDir . '/twig/twig/lib/Twig/LoaderInterface.php', + 'Twig_Loader_Array' => $vendorDir . '/twig/twig/lib/Twig/Loader/Array.php', + 'Twig_Loader_Chain' => $vendorDir . '/twig/twig/lib/Twig/Loader/Chain.php', + 'Twig_Loader_Filesystem' => $vendorDir . '/twig/twig/lib/Twig/Loader/Filesystem.php', + 'Twig_Loader_String' => $vendorDir . '/twig/twig/lib/Twig/Loader/String.php', + 'Twig_Markup' => $vendorDir . '/twig/twig/lib/Twig/Markup.php', + 'Twig_Node' => $vendorDir . '/twig/twig/lib/Twig/Node.php', + 'Twig_NodeCaptureInterface' => $vendorDir . '/twig/twig/lib/Twig/NodeCaptureInterface.php', + 'Twig_NodeInterface' => $vendorDir . '/twig/twig/lib/Twig/NodeInterface.php', + 'Twig_NodeOutputInterface' => $vendorDir . '/twig/twig/lib/Twig/NodeOutputInterface.php', + 'Twig_NodeTraverser' => $vendorDir . '/twig/twig/lib/Twig/NodeTraverser.php', + 'Twig_NodeVisitorInterface' => $vendorDir . '/twig/twig/lib/Twig/NodeVisitorInterface.php', + 'Twig_NodeVisitor_Escaper' => $vendorDir . '/twig/twig/lib/Twig/NodeVisitor/Escaper.php', + 'Twig_NodeVisitor_Optimizer' => $vendorDir . '/twig/twig/lib/Twig/NodeVisitor/Optimizer.php', + 'Twig_NodeVisitor_SafeAnalysis' => $vendorDir . '/twig/twig/lib/Twig/NodeVisitor/SafeAnalysis.php', + 'Twig_NodeVisitor_Sandbox' => $vendorDir . '/twig/twig/lib/Twig/NodeVisitor/Sandbox.php', + 'Twig_Node_AutoEscape' => $vendorDir . '/twig/twig/lib/Twig/Node/AutoEscape.php', + 'Twig_Node_Block' => $vendorDir . '/twig/twig/lib/Twig/Node/Block.php', + 'Twig_Node_BlockReference' => $vendorDir . '/twig/twig/lib/Twig/Node/BlockReference.php', + 'Twig_Node_Body' => $vendorDir . '/twig/twig/lib/Twig/Node/Body.php', + 'Twig_Node_CheckSecurity' => $vendorDir . '/twig/twig/lib/Twig/Node/CheckSecurity.php', + 'Twig_Node_Deprecated' => $vendorDir . '/twig/twig/lib/Twig/Node/Deprecated.php', + 'Twig_Node_Do' => $vendorDir . '/twig/twig/lib/Twig/Node/Do.php', + 'Twig_Node_Embed' => $vendorDir . '/twig/twig/lib/Twig/Node/Embed.php', + 'Twig_Node_Expression' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression.php', + 'Twig_Node_Expression_Array' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Array.php', + 'Twig_Node_Expression_AssignName' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/AssignName.php', + 'Twig_Node_Expression_Binary' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary.php', + 'Twig_Node_Expression_Binary_Add' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Add.php', + 'Twig_Node_Expression_Binary_And' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/And.php', + 'Twig_Node_Expression_Binary_BitwiseAnd' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseAnd.php', + 'Twig_Node_Expression_Binary_BitwiseOr' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseOr.php', + 'Twig_Node_Expression_Binary_BitwiseXor' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseXor.php', + 'Twig_Node_Expression_Binary_Concat' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Concat.php', + 'Twig_Node_Expression_Binary_Div' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Div.php', + 'Twig_Node_Expression_Binary_EndsWith' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/EndsWith.php', + 'Twig_Node_Expression_Binary_Equal' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Equal.php', + 'Twig_Node_Expression_Binary_FloorDiv' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/FloorDiv.php', + 'Twig_Node_Expression_Binary_Greater' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Greater.php', + 'Twig_Node_Expression_Binary_GreaterEqual' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/GreaterEqual.php', + 'Twig_Node_Expression_Binary_In' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/In.php', + 'Twig_Node_Expression_Binary_Less' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Less.php', + 'Twig_Node_Expression_Binary_LessEqual' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/LessEqual.php', + 'Twig_Node_Expression_Binary_Matches' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Matches.php', + 'Twig_Node_Expression_Binary_Mod' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Mod.php', + 'Twig_Node_Expression_Binary_Mul' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Mul.php', + 'Twig_Node_Expression_Binary_NotEqual' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/NotEqual.php', + 'Twig_Node_Expression_Binary_NotIn' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/NotIn.php', + 'Twig_Node_Expression_Binary_Or' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Or.php', + 'Twig_Node_Expression_Binary_Power' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Power.php', + 'Twig_Node_Expression_Binary_Range' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Range.php', + 'Twig_Node_Expression_Binary_StartsWith' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/StartsWith.php', + 'Twig_Node_Expression_Binary_Sub' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Sub.php', + 'Twig_Node_Expression_BlockReference' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/BlockReference.php', + 'Twig_Node_Expression_Call' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Call.php', + 'Twig_Node_Expression_Conditional' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Conditional.php', + 'Twig_Node_Expression_Constant' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Constant.php', + 'Twig_Node_Expression_ExtensionReference' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/ExtensionReference.php', + 'Twig_Node_Expression_Filter' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Filter.php', + 'Twig_Node_Expression_Filter_Default' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Filter/Default.php', + 'Twig_Node_Expression_Function' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Function.php', + 'Twig_Node_Expression_GetAttr' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/GetAttr.php', + 'Twig_Node_Expression_MethodCall' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/MethodCall.php', + 'Twig_Node_Expression_Name' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Name.php', + 'Twig_Node_Expression_NullCoalesce' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/NullCoalesce.php', + 'Twig_Node_Expression_Parent' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Parent.php', + 'Twig_Node_Expression_TempName' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/TempName.php', + 'Twig_Node_Expression_Test' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test.php', + 'Twig_Node_Expression_Test_Constant' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test/Constant.php', + 'Twig_Node_Expression_Test_Defined' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test/Defined.php', + 'Twig_Node_Expression_Test_Divisibleby' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test/Divisibleby.php', + 'Twig_Node_Expression_Test_Even' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test/Even.php', + 'Twig_Node_Expression_Test_Null' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test/Null.php', + 'Twig_Node_Expression_Test_Odd' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test/Odd.php', + 'Twig_Node_Expression_Test_Sameas' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test/Sameas.php', + 'Twig_Node_Expression_Unary' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Unary.php', + 'Twig_Node_Expression_Unary_Neg' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Unary/Neg.php', + 'Twig_Node_Expression_Unary_Not' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Unary/Not.php', + 'Twig_Node_Expression_Unary_Pos' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Unary/Pos.php', + 'Twig_Node_Flush' => $vendorDir . '/twig/twig/lib/Twig/Node/Flush.php', + 'Twig_Node_For' => $vendorDir . '/twig/twig/lib/Twig/Node/For.php', + 'Twig_Node_ForLoop' => $vendorDir . '/twig/twig/lib/Twig/Node/ForLoop.php', + 'Twig_Node_If' => $vendorDir . '/twig/twig/lib/Twig/Node/If.php', + 'Twig_Node_Import' => $vendorDir . '/twig/twig/lib/Twig/Node/Import.php', + 'Twig_Node_Include' => $vendorDir . '/twig/twig/lib/Twig/Node/Include.php', + 'Twig_Node_Macro' => $vendorDir . '/twig/twig/lib/Twig/Node/Macro.php', + 'Twig_Node_Module' => $vendorDir . '/twig/twig/lib/Twig/Node/Module.php', + 'Twig_Node_Print' => $vendorDir . '/twig/twig/lib/Twig/Node/Print.php', + 'Twig_Node_Sandbox' => $vendorDir . '/twig/twig/lib/Twig/Node/Sandbox.php', + 'Twig_Node_SandboxedPrint' => $vendorDir . '/twig/twig/lib/Twig/Node/SandboxedPrint.php', + 'Twig_Node_Set' => $vendorDir . '/twig/twig/lib/Twig/Node/Set.php', + 'Twig_Node_SetTemp' => $vendorDir . '/twig/twig/lib/Twig/Node/SetTemp.php', + 'Twig_Node_Spaceless' => $vendorDir . '/twig/twig/lib/Twig/Node/Spaceless.php', + 'Twig_Node_Text' => $vendorDir . '/twig/twig/lib/Twig/Node/Text.php', + 'Twig_Node_With' => $vendorDir . '/twig/twig/lib/Twig/Node/With.php', + 'Twig_Parser' => $vendorDir . '/twig/twig/lib/Twig/Parser.php', + 'Twig_ParserInterface' => $vendorDir . '/twig/twig/lib/Twig/ParserInterface.php', + 'Twig_Profiler_Dumper_Base' => $vendorDir . '/twig/twig/lib/Twig/Profiler/Dumper/Base.php', + 'Twig_Profiler_Dumper_Blackfire' => $vendorDir . '/twig/twig/lib/Twig/Profiler/Dumper/Blackfire.php', + 'Twig_Profiler_Dumper_Html' => $vendorDir . '/twig/twig/lib/Twig/Profiler/Dumper/Html.php', + 'Twig_Profiler_Dumper_Text' => $vendorDir . '/twig/twig/lib/Twig/Profiler/Dumper/Text.php', + 'Twig_Profiler_NodeVisitor_Profiler' => $vendorDir . '/twig/twig/lib/Twig/Profiler/NodeVisitor/Profiler.php', + 'Twig_Profiler_Node_EnterProfile' => $vendorDir . '/twig/twig/lib/Twig/Profiler/Node/EnterProfile.php', + 'Twig_Profiler_Node_LeaveProfile' => $vendorDir . '/twig/twig/lib/Twig/Profiler/Node/LeaveProfile.php', + 'Twig_Profiler_Profile' => $vendorDir . '/twig/twig/lib/Twig/Profiler/Profile.php', + 'Twig_RuntimeLoaderInterface' => $vendorDir . '/twig/twig/lib/Twig/RuntimeLoaderInterface.php', + 'Twig_Sandbox_SecurityError' => $vendorDir . '/twig/twig/lib/Twig/Sandbox/SecurityError.php', + 'Twig_Sandbox_SecurityNotAllowedFilterError' => $vendorDir . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFilterError.php', + 'Twig_Sandbox_SecurityNotAllowedFunctionError' => $vendorDir . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFunctionError.php', + 'Twig_Sandbox_SecurityNotAllowedMethodError' => $vendorDir . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedMethodError.php', + 'Twig_Sandbox_SecurityNotAllowedPropertyError' => $vendorDir . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedPropertyError.php', + 'Twig_Sandbox_SecurityNotAllowedTagError' => $vendorDir . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedTagError.php', + 'Twig_Sandbox_SecurityPolicy' => $vendorDir . '/twig/twig/lib/Twig/Sandbox/SecurityPolicy.php', + 'Twig_Sandbox_SecurityPolicyInterface' => $vendorDir . '/twig/twig/lib/Twig/Sandbox/SecurityPolicyInterface.php', + 'Twig_SimpleFilter' => $vendorDir . '/twig/twig/lib/Twig/SimpleFilter.php', + 'Twig_SimpleFunction' => $vendorDir . '/twig/twig/lib/Twig/SimpleFunction.php', + 'Twig_SimpleTest' => $vendorDir . '/twig/twig/lib/Twig/SimpleTest.php', + 'Twig_Source' => $vendorDir . '/twig/twig/lib/Twig/Source.php', + 'Twig_SourceContextLoaderInterface' => $vendorDir . '/twig/twig/lib/Twig/SourceContextLoaderInterface.php', + 'Twig_Template' => $vendorDir . '/twig/twig/lib/Twig/Template.php', + 'Twig_TemplateInterface' => $vendorDir . '/twig/twig/lib/Twig/TemplateInterface.php', + 'Twig_TemplateWrapper' => $vendorDir . '/twig/twig/lib/Twig/TemplateWrapper.php', + 'Twig_Test' => $vendorDir . '/twig/twig/lib/Twig/Test.php', + 'Twig_TestCallableInterface' => $vendorDir . '/twig/twig/lib/Twig/TestCallableInterface.php', + 'Twig_TestInterface' => $vendorDir . '/twig/twig/lib/Twig/TestInterface.php', + 'Twig_Test_Function' => $vendorDir . '/twig/twig/lib/Twig/Test/Function.php', + 'Twig_Test_IntegrationTestCase' => $vendorDir . '/twig/twig/lib/Twig/Test/IntegrationTestCase.php', + 'Twig_Test_Method' => $vendorDir . '/twig/twig/lib/Twig/Test/Method.php', + 'Twig_Test_Node' => $vendorDir . '/twig/twig/lib/Twig/Test/Node.php', + 'Twig_Test_NodeTestCase' => $vendorDir . '/twig/twig/lib/Twig/Test/NodeTestCase.php', + 'Twig_Token' => $vendorDir . '/twig/twig/lib/Twig/Token.php', + 'Twig_TokenParser' => $vendorDir . '/twig/twig/lib/Twig/TokenParser.php', + 'Twig_TokenParserBroker' => $vendorDir . '/twig/twig/lib/Twig/TokenParserBroker.php', + 'Twig_TokenParserBrokerInterface' => $vendorDir . '/twig/twig/lib/Twig/TokenParserBrokerInterface.php', + 'Twig_TokenParserInterface' => $vendorDir . '/twig/twig/lib/Twig/TokenParserInterface.php', + 'Twig_TokenParser_AutoEscape' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/AutoEscape.php', + 'Twig_TokenParser_Block' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Block.php', + 'Twig_TokenParser_Deprecated' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Deprecated.php', + 'Twig_TokenParser_Do' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Do.php', + 'Twig_TokenParser_Embed' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Embed.php', + 'Twig_TokenParser_Extends' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Extends.php', + 'Twig_TokenParser_Filter' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Filter.php', + 'Twig_TokenParser_Flush' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Flush.php', + 'Twig_TokenParser_For' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/For.php', + 'Twig_TokenParser_From' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/From.php', + 'Twig_TokenParser_If' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/If.php', + 'Twig_TokenParser_Import' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Import.php', + 'Twig_TokenParser_Include' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Include.php', + 'Twig_TokenParser_Macro' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Macro.php', + 'Twig_TokenParser_Sandbox' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Sandbox.php', + 'Twig_TokenParser_Set' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Set.php', + 'Twig_TokenParser_Spaceless' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Spaceless.php', + 'Twig_TokenParser_Use' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Use.php', + 'Twig_TokenParser_With' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/With.php', + 'Twig_TokenStream' => $vendorDir . '/twig/twig/lib/Twig/TokenStream.php', + 'Twig_Util_DeprecationCollector' => $vendorDir . '/twig/twig/lib/Twig/Util/DeprecationCollector.php', + 'Twig_Util_TemplateDirIterator' => $vendorDir . '/twig/twig/lib/Twig/Util/TemplateDirIterator.php', + 'Webmozart\\Assert\\Assert' => $vendorDir . '/webmozart/assert/src/Assert.php', + 'Webmozart\\Assert\\Mixin' => $vendorDir . '/webmozart/assert/src/Mixin.php', 'XMPPHP\\BOSH' => $vendorDir . '/diogocomposer/xmpphp/XMPPHP/BOSH.php', 'XMPPHP\\Exception' => $vendorDir . '/diogocomposer/xmpphp/XMPPHP/Exception.php', 'XMPPHP\\Log' => $vendorDir . '/diogocomposer/xmpphp/XMPPHP/Log.php', @@ -1018,7 +3247,1442 @@ return array( 'XMPPHP\\XMLObj' => $vendorDir . '/diogocomposer/xmpphp/XMPPHP/XMLObj.php', 'XMPPHP\\XMLStream' => $vendorDir . '/diogocomposer/xmpphp/XMPPHP/XMLStream.php', 'XMPPHP\\XMPP' => $vendorDir . '/diogocomposer/xmpphp/XMPPHP/XMPP.php', + 'XdgBaseDir\\Xdg' => $vendorDir . '/dnoegel/php-xdg-base-dir/src/Xdg.php', + 'Zend\\Cache\\ConfigProvider' => $vendorDir . '/zendframework/zend-cache/src/ConfigProvider.php', + 'Zend\\Cache\\Exception\\BadMethodCallException' => $vendorDir . '/zendframework/zend-cache/src/Exception/BadMethodCallException.php', + 'Zend\\Cache\\Exception\\ExceptionInterface' => $vendorDir . '/zendframework/zend-cache/src/Exception/ExceptionInterface.php', + 'Zend\\Cache\\Exception\\ExtensionNotLoadedException' => $vendorDir . '/zendframework/zend-cache/src/Exception/ExtensionNotLoadedException.php', + 'Zend\\Cache\\Exception\\InvalidArgumentException' => $vendorDir . '/zendframework/zend-cache/src/Exception/InvalidArgumentException.php', + 'Zend\\Cache\\Exception\\LogicException' => $vendorDir . '/zendframework/zend-cache/src/Exception/LogicException.php', + 'Zend\\Cache\\Exception\\MissingDependencyException' => $vendorDir . '/zendframework/zend-cache/src/Exception/MissingDependencyException.php', + 'Zend\\Cache\\Exception\\MissingKeyException' => $vendorDir . '/zendframework/zend-cache/src/Exception/MissingKeyException.php', + 'Zend\\Cache\\Exception\\OutOfSpaceException' => $vendorDir . '/zendframework/zend-cache/src/Exception/OutOfSpaceException.php', + 'Zend\\Cache\\Exception\\RuntimeException' => $vendorDir . '/zendframework/zend-cache/src/Exception/RuntimeException.php', + 'Zend\\Cache\\Exception\\UnexpectedValueException' => $vendorDir . '/zendframework/zend-cache/src/Exception/UnexpectedValueException.php', + 'Zend\\Cache\\Exception\\UnsupportedMethodCallException' => $vendorDir . '/zendframework/zend-cache/src/Exception/UnsupportedMethodCallException.php', + 'Zend\\Cache\\Module' => $vendorDir . '/zendframework/zend-cache/src/Module.php', + 'Zend\\Cache\\PatternFactory' => $vendorDir . '/zendframework/zend-cache/src/PatternFactory.php', + 'Zend\\Cache\\PatternPluginManager\\PatternPluginManagerTrait' => $vendorDir . '/zendframework/zend-cache/src/PatternPluginManager/PatternPluginManagerTrait.php', + 'Zend\\Cache\\PatternPluginManager\\PatternPluginManagerV2Polyfill' => $vendorDir . '/zendframework/zend-cache/src/PatternPluginManager/PatternPluginManagerV2Polyfill.php', + 'Zend\\Cache\\PatternPluginManager\\PatternPluginManagerV3Polyfill' => $vendorDir . '/zendframework/zend-cache/src/PatternPluginManager/PatternPluginManagerV3Polyfill.php', + 'Zend\\Cache\\Pattern\\AbstractPattern' => $vendorDir . '/zendframework/zend-cache/src/Pattern/AbstractPattern.php', + 'Zend\\Cache\\Pattern\\CallbackCache' => $vendorDir . '/zendframework/zend-cache/src/Pattern/CallbackCache.php', + 'Zend\\Cache\\Pattern\\CaptureCache' => $vendorDir . '/zendframework/zend-cache/src/Pattern/CaptureCache.php', + 'Zend\\Cache\\Pattern\\ClassCache' => $vendorDir . '/zendframework/zend-cache/src/Pattern/ClassCache.php', + 'Zend\\Cache\\Pattern\\ObjectCache' => $vendorDir . '/zendframework/zend-cache/src/Pattern/ObjectCache.php', + 'Zend\\Cache\\Pattern\\OutputCache' => $vendorDir . '/zendframework/zend-cache/src/Pattern/OutputCache.php', + 'Zend\\Cache\\Pattern\\PatternInterface' => $vendorDir . '/zendframework/zend-cache/src/Pattern/PatternInterface.php', + 'Zend\\Cache\\Pattern\\PatternOptions' => $vendorDir . '/zendframework/zend-cache/src/Pattern/PatternOptions.php', + 'Zend\\Cache\\Psr\\CacheItemPool\\CacheException' => $vendorDir . '/zendframework/zend-cache/src/Psr/CacheItemPool/CacheException.php', + 'Zend\\Cache\\Psr\\CacheItemPool\\CacheItem' => $vendorDir . '/zendframework/zend-cache/src/Psr/CacheItemPool/CacheItem.php', + 'Zend\\Cache\\Psr\\CacheItemPool\\CacheItemPoolDecorator' => $vendorDir . '/zendframework/zend-cache/src/Psr/CacheItemPool/CacheItemPoolDecorator.php', + 'Zend\\Cache\\Psr\\CacheItemPool\\InvalidArgumentException' => $vendorDir . '/zendframework/zend-cache/src/Psr/CacheItemPool/InvalidArgumentException.php', + 'Zend\\Cache\\Psr\\SerializationTrait' => $vendorDir . '/zendframework/zend-cache/src/Psr/SerializationTrait.php', + 'Zend\\Cache\\Psr\\SimpleCache\\SimpleCacheDecorator' => $vendorDir . '/zendframework/zend-cache/src/Psr/SimpleCache/SimpleCacheDecorator.php', + 'Zend\\Cache\\Psr\\SimpleCache\\SimpleCacheException' => $vendorDir . '/zendframework/zend-cache/src/Psr/SimpleCache/SimpleCacheException.php', + 'Zend\\Cache\\Psr\\SimpleCache\\SimpleCacheInvalidArgumentException' => $vendorDir . '/zendframework/zend-cache/src/Psr/SimpleCache/SimpleCacheInvalidArgumentException.php', + 'Zend\\Cache\\Service\\PatternPluginManagerFactory' => $vendorDir . '/zendframework/zend-cache/src/Service/PatternPluginManagerFactory.php', + 'Zend\\Cache\\Service\\PluginManagerLookupTrait' => $vendorDir . '/zendframework/zend-cache/src/Service/PluginManagerLookupTrait.php', + 'Zend\\Cache\\Service\\StorageAdapterPluginManagerFactory' => $vendorDir . '/zendframework/zend-cache/src/Service/StorageAdapterPluginManagerFactory.php', + 'Zend\\Cache\\Service\\StorageCacheAbstractServiceFactory' => $vendorDir . '/zendframework/zend-cache/src/Service/StorageCacheAbstractServiceFactory.php', + 'Zend\\Cache\\Service\\StorageCacheFactory' => $vendorDir . '/zendframework/zend-cache/src/Service/StorageCacheFactory.php', + 'Zend\\Cache\\Service\\StoragePluginManagerFactory' => $vendorDir . '/zendframework/zend-cache/src/Service/StoragePluginManagerFactory.php', + 'Zend\\Cache\\StorageFactory' => $vendorDir . '/zendframework/zend-cache/src/StorageFactory.php', + 'Zend\\Cache\\Storage\\AdapterPluginManager' => $vendorDir . '/zendframework/zend-cache/src/Storage/AdapterPluginManager.php', + 'Zend\\Cache\\Storage\\Adapter\\AbstractAdapter' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/AbstractAdapter.php', + 'Zend\\Cache\\Storage\\Adapter\\AbstractZendServer' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/AbstractZendServer.php', + 'Zend\\Cache\\Storage\\Adapter\\AdapterOptions' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/AdapterOptions.php', + 'Zend\\Cache\\Storage\\Adapter\\Apc' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/Apc.php', + 'Zend\\Cache\\Storage\\Adapter\\ApcIterator' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/ApcIterator.php', + 'Zend\\Cache\\Storage\\Adapter\\ApcOptions' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/ApcOptions.php', + 'Zend\\Cache\\Storage\\Adapter\\Apcu' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/Apcu.php', + 'Zend\\Cache\\Storage\\Adapter\\ApcuIterator' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/ApcuIterator.php', + 'Zend\\Cache\\Storage\\Adapter\\ApcuOptions' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/ApcuOptions.php', + 'Zend\\Cache\\Storage\\Adapter\\BlackHole' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/BlackHole.php', + 'Zend\\Cache\\Storage\\Adapter\\Dba' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/Dba.php', + 'Zend\\Cache\\Storage\\Adapter\\DbaIterator' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/DbaIterator.php', + 'Zend\\Cache\\Storage\\Adapter\\DbaOptions' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/DbaOptions.php', + 'Zend\\Cache\\Storage\\Adapter\\ExtMongoDb' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/ExtMongoDb.php', + 'Zend\\Cache\\Storage\\Adapter\\ExtMongoDbOptions' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/ExtMongoDbOptions.php', + 'Zend\\Cache\\Storage\\Adapter\\ExtMongoDbResourceManager' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/ExtMongoDbResourceManager.php', + 'Zend\\Cache\\Storage\\Adapter\\Filesystem' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/Filesystem.php', + 'Zend\\Cache\\Storage\\Adapter\\FilesystemIterator' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/FilesystemIterator.php', + 'Zend\\Cache\\Storage\\Adapter\\FilesystemOptions' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/FilesystemOptions.php', + 'Zend\\Cache\\Storage\\Adapter\\KeyListIterator' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/KeyListIterator.php', + 'Zend\\Cache\\Storage\\Adapter\\Memcache' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/Memcache.php', + 'Zend\\Cache\\Storage\\Adapter\\MemcacheOptions' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/MemcacheOptions.php', + 'Zend\\Cache\\Storage\\Adapter\\MemcacheResourceManager' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/MemcacheResourceManager.php', + 'Zend\\Cache\\Storage\\Adapter\\Memcached' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/Memcached.php', + 'Zend\\Cache\\Storage\\Adapter\\MemcachedOptions' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/MemcachedOptions.php', + 'Zend\\Cache\\Storage\\Adapter\\MemcachedResourceManager' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/MemcachedResourceManager.php', + 'Zend\\Cache\\Storage\\Adapter\\Memory' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/Memory.php', + 'Zend\\Cache\\Storage\\Adapter\\MemoryOptions' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/MemoryOptions.php', + 'Zend\\Cache\\Storage\\Adapter\\MongoDb' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/MongoDb.php', + 'Zend\\Cache\\Storage\\Adapter\\MongoDbOptions' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/MongoDbOptions.php', + 'Zend\\Cache\\Storage\\Adapter\\MongoDbResourceManager' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/MongoDbResourceManager.php', + 'Zend\\Cache\\Storage\\Adapter\\Redis' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/Redis.php', + 'Zend\\Cache\\Storage\\Adapter\\RedisOptions' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/RedisOptions.php', + 'Zend\\Cache\\Storage\\Adapter\\RedisResourceManager' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/RedisResourceManager.php', + 'Zend\\Cache\\Storage\\Adapter\\Session' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/Session.php', + 'Zend\\Cache\\Storage\\Adapter\\SessionOptions' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/SessionOptions.php', + 'Zend\\Cache\\Storage\\Adapter\\WinCache' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/WinCache.php', + 'Zend\\Cache\\Storage\\Adapter\\WinCacheOptions' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/WinCacheOptions.php', + 'Zend\\Cache\\Storage\\Adapter\\XCache' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/XCache.php', + 'Zend\\Cache\\Storage\\Adapter\\XCacheOptions' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/XCacheOptions.php', + 'Zend\\Cache\\Storage\\Adapter\\ZendServerDisk' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/ZendServerDisk.php', + 'Zend\\Cache\\Storage\\Adapter\\ZendServerShm' => $vendorDir . '/zendframework/zend-cache/src/Storage/Adapter/ZendServerShm.php', + 'Zend\\Cache\\Storage\\AvailableSpaceCapableInterface' => $vendorDir . '/zendframework/zend-cache/src/Storage/AvailableSpaceCapableInterface.php', + 'Zend\\Cache\\Storage\\Capabilities' => $vendorDir . '/zendframework/zend-cache/src/Storage/Capabilities.php', + 'Zend\\Cache\\Storage\\ClearByNamespaceInterface' => $vendorDir . '/zendframework/zend-cache/src/Storage/ClearByNamespaceInterface.php', + 'Zend\\Cache\\Storage\\ClearByPrefixInterface' => $vendorDir . '/zendframework/zend-cache/src/Storage/ClearByPrefixInterface.php', + 'Zend\\Cache\\Storage\\ClearExpiredInterface' => $vendorDir . '/zendframework/zend-cache/src/Storage/ClearExpiredInterface.php', + 'Zend\\Cache\\Storage\\Event' => $vendorDir . '/zendframework/zend-cache/src/Storage/Event.php', + 'Zend\\Cache\\Storage\\ExceptionEvent' => $vendorDir . '/zendframework/zend-cache/src/Storage/ExceptionEvent.php', + 'Zend\\Cache\\Storage\\FlushableInterface' => $vendorDir . '/zendframework/zend-cache/src/Storage/FlushableInterface.php', + 'Zend\\Cache\\Storage\\IterableInterface' => $vendorDir . '/zendframework/zend-cache/src/Storage/IterableInterface.php', + 'Zend\\Cache\\Storage\\IteratorInterface' => $vendorDir . '/zendframework/zend-cache/src/Storage/IteratorInterface.php', + 'Zend\\Cache\\Storage\\OptimizableInterface' => $vendorDir . '/zendframework/zend-cache/src/Storage/OptimizableInterface.php', + 'Zend\\Cache\\Storage\\PluginManager' => $vendorDir . '/zendframework/zend-cache/src/Storage/PluginManager.php', + 'Zend\\Cache\\Storage\\Plugin\\AbstractPlugin' => $vendorDir . '/zendframework/zend-cache/src/Storage/Plugin/AbstractPlugin.php', + 'Zend\\Cache\\Storage\\Plugin\\ClearExpiredByFactor' => $vendorDir . '/zendframework/zend-cache/src/Storage/Plugin/ClearExpiredByFactor.php', + 'Zend\\Cache\\Storage\\Plugin\\ExceptionHandler' => $vendorDir . '/zendframework/zend-cache/src/Storage/Plugin/ExceptionHandler.php', + 'Zend\\Cache\\Storage\\Plugin\\IgnoreUserAbort' => $vendorDir . '/zendframework/zend-cache/src/Storage/Plugin/IgnoreUserAbort.php', + 'Zend\\Cache\\Storage\\Plugin\\OptimizeByFactor' => $vendorDir . '/zendframework/zend-cache/src/Storage/Plugin/OptimizeByFactor.php', + 'Zend\\Cache\\Storage\\Plugin\\PluginInterface' => $vendorDir . '/zendframework/zend-cache/src/Storage/Plugin/PluginInterface.php', + 'Zend\\Cache\\Storage\\Plugin\\PluginOptions' => $vendorDir . '/zendframework/zend-cache/src/Storage/Plugin/PluginOptions.php', + 'Zend\\Cache\\Storage\\Plugin\\Serializer' => $vendorDir . '/zendframework/zend-cache/src/Storage/Plugin/Serializer.php', + 'Zend\\Cache\\Storage\\PostEvent' => $vendorDir . '/zendframework/zend-cache/src/Storage/PostEvent.php', + 'Zend\\Cache\\Storage\\StorageInterface' => $vendorDir . '/zendframework/zend-cache/src/Storage/StorageInterface.php', + 'Zend\\Cache\\Storage\\TaggableInterface' => $vendorDir . '/zendframework/zend-cache/src/Storage/TaggableInterface.php', + 'Zend\\Cache\\Storage\\TotalSpaceCapableInterface' => $vendorDir . '/zendframework/zend-cache/src/Storage/TotalSpaceCapableInterface.php', + 'Zend\\Config\\AbstractConfigFactory' => $vendorDir . '/zendframework/zend-config/src/AbstractConfigFactory.php', + 'Zend\\Config\\Config' => $vendorDir . '/zendframework/zend-config/src/Config.php', + 'Zend\\Config\\Exception\\ExceptionInterface' => $vendorDir . '/zendframework/zend-config/src/Exception/ExceptionInterface.php', + 'Zend\\Config\\Exception\\InvalidArgumentException' => $vendorDir . '/zendframework/zend-config/src/Exception/InvalidArgumentException.php', + 'Zend\\Config\\Exception\\RuntimeException' => $vendorDir . '/zendframework/zend-config/src/Exception/RuntimeException.php', + 'Zend\\Config\\Factory' => $vendorDir . '/zendframework/zend-config/src/Factory.php', + 'Zend\\Config\\Processor\\Constant' => $vendorDir . '/zendframework/zend-config/src/Processor/Constant.php', + 'Zend\\Config\\Processor\\Filter' => $vendorDir . '/zendframework/zend-config/src/Processor/Filter.php', + 'Zend\\Config\\Processor\\ProcessorInterface' => $vendorDir . '/zendframework/zend-config/src/Processor/ProcessorInterface.php', + 'Zend\\Config\\Processor\\Queue' => $vendorDir . '/zendframework/zend-config/src/Processor/Queue.php', + 'Zend\\Config\\Processor\\Token' => $vendorDir . '/zendframework/zend-config/src/Processor/Token.php', + 'Zend\\Config\\Processor\\Translator' => $vendorDir . '/zendframework/zend-config/src/Processor/Translator.php', + 'Zend\\Config\\ReaderPluginManager' => $vendorDir . '/zendframework/zend-config/src/ReaderPluginManager.php', + 'Zend\\Config\\Reader\\Ini' => $vendorDir . '/zendframework/zend-config/src/Reader/Ini.php', + 'Zend\\Config\\Reader\\JavaProperties' => $vendorDir . '/zendframework/zend-config/src/Reader/JavaProperties.php', + 'Zend\\Config\\Reader\\Json' => $vendorDir . '/zendframework/zend-config/src/Reader/Json.php', + 'Zend\\Config\\Reader\\ReaderInterface' => $vendorDir . '/zendframework/zend-config/src/Reader/ReaderInterface.php', + 'Zend\\Config\\Reader\\Xml' => $vendorDir . '/zendframework/zend-config/src/Reader/Xml.php', + 'Zend\\Config\\Reader\\Yaml' => $vendorDir . '/zendframework/zend-config/src/Reader/Yaml.php', + 'Zend\\Config\\WriterPluginManager' => $vendorDir . '/zendframework/zend-config/src/WriterPluginManager.php', + 'Zend\\Config\\Writer\\AbstractWriter' => $vendorDir . '/zendframework/zend-config/src/Writer/AbstractWriter.php', + 'Zend\\Config\\Writer\\Ini' => $vendorDir . '/zendframework/zend-config/src/Writer/Ini.php', + 'Zend\\Config\\Writer\\Json' => $vendorDir . '/zendframework/zend-config/src/Writer/Json.php', + 'Zend\\Config\\Writer\\PhpArray' => $vendorDir . '/zendframework/zend-config/src/Writer/PhpArray.php', + 'Zend\\Config\\Writer\\WriterInterface' => $vendorDir . '/zendframework/zend-config/src/Writer/WriterInterface.php', + 'Zend\\Config\\Writer\\Xml' => $vendorDir . '/zendframework/zend-config/src/Writer/Xml.php', + 'Zend\\Config\\Writer\\Yaml' => $vendorDir . '/zendframework/zend-config/src/Writer/Yaml.php', + 'Zend\\EventManager\\AbstractListenerAggregate' => $vendorDir . '/zendframework/zend-eventmanager/src/AbstractListenerAggregate.php', + 'Zend\\EventManager\\Event' => $vendorDir . '/zendframework/zend-eventmanager/src/Event.php', + 'Zend\\EventManager\\EventInterface' => $vendorDir . '/zendframework/zend-eventmanager/src/EventInterface.php', + 'Zend\\EventManager\\EventManager' => $vendorDir . '/zendframework/zend-eventmanager/src/EventManager.php', + 'Zend\\EventManager\\EventManagerAwareInterface' => $vendorDir . '/zendframework/zend-eventmanager/src/EventManagerAwareInterface.php', + 'Zend\\EventManager\\EventManagerAwareTrait' => $vendorDir . '/zendframework/zend-eventmanager/src/EventManagerAwareTrait.php', + 'Zend\\EventManager\\EventManagerInterface' => $vendorDir . '/zendframework/zend-eventmanager/src/EventManagerInterface.php', + 'Zend\\EventManager\\EventsCapableInterface' => $vendorDir . '/zendframework/zend-eventmanager/src/EventsCapableInterface.php', + 'Zend\\EventManager\\Exception\\DomainException' => $vendorDir . '/zendframework/zend-eventmanager/src/Exception/DomainException.php', + 'Zend\\EventManager\\Exception\\ExceptionInterface' => $vendorDir . '/zendframework/zend-eventmanager/src/Exception/ExceptionInterface.php', + 'Zend\\EventManager\\Exception\\InvalidArgumentException' => $vendorDir . '/zendframework/zend-eventmanager/src/Exception/InvalidArgumentException.php', + 'Zend\\EventManager\\Exception\\InvalidCallbackException' => $vendorDir . '/zendframework/zend-eventmanager/src/Exception/InvalidCallbackException.php', + 'Zend\\EventManager\\Exception\\RuntimeException' => $vendorDir . '/zendframework/zend-eventmanager/src/Exception/RuntimeException.php', + 'Zend\\EventManager\\FilterChain' => $vendorDir . '/zendframework/zend-eventmanager/src/FilterChain.php', + 'Zend\\EventManager\\Filter\\FilterInterface' => $vendorDir . '/zendframework/zend-eventmanager/src/Filter/FilterInterface.php', + 'Zend\\EventManager\\Filter\\FilterIterator' => $vendorDir . '/zendframework/zend-eventmanager/src/Filter/FilterIterator.php', + 'Zend\\EventManager\\LazyEventListener' => $vendorDir . '/zendframework/zend-eventmanager/src/LazyEventListener.php', + 'Zend\\EventManager\\LazyListener' => $vendorDir . '/zendframework/zend-eventmanager/src/LazyListener.php', + 'Zend\\EventManager\\LazyListenerAggregate' => $vendorDir . '/zendframework/zend-eventmanager/src/LazyListenerAggregate.php', + 'Zend\\EventManager\\ListenerAggregateInterface' => $vendorDir . '/zendframework/zend-eventmanager/src/ListenerAggregateInterface.php', + 'Zend\\EventManager\\ListenerAggregateTrait' => $vendorDir . '/zendframework/zend-eventmanager/src/ListenerAggregateTrait.php', + 'Zend\\EventManager\\ResponseCollection' => $vendorDir . '/zendframework/zend-eventmanager/src/ResponseCollection.php', + 'Zend\\EventManager\\SharedEventManager' => $vendorDir . '/zendframework/zend-eventmanager/src/SharedEventManager.php', + 'Zend\\EventManager\\SharedEventManagerInterface' => $vendorDir . '/zendframework/zend-eventmanager/src/SharedEventManagerInterface.php', + 'Zend\\EventManager\\SharedEventsCapableInterface' => $vendorDir . '/zendframework/zend-eventmanager/src/SharedEventsCapableInterface.php', + 'Zend\\EventManager\\Test\\EventListenerIntrospectionTrait' => $vendorDir . '/zendframework/zend-eventmanager/src/Test/EventListenerIntrospectionTrait.php', + 'Zend\\Filter\\AbstractDateDropdown' => $vendorDir . '/zendframework/zend-filter/src/AbstractDateDropdown.php', + 'Zend\\Filter\\AbstractFilter' => $vendorDir . '/zendframework/zend-filter/src/AbstractFilter.php', + 'Zend\\Filter\\AbstractUnicode' => $vendorDir . '/zendframework/zend-filter/src/AbstractUnicode.php', + 'Zend\\Filter\\BaseName' => $vendorDir . '/zendframework/zend-filter/src/BaseName.php', + 'Zend\\Filter\\Blacklist' => $vendorDir . '/zendframework/zend-filter/src/Blacklist.php', + 'Zend\\Filter\\Boolean' => $vendorDir . '/zendframework/zend-filter/src/Boolean.php', + 'Zend\\Filter\\Callback' => $vendorDir . '/zendframework/zend-filter/src/Callback.php', + 'Zend\\Filter\\Compress' => $vendorDir . '/zendframework/zend-filter/src/Compress.php', + 'Zend\\Filter\\Compress\\AbstractCompressionAlgorithm' => $vendorDir . '/zendframework/zend-filter/src/Compress/AbstractCompressionAlgorithm.php', + 'Zend\\Filter\\Compress\\Bz2' => $vendorDir . '/zendframework/zend-filter/src/Compress/Bz2.php', + 'Zend\\Filter\\Compress\\CompressionAlgorithmInterface' => $vendorDir . '/zendframework/zend-filter/src/Compress/CompressionAlgorithmInterface.php', + 'Zend\\Filter\\Compress\\Gz' => $vendorDir . '/zendframework/zend-filter/src/Compress/Gz.php', + 'Zend\\Filter\\Compress\\Lzf' => $vendorDir . '/zendframework/zend-filter/src/Compress/Lzf.php', + 'Zend\\Filter\\Compress\\Rar' => $vendorDir . '/zendframework/zend-filter/src/Compress/Rar.php', + 'Zend\\Filter\\Compress\\Snappy' => $vendorDir . '/zendframework/zend-filter/src/Compress/Snappy.php', + 'Zend\\Filter\\Compress\\Tar' => $vendorDir . '/zendframework/zend-filter/src/Compress/Tar.php', + 'Zend\\Filter\\Compress\\Zip' => $vendorDir . '/zendframework/zend-filter/src/Compress/Zip.php', + 'Zend\\Filter\\ConfigProvider' => $vendorDir . '/zendframework/zend-filter/src/ConfigProvider.php', + 'Zend\\Filter\\DataUnitFormatter' => $vendorDir . '/zendframework/zend-filter/src/DataUnitFormatter.php', + 'Zend\\Filter\\DateSelect' => $vendorDir . '/zendframework/zend-filter/src/DateSelect.php', + 'Zend\\Filter\\DateTimeFormatter' => $vendorDir . '/zendframework/zend-filter/src/DateTimeFormatter.php', + 'Zend\\Filter\\DateTimeSelect' => $vendorDir . '/zendframework/zend-filter/src/DateTimeSelect.php', + 'Zend\\Filter\\Decompress' => $vendorDir . '/zendframework/zend-filter/src/Decompress.php', + 'Zend\\Filter\\Decrypt' => $vendorDir . '/zendframework/zend-filter/src/Decrypt.php', + 'Zend\\Filter\\Digits' => $vendorDir . '/zendframework/zend-filter/src/Digits.php', + 'Zend\\Filter\\Dir' => $vendorDir . '/zendframework/zend-filter/src/Dir.php', + 'Zend\\Filter\\Encrypt' => $vendorDir . '/zendframework/zend-filter/src/Encrypt.php', + 'Zend\\Filter\\Encrypt\\BlockCipher' => $vendorDir . '/zendframework/zend-filter/src/Encrypt/BlockCipher.php', + 'Zend\\Filter\\Encrypt\\EncryptionAlgorithmInterface' => $vendorDir . '/zendframework/zend-filter/src/Encrypt/EncryptionAlgorithmInterface.php', + 'Zend\\Filter\\Encrypt\\Openssl' => $vendorDir . '/zendframework/zend-filter/src/Encrypt/Openssl.php', + 'Zend\\Filter\\Exception\\BadMethodCallException' => $vendorDir . '/zendframework/zend-filter/src/Exception/BadMethodCallException.php', + 'Zend\\Filter\\Exception\\DomainException' => $vendorDir . '/zendframework/zend-filter/src/Exception/DomainException.php', + 'Zend\\Filter\\Exception\\ExceptionInterface' => $vendorDir . '/zendframework/zend-filter/src/Exception/ExceptionInterface.php', + 'Zend\\Filter\\Exception\\ExtensionNotLoadedException' => $vendorDir . '/zendframework/zend-filter/src/Exception/ExtensionNotLoadedException.php', + 'Zend\\Filter\\Exception\\InvalidArgumentException' => $vendorDir . '/zendframework/zend-filter/src/Exception/InvalidArgumentException.php', + 'Zend\\Filter\\Exception\\RuntimeException' => $vendorDir . '/zendframework/zend-filter/src/Exception/RuntimeException.php', + 'Zend\\Filter\\File\\Decrypt' => $vendorDir . '/zendframework/zend-filter/src/File/Decrypt.php', + 'Zend\\Filter\\File\\Encrypt' => $vendorDir . '/zendframework/zend-filter/src/File/Encrypt.php', + 'Zend\\Filter\\File\\LowerCase' => $vendorDir . '/zendframework/zend-filter/src/File/LowerCase.php', + 'Zend\\Filter\\File\\Rename' => $vendorDir . '/zendframework/zend-filter/src/File/Rename.php', + 'Zend\\Filter\\File\\RenameUpload' => $vendorDir . '/zendframework/zend-filter/src/File/RenameUpload.php', + 'Zend\\Filter\\File\\UpperCase' => $vendorDir . '/zendframework/zend-filter/src/File/UpperCase.php', + 'Zend\\Filter\\FilterChain' => $vendorDir . '/zendframework/zend-filter/src/FilterChain.php', + 'Zend\\Filter\\FilterInterface' => $vendorDir . '/zendframework/zend-filter/src/FilterInterface.php', + 'Zend\\Filter\\FilterPluginManager' => $vendorDir . '/zendframework/zend-filter/src/FilterPluginManager.php', + 'Zend\\Filter\\FilterPluginManagerFactory' => $vendorDir . '/zendframework/zend-filter/src/FilterPluginManagerFactory.php', + 'Zend\\Filter\\FilterProviderInterface' => $vendorDir . '/zendframework/zend-filter/src/FilterProviderInterface.php', + 'Zend\\Filter\\HtmlEntities' => $vendorDir . '/zendframework/zend-filter/src/HtmlEntities.php', + 'Zend\\Filter\\Inflector' => $vendorDir . '/zendframework/zend-filter/src/Inflector.php', + 'Zend\\Filter\\Int' => $vendorDir . '/zendframework/zend-filter/src/Int.php', + 'Zend\\Filter\\Module' => $vendorDir . '/zendframework/zend-filter/src/Module.php', + 'Zend\\Filter\\MonthSelect' => $vendorDir . '/zendframework/zend-filter/src/MonthSelect.php', + 'Zend\\Filter\\Null' => $vendorDir . '/zendframework/zend-filter/src/Null.php', + 'Zend\\Filter\\PregReplace' => $vendorDir . '/zendframework/zend-filter/src/PregReplace.php', + 'Zend\\Filter\\RealPath' => $vendorDir . '/zendframework/zend-filter/src/RealPath.php', + 'Zend\\Filter\\StaticFilter' => $vendorDir . '/zendframework/zend-filter/src/StaticFilter.php', + 'Zend\\Filter\\StringPrefix' => $vendorDir . '/zendframework/zend-filter/src/StringPrefix.php', + 'Zend\\Filter\\StringSuffix' => $vendorDir . '/zendframework/zend-filter/src/StringSuffix.php', + 'Zend\\Filter\\StringToLower' => $vendorDir . '/zendframework/zend-filter/src/StringToLower.php', + 'Zend\\Filter\\StringToUpper' => $vendorDir . '/zendframework/zend-filter/src/StringToUpper.php', + 'Zend\\Filter\\StringTrim' => $vendorDir . '/zendframework/zend-filter/src/StringTrim.php', + 'Zend\\Filter\\StripNewlines' => $vendorDir . '/zendframework/zend-filter/src/StripNewlines.php', + 'Zend\\Filter\\StripTags' => $vendorDir . '/zendframework/zend-filter/src/StripTags.php', + 'Zend\\Filter\\ToFloat' => $vendorDir . '/zendframework/zend-filter/src/ToFloat.php', + 'Zend\\Filter\\ToInt' => $vendorDir . '/zendframework/zend-filter/src/ToInt.php', + 'Zend\\Filter\\ToNull' => $vendorDir . '/zendframework/zend-filter/src/ToNull.php', + 'Zend\\Filter\\UpperCaseWords' => $vendorDir . '/zendframework/zend-filter/src/UpperCaseWords.php', + 'Zend\\Filter\\UriNormalize' => $vendorDir . '/zendframework/zend-filter/src/UriNormalize.php', + 'Zend\\Filter\\Whitelist' => $vendorDir . '/zendframework/zend-filter/src/Whitelist.php', + 'Zend\\Filter\\Word\\AbstractSeparator' => $vendorDir . '/zendframework/zend-filter/src/Word/AbstractSeparator.php', + 'Zend\\Filter\\Word\\CamelCaseToDash' => $vendorDir . '/zendframework/zend-filter/src/Word/CamelCaseToDash.php', + 'Zend\\Filter\\Word\\CamelCaseToSeparator' => $vendorDir . '/zendframework/zend-filter/src/Word/CamelCaseToSeparator.php', + 'Zend\\Filter\\Word\\CamelCaseToUnderscore' => $vendorDir . '/zendframework/zend-filter/src/Word/CamelCaseToUnderscore.php', + 'Zend\\Filter\\Word\\DashToCamelCase' => $vendorDir . '/zendframework/zend-filter/src/Word/DashToCamelCase.php', + 'Zend\\Filter\\Word\\DashToSeparator' => $vendorDir . '/zendframework/zend-filter/src/Word/DashToSeparator.php', + 'Zend\\Filter\\Word\\DashToUnderscore' => $vendorDir . '/zendframework/zend-filter/src/Word/DashToUnderscore.php', + 'Zend\\Filter\\Word\\SeparatorToCamelCase' => $vendorDir . '/zendframework/zend-filter/src/Word/SeparatorToCamelCase.php', + 'Zend\\Filter\\Word\\SeparatorToDash' => $vendorDir . '/zendframework/zend-filter/src/Word/SeparatorToDash.php', + 'Zend\\Filter\\Word\\SeparatorToSeparator' => $vendorDir . '/zendframework/zend-filter/src/Word/SeparatorToSeparator.php', + 'Zend\\Filter\\Word\\Service\\SeparatorToSeparatorFactory' => $vendorDir . '/zendframework/zend-filter/src/Word/Service/SeparatorToSeparatorFactory.php', + 'Zend\\Filter\\Word\\UnderscoreToCamelCase' => $vendorDir . '/zendframework/zend-filter/src/Word/UnderscoreToCamelCase.php', + 'Zend\\Filter\\Word\\UnderscoreToDash' => $vendorDir . '/zendframework/zend-filter/src/Word/UnderscoreToDash.php', + 'Zend\\Filter\\Word\\UnderscoreToSeparator' => $vendorDir . '/zendframework/zend-filter/src/Word/UnderscoreToSeparator.php', + 'Zend\\Filter\\Word\\UnderscoreToStudlyCase' => $vendorDir . '/zendframework/zend-filter/src/Word/UnderscoreToStudlyCase.php', + 'Zend\\Hydrator\\AbstractHydrator' => $vendorDir . '/zendframework/zend-hydrator/src/AbstractHydrator.php', + 'Zend\\Hydrator\\Aggregate\\AggregateHydrator' => $vendorDir . '/zendframework/zend-hydrator/src/Aggregate/AggregateHydrator.php', + 'Zend\\Hydrator\\Aggregate\\ExtractEvent' => $vendorDir . '/zendframework/zend-hydrator/src/Aggregate/ExtractEvent.php', + 'Zend\\Hydrator\\Aggregate\\HydrateEvent' => $vendorDir . '/zendframework/zend-hydrator/src/Aggregate/HydrateEvent.php', + 'Zend\\Hydrator\\Aggregate\\HydratorListener' => $vendorDir . '/zendframework/zend-hydrator/src/Aggregate/HydratorListener.php', + 'Zend\\Hydrator\\ArraySerializable' => $vendorDir . '/zendframework/zend-hydrator/src/ArraySerializable.php', + 'Zend\\Hydrator\\ClassMethods' => $vendorDir . '/zendframework/zend-hydrator/src/ClassMethods.php', + 'Zend\\Hydrator\\DelegatingHydrator' => $vendorDir . '/zendframework/zend-hydrator/src/DelegatingHydrator.php', + 'Zend\\Hydrator\\DelegatingHydratorFactory' => $vendorDir . '/zendframework/zend-hydrator/src/DelegatingHydratorFactory.php', + 'Zend\\Hydrator\\Exception\\BadMethodCallException' => $vendorDir . '/zendframework/zend-hydrator/src/Exception/BadMethodCallException.php', + 'Zend\\Hydrator\\Exception\\DomainException' => $vendorDir . '/zendframework/zend-hydrator/src/Exception/DomainException.php', + 'Zend\\Hydrator\\Exception\\ExceptionInterface' => $vendorDir . '/zendframework/zend-hydrator/src/Exception/ExceptionInterface.php', + 'Zend\\Hydrator\\Exception\\ExtensionNotLoadedException' => $vendorDir . '/zendframework/zend-hydrator/src/Exception/ExtensionNotLoadedException.php', + 'Zend\\Hydrator\\Exception\\InvalidArgumentException' => $vendorDir . '/zendframework/zend-hydrator/src/Exception/InvalidArgumentException.php', + 'Zend\\Hydrator\\Exception\\InvalidCallbackException' => $vendorDir . '/zendframework/zend-hydrator/src/Exception/InvalidCallbackException.php', + 'Zend\\Hydrator\\Exception\\LogicException' => $vendorDir . '/zendframework/zend-hydrator/src/Exception/LogicException.php', + 'Zend\\Hydrator\\Exception\\RuntimeException' => $vendorDir . '/zendframework/zend-hydrator/src/Exception/RuntimeException.php', + 'Zend\\Hydrator\\ExtractionInterface' => $vendorDir . '/zendframework/zend-hydrator/src/ExtractionInterface.php', + 'Zend\\Hydrator\\FilterEnabledInterface' => $vendorDir . '/zendframework/zend-hydrator/src/FilterEnabledInterface.php', + 'Zend\\Hydrator\\Filter\\FilterComposite' => $vendorDir . '/zendframework/zend-hydrator/src/Filter/FilterComposite.php', + 'Zend\\Hydrator\\Filter\\FilterInterface' => $vendorDir . '/zendframework/zend-hydrator/src/Filter/FilterInterface.php', + 'Zend\\Hydrator\\Filter\\FilterProviderInterface' => $vendorDir . '/zendframework/zend-hydrator/src/Filter/FilterProviderInterface.php', + 'Zend\\Hydrator\\Filter\\GetFilter' => $vendorDir . '/zendframework/zend-hydrator/src/Filter/GetFilter.php', + 'Zend\\Hydrator\\Filter\\HasFilter' => $vendorDir . '/zendframework/zend-hydrator/src/Filter/HasFilter.php', + 'Zend\\Hydrator\\Filter\\IsFilter' => $vendorDir . '/zendframework/zend-hydrator/src/Filter/IsFilter.php', + 'Zend\\Hydrator\\Filter\\MethodMatchFilter' => $vendorDir . '/zendframework/zend-hydrator/src/Filter/MethodMatchFilter.php', + 'Zend\\Hydrator\\Filter\\NumberOfParameterFilter' => $vendorDir . '/zendframework/zend-hydrator/src/Filter/NumberOfParameterFilter.php', + 'Zend\\Hydrator\\Filter\\OptionalParametersFilter' => $vendorDir . '/zendframework/zend-hydrator/src/Filter/OptionalParametersFilter.php', + 'Zend\\Hydrator\\HydrationInterface' => $vendorDir . '/zendframework/zend-hydrator/src/HydrationInterface.php', + 'Zend\\Hydrator\\HydratorAwareInterface' => $vendorDir . '/zendframework/zend-hydrator/src/HydratorAwareInterface.php', + 'Zend\\Hydrator\\HydratorAwareTrait' => $vendorDir . '/zendframework/zend-hydrator/src/HydratorAwareTrait.php', + 'Zend\\Hydrator\\HydratorInterface' => $vendorDir . '/zendframework/zend-hydrator/src/HydratorInterface.php', + 'Zend\\Hydrator\\HydratorOptionsInterface' => $vendorDir . '/zendframework/zend-hydrator/src/HydratorOptionsInterface.php', + 'Zend\\Hydrator\\HydratorPluginManager' => $vendorDir . '/zendframework/zend-hydrator/src/HydratorPluginManager.php', + 'Zend\\Hydrator\\Iterator\\HydratingArrayIterator' => $vendorDir . '/zendframework/zend-hydrator/src/Iterator/HydratingArrayIterator.php', + 'Zend\\Hydrator\\Iterator\\HydratingIteratorInterface' => $vendorDir . '/zendframework/zend-hydrator/src/Iterator/HydratingIteratorInterface.php', + 'Zend\\Hydrator\\Iterator\\HydratingIteratorIterator' => $vendorDir . '/zendframework/zend-hydrator/src/Iterator/HydratingIteratorIterator.php', + 'Zend\\Hydrator\\NamingStrategyEnabledInterface' => $vendorDir . '/zendframework/zend-hydrator/src/NamingStrategyEnabledInterface.php', + 'Zend\\Hydrator\\NamingStrategy\\ArrayMapNamingStrategy' => $vendorDir . '/zendframework/zend-hydrator/src/NamingStrategy/ArrayMapNamingStrategy.php', + 'Zend\\Hydrator\\NamingStrategy\\CompositeNamingStrategy' => $vendorDir . '/zendframework/zend-hydrator/src/NamingStrategy/CompositeNamingStrategy.php', + 'Zend\\Hydrator\\NamingStrategy\\IdentityNamingStrategy' => $vendorDir . '/zendframework/zend-hydrator/src/NamingStrategy/IdentityNamingStrategy.php', + 'Zend\\Hydrator\\NamingStrategy\\MapNamingStrategy' => $vendorDir . '/zendframework/zend-hydrator/src/NamingStrategy/MapNamingStrategy.php', + 'Zend\\Hydrator\\NamingStrategy\\NamingStrategyInterface' => $vendorDir . '/zendframework/zend-hydrator/src/NamingStrategy/NamingStrategyInterface.php', + 'Zend\\Hydrator\\NamingStrategy\\UnderscoreNamingStrategy' => $vendorDir . '/zendframework/zend-hydrator/src/NamingStrategy/UnderscoreNamingStrategy.php', + 'Zend\\Hydrator\\ObjectProperty' => $vendorDir . '/zendframework/zend-hydrator/src/ObjectProperty.php', + 'Zend\\Hydrator\\Reflection' => $vendorDir . '/zendframework/zend-hydrator/src/Reflection.php', + 'Zend\\Hydrator\\StrategyEnabledInterface' => $vendorDir . '/zendframework/zend-hydrator/src/StrategyEnabledInterface.php', + 'Zend\\Hydrator\\Strategy\\BooleanStrategy' => $vendorDir . '/zendframework/zend-hydrator/src/Strategy/BooleanStrategy.php', + 'Zend\\Hydrator\\Strategy\\ClosureStrategy' => $vendorDir . '/zendframework/zend-hydrator/src/Strategy/ClosureStrategy.php', + 'Zend\\Hydrator\\Strategy\\DateTimeFormatterStrategy' => $vendorDir . '/zendframework/zend-hydrator/src/Strategy/DateTimeFormatterStrategy.php', + 'Zend\\Hydrator\\Strategy\\DefaultStrategy' => $vendorDir . '/zendframework/zend-hydrator/src/Strategy/DefaultStrategy.php', + 'Zend\\Hydrator\\Strategy\\Exception\\ExceptionInterface' => $vendorDir . '/zendframework/zend-hydrator/src/Strategy/Exception/ExceptionInterface.php', + 'Zend\\Hydrator\\Strategy\\Exception\\InvalidArgumentException' => $vendorDir . '/zendframework/zend-hydrator/src/Strategy/Exception/InvalidArgumentException.php', + 'Zend\\Hydrator\\Strategy\\ExplodeStrategy' => $vendorDir . '/zendframework/zend-hydrator/src/Strategy/ExplodeStrategy.php', + 'Zend\\Hydrator\\Strategy\\SerializableStrategy' => $vendorDir . '/zendframework/zend-hydrator/src/Strategy/SerializableStrategy.php', + 'Zend\\Hydrator\\Strategy\\StrategyChain' => $vendorDir . '/zendframework/zend-hydrator/src/Strategy/StrategyChain.php', + 'Zend\\Hydrator\\Strategy\\StrategyInterface' => $vendorDir . '/zendframework/zend-hydrator/src/Strategy/StrategyInterface.php', + 'Zend\\I18n\\ConfigProvider' => $vendorDir . '/zendframework/zend-i18n/src/ConfigProvider.php', + 'Zend\\I18n\\Exception\\ExceptionInterface' => $vendorDir . '/zendframework/zend-i18n/src/Exception/ExceptionInterface.php', + 'Zend\\I18n\\Exception\\ExtensionNotLoadedException' => $vendorDir . '/zendframework/zend-i18n/src/Exception/ExtensionNotLoadedException.php', + 'Zend\\I18n\\Exception\\InvalidArgumentException' => $vendorDir . '/zendframework/zend-i18n/src/Exception/InvalidArgumentException.php', + 'Zend\\I18n\\Exception\\OutOfBoundsException' => $vendorDir . '/zendframework/zend-i18n/src/Exception/OutOfBoundsException.php', + 'Zend\\I18n\\Exception\\ParseException' => $vendorDir . '/zendframework/zend-i18n/src/Exception/ParseException.php', + 'Zend\\I18n\\Exception\\RangeException' => $vendorDir . '/zendframework/zend-i18n/src/Exception/RangeException.php', + 'Zend\\I18n\\Exception\\RuntimeException' => $vendorDir . '/zendframework/zend-i18n/src/Exception/RuntimeException.php', + 'Zend\\I18n\\Filter\\AbstractLocale' => $vendorDir . '/zendframework/zend-i18n/src/Filter/AbstractLocale.php', + 'Zend\\I18n\\Filter\\Alnum' => $vendorDir . '/zendframework/zend-i18n/src/Filter/Alnum.php', + 'Zend\\I18n\\Filter\\Alpha' => $vendorDir . '/zendframework/zend-i18n/src/Filter/Alpha.php', + 'Zend\\I18n\\Filter\\NumberFormat' => $vendorDir . '/zendframework/zend-i18n/src/Filter/NumberFormat.php', + 'Zend\\I18n\\Filter\\NumberParse' => $vendorDir . '/zendframework/zend-i18n/src/Filter/NumberParse.php', + 'Zend\\I18n\\Module' => $vendorDir . '/zendframework/zend-i18n/src/Module.php', + 'Zend\\I18n\\Translator\\LoaderPluginManager' => $vendorDir . '/zendframework/zend-i18n/src/Translator/LoaderPluginManager.php', + 'Zend\\I18n\\Translator\\LoaderPluginManagerFactory' => $vendorDir . '/zendframework/zend-i18n/src/Translator/LoaderPluginManagerFactory.php', + 'Zend\\I18n\\Translator\\Loader\\AbstractFileLoader' => $vendorDir . '/zendframework/zend-i18n/src/Translator/Loader/AbstractFileLoader.php', + 'Zend\\I18n\\Translator\\Loader\\FileLoaderInterface' => $vendorDir . '/zendframework/zend-i18n/src/Translator/Loader/FileLoaderInterface.php', + 'Zend\\I18n\\Translator\\Loader\\Gettext' => $vendorDir . '/zendframework/zend-i18n/src/Translator/Loader/Gettext.php', + 'Zend\\I18n\\Translator\\Loader\\Ini' => $vendorDir . '/zendframework/zend-i18n/src/Translator/Loader/Ini.php', + 'Zend\\I18n\\Translator\\Loader\\PhpArray' => $vendorDir . '/zendframework/zend-i18n/src/Translator/Loader/PhpArray.php', + 'Zend\\I18n\\Translator\\Loader\\PhpMemoryArray' => $vendorDir . '/zendframework/zend-i18n/src/Translator/Loader/PhpMemoryArray.php', + 'Zend\\I18n\\Translator\\Loader\\RemoteLoaderInterface' => $vendorDir . '/zendframework/zend-i18n/src/Translator/Loader/RemoteLoaderInterface.php', + 'Zend\\I18n\\Translator\\Plural\\Parser' => $vendorDir . '/zendframework/zend-i18n/src/Translator/Plural/Parser.php', + 'Zend\\I18n\\Translator\\Plural\\Rule' => $vendorDir . '/zendframework/zend-i18n/src/Translator/Plural/Rule.php', + 'Zend\\I18n\\Translator\\Plural\\Symbol' => $vendorDir . '/zendframework/zend-i18n/src/Translator/Plural/Symbol.php', + 'Zend\\I18n\\Translator\\TextDomain' => $vendorDir . '/zendframework/zend-i18n/src/Translator/TextDomain.php', + 'Zend\\I18n\\Translator\\Translator' => $vendorDir . '/zendframework/zend-i18n/src/Translator/Translator.php', + 'Zend\\I18n\\Translator\\TranslatorAwareInterface' => $vendorDir . '/zendframework/zend-i18n/src/Translator/TranslatorAwareInterface.php', + 'Zend\\I18n\\Translator\\TranslatorAwareTrait' => $vendorDir . '/zendframework/zend-i18n/src/Translator/TranslatorAwareTrait.php', + 'Zend\\I18n\\Translator\\TranslatorInterface' => $vendorDir . '/zendframework/zend-i18n/src/Translator/TranslatorInterface.php', + 'Zend\\I18n\\Translator\\TranslatorServiceFactory' => $vendorDir . '/zendframework/zend-i18n/src/Translator/TranslatorServiceFactory.php', + 'Zend\\I18n\\Validator\\Alnum' => $vendorDir . '/zendframework/zend-i18n/src/Validator/Alnum.php', + 'Zend\\I18n\\Validator\\Alpha' => $vendorDir . '/zendframework/zend-i18n/src/Validator/Alpha.php', + 'Zend\\I18n\\Validator\\DateTime' => $vendorDir . '/zendframework/zend-i18n/src/Validator/DateTime.php', + 'Zend\\I18n\\Validator\\Float' => $vendorDir . '/zendframework/zend-i18n/src/Validator/Float.php', + 'Zend\\I18n\\Validator\\Int' => $vendorDir . '/zendframework/zend-i18n/src/Validator/Int.php', + 'Zend\\I18n\\Validator\\IsFloat' => $vendorDir . '/zendframework/zend-i18n/src/Validator/IsFloat.php', + 'Zend\\I18n\\Validator\\IsInt' => $vendorDir . '/zendframework/zend-i18n/src/Validator/IsInt.php', + 'Zend\\I18n\\Validator\\PhoneNumber' => $vendorDir . '/zendframework/zend-i18n/src/Validator/PhoneNumber.php', + 'Zend\\I18n\\Validator\\PostCode' => $vendorDir . '/zendframework/zend-i18n/src/Validator/PostCode.php', + 'Zend\\I18n\\View\\HelperConfig' => $vendorDir . '/zendframework/zend-i18n/src/View/HelperConfig.php', + 'Zend\\I18n\\View\\HelperTrait' => $vendorDir . '/zendframework/zend-i18n/src/View/HelperTrait.php', + 'Zend\\I18n\\View\\Helper\\AbstractTranslatorHelper' => $vendorDir . '/zendframework/zend-i18n/src/View/Helper/AbstractTranslatorHelper.php', + 'Zend\\I18n\\View\\Helper\\CurrencyFormat' => $vendorDir . '/zendframework/zend-i18n/src/View/Helper/CurrencyFormat.php', + 'Zend\\I18n\\View\\Helper\\DateFormat' => $vendorDir . '/zendframework/zend-i18n/src/View/Helper/DateFormat.php', + 'Zend\\I18n\\View\\Helper\\NumberFormat' => $vendorDir . '/zendframework/zend-i18n/src/View/Helper/NumberFormat.php', + 'Zend\\I18n\\View\\Helper\\Plural' => $vendorDir . '/zendframework/zend-i18n/src/View/Helper/Plural.php', + 'Zend\\I18n\\View\\Helper\\Translate' => $vendorDir . '/zendframework/zend-i18n/src/View/Helper/Translate.php', + 'Zend\\I18n\\View\\Helper\\TranslatePlural' => $vendorDir . '/zendframework/zend-i18n/src/View/Helper/TranslatePlural.php', + 'Zend\\Json\\Decoder' => $vendorDir . '/zendframework/zend-json/src/Decoder.php', + 'Zend\\Json\\Encoder' => $vendorDir . '/zendframework/zend-json/src/Encoder.php', + 'Zend\\Json\\Exception\\BadMethodCallException' => $vendorDir . '/zendframework/zend-json/src/Exception/BadMethodCallException.php', + 'Zend\\Json\\Exception\\ExceptionInterface' => $vendorDir . '/zendframework/zend-json/src/Exception/ExceptionInterface.php', + 'Zend\\Json\\Exception\\InvalidArgumentException' => $vendorDir . '/zendframework/zend-json/src/Exception/InvalidArgumentException.php', + 'Zend\\Json\\Exception\\RecursionException' => $vendorDir . '/zendframework/zend-json/src/Exception/RecursionException.php', + 'Zend\\Json\\Exception\\RuntimeException' => $vendorDir . '/zendframework/zend-json/src/Exception/RuntimeException.php', + 'Zend\\Json\\Expr' => $vendorDir . '/zendframework/zend-json/src/Expr.php', + 'Zend\\Json\\Json' => $vendorDir . '/zendframework/zend-json/src/Json.php', + 'Zend\\Serializer\\AdapterPluginManager' => $vendorDir . '/zendframework/zend-serializer/src/AdapterPluginManager.php', + 'Zend\\Serializer\\AdapterPluginManagerFactory' => $vendorDir . '/zendframework/zend-serializer/src/AdapterPluginManagerFactory.php', + 'Zend\\Serializer\\Adapter\\AbstractAdapter' => $vendorDir . '/zendframework/zend-serializer/src/Adapter/AbstractAdapter.php', + 'Zend\\Serializer\\Adapter\\AdapterInterface' => $vendorDir . '/zendframework/zend-serializer/src/Adapter/AdapterInterface.php', + 'Zend\\Serializer\\Adapter\\AdapterOptions' => $vendorDir . '/zendframework/zend-serializer/src/Adapter/AdapterOptions.php', + 'Zend\\Serializer\\Adapter\\IgBinary' => $vendorDir . '/zendframework/zend-serializer/src/Adapter/IgBinary.php', + 'Zend\\Serializer\\Adapter\\Json' => $vendorDir . '/zendframework/zend-serializer/src/Adapter/Json.php', + 'Zend\\Serializer\\Adapter\\JsonOptions' => $vendorDir . '/zendframework/zend-serializer/src/Adapter/JsonOptions.php', + 'Zend\\Serializer\\Adapter\\MsgPack' => $vendorDir . '/zendframework/zend-serializer/src/Adapter/MsgPack.php', + 'Zend\\Serializer\\Adapter\\PhpCode' => $vendorDir . '/zendframework/zend-serializer/src/Adapter/PhpCode.php', + 'Zend\\Serializer\\Adapter\\PhpSerialize' => $vendorDir . '/zendframework/zend-serializer/src/Adapter/PhpSerialize.php', + 'Zend\\Serializer\\Adapter\\PhpSerializeOptions' => $vendorDir . '/zendframework/zend-serializer/src/Adapter/PhpSerializeOptions.php', + 'Zend\\Serializer\\Adapter\\PythonPickle' => $vendorDir . '/zendframework/zend-serializer/src/Adapter/PythonPickle.php', + 'Zend\\Serializer\\Adapter\\PythonPickleOptions' => $vendorDir . '/zendframework/zend-serializer/src/Adapter/PythonPickleOptions.php', + 'Zend\\Serializer\\Adapter\\Wddx' => $vendorDir . '/zendframework/zend-serializer/src/Adapter/Wddx.php', + 'Zend\\Serializer\\Adapter\\WddxOptions' => $vendorDir . '/zendframework/zend-serializer/src/Adapter/WddxOptions.php', + 'Zend\\Serializer\\ConfigProvider' => $vendorDir . '/zendframework/zend-serializer/src/ConfigProvider.php', + 'Zend\\Serializer\\Exception\\ExceptionInterface' => $vendorDir . '/zendframework/zend-serializer/src/Exception/ExceptionInterface.php', + 'Zend\\Serializer\\Exception\\ExtensionNotLoadedException' => $vendorDir . '/zendframework/zend-serializer/src/Exception/ExtensionNotLoadedException.php', + 'Zend\\Serializer\\Exception\\InvalidArgumentException' => $vendorDir . '/zendframework/zend-serializer/src/Exception/InvalidArgumentException.php', + 'Zend\\Serializer\\Exception\\RuntimeException' => $vendorDir . '/zendframework/zend-serializer/src/Exception/RuntimeException.php', + 'Zend\\Serializer\\Module' => $vendorDir . '/zendframework/zend-serializer/src/Module.php', + 'Zend\\Serializer\\Serializer' => $vendorDir . '/zendframework/zend-serializer/src/Serializer.php', + 'Zend\\ServiceManager\\AbstractFactoryInterface' => $vendorDir . '/zendframework/zend-servicemanager/src/AbstractFactoryInterface.php', + 'Zend\\ServiceManager\\AbstractPluginManager' => $vendorDir . '/zendframework/zend-servicemanager/src/AbstractPluginManager.php', + 'Zend\\ServiceManager\\Config' => $vendorDir . '/zendframework/zend-servicemanager/src/Config.php', + 'Zend\\ServiceManager\\ConfigInterface' => $vendorDir . '/zendframework/zend-servicemanager/src/ConfigInterface.php', + 'Zend\\ServiceManager\\DelegatorFactoryInterface' => $vendorDir . '/zendframework/zend-servicemanager/src/DelegatorFactoryInterface.php', + 'Zend\\ServiceManager\\Di\\DiAbstractServiceFactory' => $vendorDir . '/zendframework/zend-servicemanager/src/Di/DiAbstractServiceFactory.php', + 'Zend\\ServiceManager\\Di\\DiInstanceManagerProxy' => $vendorDir . '/zendframework/zend-servicemanager/src/Di/DiInstanceManagerProxy.php', + 'Zend\\ServiceManager\\Di\\DiServiceFactory' => $vendorDir . '/zendframework/zend-servicemanager/src/Di/DiServiceFactory.php', + 'Zend\\ServiceManager\\Di\\DiServiceInitializer' => $vendorDir . '/zendframework/zend-servicemanager/src/Di/DiServiceInitializer.php', + 'Zend\\ServiceManager\\Exception\\CircularDependencyFoundException' => $vendorDir . '/zendframework/zend-servicemanager/src/Exception/CircularDependencyFoundException.php', + 'Zend\\ServiceManager\\Exception\\CircularReferenceException' => $vendorDir . '/zendframework/zend-servicemanager/src/Exception/CircularReferenceException.php', + 'Zend\\ServiceManager\\Exception\\ExceptionInterface' => $vendorDir . '/zendframework/zend-servicemanager/src/Exception/ExceptionInterface.php', + 'Zend\\ServiceManager\\Exception\\InvalidArgumentException' => $vendorDir . '/zendframework/zend-servicemanager/src/Exception/InvalidArgumentException.php', + 'Zend\\ServiceManager\\Exception\\InvalidServiceException' => $vendorDir . '/zendframework/zend-servicemanager/src/Exception/InvalidServiceException.php', + 'Zend\\ServiceManager\\Exception\\InvalidServiceNameException' => $vendorDir . '/zendframework/zend-servicemanager/src/Exception/InvalidServiceNameException.php', + 'Zend\\ServiceManager\\Exception\\RuntimeException' => $vendorDir . '/zendframework/zend-servicemanager/src/Exception/RuntimeException.php', + 'Zend\\ServiceManager\\Exception\\ServiceLocatorUsageException' => $vendorDir . '/zendframework/zend-servicemanager/src/Exception/ServiceLocatorUsageException.php', + 'Zend\\ServiceManager\\Exception\\ServiceNotCreatedException' => $vendorDir . '/zendframework/zend-servicemanager/src/Exception/ServiceNotCreatedException.php', + 'Zend\\ServiceManager\\Exception\\ServiceNotFoundException' => $vendorDir . '/zendframework/zend-servicemanager/src/Exception/ServiceNotFoundException.php', + 'Zend\\ServiceManager\\FactoryInterface' => $vendorDir . '/zendframework/zend-servicemanager/src/FactoryInterface.php', + 'Zend\\ServiceManager\\Factory\\InvokableFactory' => $vendorDir . '/zendframework/zend-servicemanager/src/Factory/InvokableFactory.php', + 'Zend\\ServiceManager\\InitializerInterface' => $vendorDir . '/zendframework/zend-servicemanager/src/InitializerInterface.php', + 'Zend\\ServiceManager\\MutableCreationOptionsInterface' => $vendorDir . '/zendframework/zend-servicemanager/src/MutableCreationOptionsInterface.php', + 'Zend\\ServiceManager\\MutableCreationOptionsTrait' => $vendorDir . '/zendframework/zend-servicemanager/src/MutableCreationOptionsTrait.php', + 'Zend\\ServiceManager\\Proxy\\LazyServiceFactory' => $vendorDir . '/zendframework/zend-servicemanager/src/Proxy/LazyServiceFactory.php', + 'Zend\\ServiceManager\\Proxy\\LazyServiceFactoryFactory' => $vendorDir . '/zendframework/zend-servicemanager/src/Proxy/LazyServiceFactoryFactory.php', + 'Zend\\ServiceManager\\ServiceLocatorAwareInterface' => $vendorDir . '/zendframework/zend-servicemanager/src/ServiceLocatorAwareInterface.php', + 'Zend\\ServiceManager\\ServiceLocatorAwareTrait' => $vendorDir . '/zendframework/zend-servicemanager/src/ServiceLocatorAwareTrait.php', + 'Zend\\ServiceManager\\ServiceLocatorInterface' => $vendorDir . '/zendframework/zend-servicemanager/src/ServiceLocatorInterface.php', + 'Zend\\ServiceManager\\ServiceManager' => $vendorDir . '/zendframework/zend-servicemanager/src/ServiceManager.php', + 'Zend\\ServiceManager\\ServiceManagerAwareInterface' => $vendorDir . '/zendframework/zend-servicemanager/src/ServiceManagerAwareInterface.php', + 'Zend\\ServiceManager\\Test\\CommonPluginManagerTrait' => $vendorDir . '/zendframework/zend-servicemanager/src/Test/CommonPluginManagerTrait.php', + 'Zend\\Stdlib\\AbstractOptions' => $vendorDir . '/zendframework/zend-stdlib/src/AbstractOptions.php', + 'Zend\\Stdlib\\ArrayObject' => $vendorDir . '/zendframework/zend-stdlib/src/ArrayObject.php', + 'Zend\\Stdlib\\ArraySerializableInterface' => $vendorDir . '/zendframework/zend-stdlib/src/ArraySerializableInterface.php', + 'Zend\\Stdlib\\ArrayStack' => $vendorDir . '/zendframework/zend-stdlib/src/ArrayStack.php', + 'Zend\\Stdlib\\ArrayUtils' => $vendorDir . '/zendframework/zend-stdlib/src/ArrayUtils.php', + 'Zend\\Stdlib\\ArrayUtils\\MergeRemoveKey' => $vendorDir . '/zendframework/zend-stdlib/src/ArrayUtils/MergeRemoveKey.php', + 'Zend\\Stdlib\\ArrayUtils\\MergeReplaceKey' => $vendorDir . '/zendframework/zend-stdlib/src/ArrayUtils/MergeReplaceKey.php', + 'Zend\\Stdlib\\ArrayUtils\\MergeReplaceKeyInterface' => $vendorDir . '/zendframework/zend-stdlib/src/ArrayUtils/MergeReplaceKeyInterface.php', + 'Zend\\Stdlib\\CallbackHandler' => $vendorDir . '/zendframework/zend-stdlib/src/CallbackHandler.php', + 'Zend\\Stdlib\\DateTime' => $vendorDir . '/zendframework/zend-stdlib/src/DateTime.php', + 'Zend\\Stdlib\\DispatchableInterface' => $vendorDir . '/zendframework/zend-stdlib/src/DispatchableInterface.php', + 'Zend\\Stdlib\\ErrorHandler' => $vendorDir . '/zendframework/zend-stdlib/src/ErrorHandler.php', + 'Zend\\Stdlib\\Exception\\BadMethodCallException' => $vendorDir . '/zendframework/zend-stdlib/src/Exception/BadMethodCallException.php', + 'Zend\\Stdlib\\Exception\\DomainException' => $vendorDir . '/zendframework/zend-stdlib/src/Exception/DomainException.php', + 'Zend\\Stdlib\\Exception\\ExceptionInterface' => $vendorDir . '/zendframework/zend-stdlib/src/Exception/ExceptionInterface.php', + 'Zend\\Stdlib\\Exception\\ExtensionNotLoadedException' => $vendorDir . '/zendframework/zend-stdlib/src/Exception/ExtensionNotLoadedException.php', + 'Zend\\Stdlib\\Exception\\InvalidArgumentException' => $vendorDir . '/zendframework/zend-stdlib/src/Exception/InvalidArgumentException.php', + 'Zend\\Stdlib\\Exception\\InvalidCallbackException' => $vendorDir . '/zendframework/zend-stdlib/src/Exception/InvalidCallbackException.php', + 'Zend\\Stdlib\\Exception\\LogicException' => $vendorDir . '/zendframework/zend-stdlib/src/Exception/LogicException.php', + 'Zend\\Stdlib\\Exception\\RuntimeException' => $vendorDir . '/zendframework/zend-stdlib/src/Exception/RuntimeException.php', + 'Zend\\Stdlib\\Extractor\\ExtractionInterface' => $vendorDir . '/zendframework/zend-stdlib/src/Extractor/ExtractionInterface.php', + 'Zend\\Stdlib\\FastPriorityQueue' => $vendorDir . '/zendframework/zend-stdlib/src/FastPriorityQueue.php', + 'Zend\\Stdlib\\Glob' => $vendorDir . '/zendframework/zend-stdlib/src/Glob.php', + 'Zend\\Stdlib\\Guard\\AllGuardsTrait' => $vendorDir . '/zendframework/zend-stdlib/src/Guard/AllGuardsTrait.php', + 'Zend\\Stdlib\\Guard\\ArrayOrTraversableGuardTrait' => $vendorDir . '/zendframework/zend-stdlib/src/Guard/ArrayOrTraversableGuardTrait.php', + 'Zend\\Stdlib\\Guard\\EmptyGuardTrait' => $vendorDir . '/zendframework/zend-stdlib/src/Guard/EmptyGuardTrait.php', + 'Zend\\Stdlib\\Guard\\GuardUtils' => $vendorDir . '/zendframework/zend-stdlib/src/Guard/GuardUtils.php', + 'Zend\\Stdlib\\Guard\\NullGuardTrait' => $vendorDir . '/zendframework/zend-stdlib/src/Guard/NullGuardTrait.php', + 'Zend\\Stdlib\\Hydrator\\AbstractHydrator' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/AbstractHydrator.php', + 'Zend\\Stdlib\\Hydrator\\Aggregate\\AggregateHydrator' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Aggregate/AggregateHydrator.php', + 'Zend\\Stdlib\\Hydrator\\Aggregate\\ExtractEvent' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Aggregate/ExtractEvent.php', + 'Zend\\Stdlib\\Hydrator\\Aggregate\\HydrateEvent' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Aggregate/HydrateEvent.php', + 'Zend\\Stdlib\\Hydrator\\Aggregate\\HydratorListener' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Aggregate/HydratorListener.php', + 'Zend\\Stdlib\\Hydrator\\ArraySerializable' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/ArraySerializable.php', + 'Zend\\Stdlib\\Hydrator\\ClassMethods' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/ClassMethods.php', + 'Zend\\Stdlib\\Hydrator\\DelegatingHydrator' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/DelegatingHydrator.php', + 'Zend\\Stdlib\\Hydrator\\DelegatingHydratorFactory' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/DelegatingHydratorFactory.php', + 'Zend\\Stdlib\\Hydrator\\FilterEnabledInterface' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/FilterEnabledInterface.php', + 'Zend\\Stdlib\\Hydrator\\Filter\\FilterComposite' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Filter/FilterComposite.php', + 'Zend\\Stdlib\\Hydrator\\Filter\\FilterInterface' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Filter/FilterInterface.php', + 'Zend\\Stdlib\\Hydrator\\Filter\\FilterProviderInterface' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Filter/FilterProviderInterface.php', + 'Zend\\Stdlib\\Hydrator\\Filter\\GetFilter' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Filter/GetFilter.php', + 'Zend\\Stdlib\\Hydrator\\Filter\\HasFilter' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Filter/HasFilter.php', + 'Zend\\Stdlib\\Hydrator\\Filter\\IsFilter' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Filter/IsFilter.php', + 'Zend\\Stdlib\\Hydrator\\Filter\\MethodMatchFilter' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Filter/MethodMatchFilter.php', + 'Zend\\Stdlib\\Hydrator\\Filter\\NumberOfParameterFilter' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Filter/NumberOfParameterFilter.php', + 'Zend\\Stdlib\\Hydrator\\Filter\\OptionalParametersFilter' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Filter/OptionalParametersFilter.php', + 'Zend\\Stdlib\\Hydrator\\HydrationInterface' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/HydrationInterface.php', + 'Zend\\Stdlib\\Hydrator\\HydratorAwareInterface' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/HydratorAwareInterface.php', + 'Zend\\Stdlib\\Hydrator\\HydratorAwareTrait' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/HydratorAwareTrait.php', + 'Zend\\Stdlib\\Hydrator\\HydratorInterface' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/HydratorInterface.php', + 'Zend\\Stdlib\\Hydrator\\HydratorOptionsInterface' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/HydratorOptionsInterface.php', + 'Zend\\Stdlib\\Hydrator\\HydratorPluginManager' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/HydratorPluginManager.php', + 'Zend\\Stdlib\\Hydrator\\Iterator\\HydratingArrayIterator' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Iterator/HydratingArrayIterator.php', + 'Zend\\Stdlib\\Hydrator\\Iterator\\HydratingIteratorInterface' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Iterator/HydratingIteratorInterface.php', + 'Zend\\Stdlib\\Hydrator\\Iterator\\HydratingIteratorIterator' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Iterator/HydratingIteratorIterator.php', + 'Zend\\Stdlib\\Hydrator\\NamingStrategyEnabledInterface' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/NamingStrategyEnabledInterface.php', + 'Zend\\Stdlib\\Hydrator\\NamingStrategy\\ArrayMapNamingStrategy' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/NamingStrategy/ArrayMapNamingStrategy.php', + 'Zend\\Stdlib\\Hydrator\\NamingStrategy\\CompositeNamingStrategy' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/NamingStrategy/CompositeNamingStrategy.php', + 'Zend\\Stdlib\\Hydrator\\NamingStrategy\\IdentityNamingStrategy' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/NamingStrategy/IdentityNamingStrategy.php', + 'Zend\\Stdlib\\Hydrator\\NamingStrategy\\MapNamingStrategy' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/NamingStrategy/MapNamingStrategy.php', + 'Zend\\Stdlib\\Hydrator\\NamingStrategy\\NamingStrategyInterface' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/NamingStrategy/NamingStrategyInterface.php', + 'Zend\\Stdlib\\Hydrator\\NamingStrategy\\UnderscoreNamingStrategy' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/NamingStrategy/UnderscoreNamingStrategy.php', + 'Zend\\Stdlib\\Hydrator\\ObjectProperty' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/ObjectProperty.php', + 'Zend\\Stdlib\\Hydrator\\Reflection' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Reflection.php', + 'Zend\\Stdlib\\Hydrator\\StrategyEnabledInterface' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/StrategyEnabledInterface.php', + 'Zend\\Stdlib\\Hydrator\\Strategy\\BooleanStrategy' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Strategy/BooleanStrategy.php', + 'Zend\\Stdlib\\Hydrator\\Strategy\\ClosureStrategy' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Strategy/ClosureStrategy.php', + 'Zend\\Stdlib\\Hydrator\\Strategy\\DateTimeFormatterStrategy' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Strategy/DateTimeFormatterStrategy.php', + 'Zend\\Stdlib\\Hydrator\\Strategy\\DefaultStrategy' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Strategy/DefaultStrategy.php', + 'Zend\\Stdlib\\Hydrator\\Strategy\\Exception\\ExceptionInterface' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Strategy/Exception/ExceptionInterface.php', + 'Zend\\Stdlib\\Hydrator\\Strategy\\Exception\\InvalidArgumentException' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Strategy/Exception/InvalidArgumentException.php', + 'Zend\\Stdlib\\Hydrator\\Strategy\\ExplodeStrategy' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Strategy/ExplodeStrategy.php', + 'Zend\\Stdlib\\Hydrator\\Strategy\\SerializableStrategy' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Strategy/SerializableStrategy.php', + 'Zend\\Stdlib\\Hydrator\\Strategy\\StrategyChain' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Strategy/StrategyChain.php', + 'Zend\\Stdlib\\Hydrator\\Strategy\\StrategyInterface' => $vendorDir . '/zendframework/zend-stdlib/src/Hydrator/Strategy/StrategyInterface.php', + 'Zend\\Stdlib\\InitializableInterface' => $vendorDir . '/zendframework/zend-stdlib/src/InitializableInterface.php', + 'Zend\\Stdlib\\JsonSerializable' => $vendorDir . '/zendframework/zend-stdlib/src/JsonSerializable.php', + 'Zend\\Stdlib\\Message' => $vendorDir . '/zendframework/zend-stdlib/src/Message.php', + 'Zend\\Stdlib\\MessageInterface' => $vendorDir . '/zendframework/zend-stdlib/src/MessageInterface.php', + 'Zend\\Stdlib\\ParameterObjectInterface' => $vendorDir . '/zendframework/zend-stdlib/src/ParameterObjectInterface.php', + 'Zend\\Stdlib\\Parameters' => $vendorDir . '/zendframework/zend-stdlib/src/Parameters.php', + 'Zend\\Stdlib\\ParametersInterface' => $vendorDir . '/zendframework/zend-stdlib/src/ParametersInterface.php', + 'Zend\\Stdlib\\PriorityList' => $vendorDir . '/zendframework/zend-stdlib/src/PriorityList.php', + 'Zend\\Stdlib\\PriorityQueue' => $vendorDir . '/zendframework/zend-stdlib/src/PriorityQueue.php', + 'Zend\\Stdlib\\Request' => $vendorDir . '/zendframework/zend-stdlib/src/Request.php', + 'Zend\\Stdlib\\RequestInterface' => $vendorDir . '/zendframework/zend-stdlib/src/RequestInterface.php', + 'Zend\\Stdlib\\Response' => $vendorDir . '/zendframework/zend-stdlib/src/Response.php', + 'Zend\\Stdlib\\ResponseInterface' => $vendorDir . '/zendframework/zend-stdlib/src/ResponseInterface.php', + 'Zend\\Stdlib\\SplPriorityQueue' => $vendorDir . '/zendframework/zend-stdlib/src/SplPriorityQueue.php', + 'Zend\\Stdlib\\SplQueue' => $vendorDir . '/zendframework/zend-stdlib/src/SplQueue.php', + 'Zend\\Stdlib\\SplStack' => $vendorDir . '/zendframework/zend-stdlib/src/SplStack.php', + 'Zend\\Stdlib\\StringUtils' => $vendorDir . '/zendframework/zend-stdlib/src/StringUtils.php', + 'Zend\\Stdlib\\StringWrapper\\AbstractStringWrapper' => $vendorDir . '/zendframework/zend-stdlib/src/StringWrapper/AbstractStringWrapper.php', + 'Zend\\Stdlib\\StringWrapper\\Iconv' => $vendorDir . '/zendframework/zend-stdlib/src/StringWrapper/Iconv.php', + 'Zend\\Stdlib\\StringWrapper\\Intl' => $vendorDir . '/zendframework/zend-stdlib/src/StringWrapper/Intl.php', + 'Zend\\Stdlib\\StringWrapper\\MbString' => $vendorDir . '/zendframework/zend-stdlib/src/StringWrapper/MbString.php', + 'Zend\\Stdlib\\StringWrapper\\Native' => $vendorDir . '/zendframework/zend-stdlib/src/StringWrapper/Native.php', + 'Zend\\Stdlib\\StringWrapper\\StringWrapperInterface' => $vendorDir . '/zendframework/zend-stdlib/src/StringWrapper/StringWrapperInterface.php', + 'ezcBase' => $vendorDir . '/zetacomponents/base/src/base.php', + 'ezcBaseAutoloadException' => $vendorDir . '/zetacomponents/base/src/exceptions/autoload.php', + 'ezcBaseAutoloadOptions' => $vendorDir . '/zetacomponents/base/src/options/autoload.php', + 'ezcBaseConfigurationInitializer' => $vendorDir . '/zetacomponents/base/src/interfaces/configuration_initializer.php', + 'ezcBaseDoubleClassRepositoryPrefixException' => $vendorDir . '/zetacomponents/base/src/exceptions/double_class_repository_prefix.php', + 'ezcBaseException' => $vendorDir . '/zetacomponents/base/src/exceptions/exception.php', + 'ezcBaseExportable' => $vendorDir . '/zetacomponents/base/src/interfaces/exportable.php', + 'ezcBaseExtensionNotFoundException' => $vendorDir . '/zetacomponents/base/src/exceptions/extension_not_found.php', + 'ezcBaseFeatures' => $vendorDir . '/zetacomponents/base/src/features.php', + 'ezcBaseFile' => $vendorDir . '/zetacomponents/base/src/file.php', + 'ezcBaseFileException' => $vendorDir . '/zetacomponents/base/src/exceptions/file_exception.php', + 'ezcBaseFileFindContext' => $vendorDir . '/zetacomponents/base/src/structs/file_find_context.php', + 'ezcBaseFileIoException' => $vendorDir . '/zetacomponents/base/src/exceptions/file_io.php', + 'ezcBaseFileNotFoundException' => $vendorDir . '/zetacomponents/base/src/exceptions/file_not_found.php', + 'ezcBaseFilePermissionException' => $vendorDir . '/zetacomponents/base/src/exceptions/file_permission.php', + 'ezcBaseFunctionalityNotSupportedException' => $vendorDir . '/zetacomponents/base/src/exceptions/functionality_not_supported.php', + 'ezcBaseInit' => $vendorDir . '/zetacomponents/base/src/init.php', + 'ezcBaseInitCallbackConfiguredException' => $vendorDir . '/zetacomponents/base/src/exceptions/init_callback_configured.php', + 'ezcBaseInitInvalidCallbackClassException' => $vendorDir . '/zetacomponents/base/src/exceptions/invalid_callback_class.php', + 'ezcBaseInvalidParentClassException' => $vendorDir . '/zetacomponents/base/src/exceptions/invalid_parent_class.php', + 'ezcBaseMetaData' => $vendorDir . '/zetacomponents/base/src/metadata.php', + 'ezcBaseMetaDataPearReader' => $vendorDir . '/zetacomponents/base/src/metadata/pear.php', + 'ezcBaseMetaDataTarballReader' => $vendorDir . '/zetacomponents/base/src/metadata/tarball.php', + 'ezcBaseOptions' => $vendorDir . '/zetacomponents/base/src/options.php', + 'ezcBasePersistable' => $vendorDir . '/zetacomponents/base/src/interfaces/persistable.php', + 'ezcBasePropertyNotFoundException' => $vendorDir . '/zetacomponents/base/src/exceptions/property_not_found.php', + 'ezcBasePropertyPermissionException' => $vendorDir . '/zetacomponents/base/src/exceptions/property_permission.php', + 'ezcBaseRepositoryDirectory' => $vendorDir . '/zetacomponents/base/src/structs/repository_directory.php', + 'ezcBaseSettingNotFoundException' => $vendorDir . '/zetacomponents/base/src/exceptions/setting_not_found.php', + 'ezcBaseSettingValueException' => $vendorDir . '/zetacomponents/base/src/exceptions/setting_value.php', + 'ezcBaseStruct' => $vendorDir . '/zetacomponents/base/src/struct.php', + 'ezcBaseValueException' => $vendorDir . '/zetacomponents/base/src/exceptions/value.php', + 'ezcBaseWhateverException' => $vendorDir . '/zetacomponents/base/src/exceptions/whatever.php', + 'ezcDocument' => $vendorDir . '/zetacomponents/document/src/interfaces/document.php', + 'ezcDocumentAlnumListItemGenerator' => $vendorDir . '/zetacomponents/document/src/document/pdf/item_generator/alnum.php', + 'ezcDocumentAlphaListItemGenerator' => $vendorDir . '/zetacomponents/document/src/document/pdf/item_generator/alpha.php', + 'ezcDocumentBBCode' => $vendorDir . '/zetacomponents/document/src/document/bbcode.php', + 'ezcDocumentBBCodeBlockLevelNode' => $vendorDir . '/zetacomponents/document/src/document/bbcode/nodes/block.php', + 'ezcDocumentBBCodeBulletListNode' => $vendorDir . '/zetacomponents/document/src/document/bbcode/nodes/bullet_list.php', + 'ezcDocumentBBCodeClosingTagNode' => $vendorDir . '/zetacomponents/document/src/document/bbcode/nodes/tag_close.php', + 'ezcDocumentBBCodeDocbookVisitor' => $vendorDir . '/zetacomponents/document/src/document/bbcode/visitor/docbook.php', + 'ezcDocumentBBCodeDocumentNode' => $vendorDir . '/zetacomponents/document/src/document/bbcode/nodes/document.php', + 'ezcDocumentBBCodeEmailPlugin' => $vendorDir . '/zetacomponents/document/src/document/bbcode/plugins/email.php', + 'ezcDocumentBBCodeEmphasisPlugin' => $vendorDir . '/zetacomponents/document/src/document/bbcode/plugins/emphasis.php', + 'ezcDocumentBBCodeEndOfFileToken' => $vendorDir . '/zetacomponents/document/src/document/bbcode/token/end_of_file.php', + 'ezcDocumentBBCodeEnumeratedListNode' => $vendorDir . '/zetacomponents/document/src/document/bbcode/nodes/enumerated_list.php', + 'ezcDocumentBBCodeImagePlugin' => $vendorDir . '/zetacomponents/document/src/document/bbcode/plugins/image.php', + 'ezcDocumentBBCodeInlineLiteralNode' => $vendorDir . '/zetacomponents/document/src/document/bbcode/nodes/inline_literal.php', + 'ezcDocumentBBCodeLineBreakToken' => $vendorDir . '/zetacomponents/document/src/document/bbcode/token/line_break.php', + 'ezcDocumentBBCodeListEndNode' => $vendorDir . '/zetacomponents/document/src/document/bbcode/nodes/list_end.php', + 'ezcDocumentBBCodeListItemNode' => $vendorDir . '/zetacomponents/document/src/document/bbcode/nodes/list_item.php', + 'ezcDocumentBBCodeListItemToken' => $vendorDir . '/zetacomponents/document/src/document/bbcode/token/list_item.php', + 'ezcDocumentBBCodeListNode' => $vendorDir . '/zetacomponents/document/src/document/bbcode/nodes/list.php', + 'ezcDocumentBBCodeLiteralBlockNode' => $vendorDir . '/zetacomponents/document/src/document/bbcode/nodes/literal_block.php', + 'ezcDocumentBBCodeLiteralBlockToken' => $vendorDir . '/zetacomponents/document/src/document/bbcode/token/literal_block.php', + 'ezcDocumentBBCodeNewLineToken' => $vendorDir . '/zetacomponents/document/src/document/bbcode/token/new_line.php', + 'ezcDocumentBBCodeNoMarkupPlugin' => $vendorDir . '/zetacomponents/document/src/document/bbcode/plugins/no.php', + 'ezcDocumentBBCodeNode' => $vendorDir . '/zetacomponents/document/src/document/bbcode/node.php', + 'ezcDocumentBBCodeOptions' => $vendorDir . '/zetacomponents/document/src/options/document_bbcode.php', + 'ezcDocumentBBCodeParagraphNode' => $vendorDir . '/zetacomponents/document/src/document/bbcode/nodes/paragraph.php', + 'ezcDocumentBBCodeParser' => $vendorDir . '/zetacomponents/document/src/document/bbcode/parser.php', + 'ezcDocumentBBCodePlugin' => $vendorDir . '/zetacomponents/document/src/document/bbcode/plugin.php', + 'ezcDocumentBBCodeQuotePlugin' => $vendorDir . '/zetacomponents/document/src/document/bbcode/plugins/quote.php', + 'ezcDocumentBBCodeSpecialCharsToken' => $vendorDir . '/zetacomponents/document/src/document/bbcode/token/special_chars.php', + 'ezcDocumentBBCodeTagCloseToken' => $vendorDir . '/zetacomponents/document/src/document/bbcode/token/tag_clsoe.php', + 'ezcDocumentBBCodeTagNode' => $vendorDir . '/zetacomponents/document/src/document/bbcode/nodes/tag.php', + 'ezcDocumentBBCodeTagOpenToken' => $vendorDir . '/zetacomponents/document/src/document/bbcode/token/tag_open.php', + 'ezcDocumentBBCodeTextLineToken' => $vendorDir . '/zetacomponents/document/src/document/bbcode/token/text_line.php', + 'ezcDocumentBBCodeTextNode' => $vendorDir . '/zetacomponents/document/src/document/bbcode/nodes/text.php', + 'ezcDocumentBBCodeToken' => $vendorDir . '/zetacomponents/document/src/document/bbcode/token.php', + 'ezcDocumentBBCodeTokenizer' => $vendorDir . '/zetacomponents/document/src/document/bbcode/tokenizer.php', + 'ezcDocumentBBCodeUrlPlugin' => $vendorDir . '/zetacomponents/document/src/document/bbcode/plugins/url.php', + 'ezcDocumentBBCodeVisitor' => $vendorDir . '/zetacomponents/document/src/document/bbcode/visitor.php', + 'ezcDocumentBBCodeWhitespaceToken' => $vendorDir . '/zetacomponents/document/src/document/bbcode/token/whitespace.php', + 'ezcDocumentBulletListItemGenerator' => $vendorDir . '/zetacomponents/document/src/document/pdf/item_generator/bullet.php', + 'ezcDocumentConfluenceWiki' => $vendorDir . '/zetacomponents/document/src/document/wiki/confluence.php', + 'ezcDocumentConversionException' => $vendorDir . '/zetacomponents/document/src/exceptions/conversion.php', + 'ezcDocumentConverter' => $vendorDir . '/zetacomponents/document/src/interfaces/converter.php', + 'ezcDocumentConverterOptions' => $vendorDir . '/zetacomponents/document/src/options/converter.php', + 'ezcDocumentCreoleWiki' => $vendorDir . '/zetacomponents/document/src/document/wiki/creole.php', + 'ezcDocumentDocbook' => $vendorDir . '/zetacomponents/document/src/document/xml/docbook.php', + 'ezcDocumentDocbookOptions' => $vendorDir . '/zetacomponents/document/src/options/document_docbook.php', + 'ezcDocumentDocbookToEzXmlAnchorHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/ezxml/anchor.php', + 'ezcDocumentDocbookToEzXmlCommentHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/ezxml/comment.php', + 'ezcDocumentDocbookToEzXmlConverter' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook_ezxml.php', + 'ezcDocumentDocbookToEzXmlConverterOptions' => $vendorDir . '/zetacomponents/document/src/options/converter_docbook_ezxml.php', + 'ezcDocumentDocbookToEzXmlEmphasisHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/ezxml/emphasis.php', + 'ezcDocumentDocbookToEzXmlExternalLinkHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/ezxml/external_link.php', + 'ezcDocumentDocbookToEzXmlFootnoteHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/ezxml/footnote.php', + 'ezcDocumentDocbookToEzXmlIgnoreHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/ezxml/ignore.php', + 'ezcDocumentDocbookToEzXmlInternalLinkHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/ezxml/internal_link.php', + 'ezcDocumentDocbookToEzXmlItemizedListHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/ezxml/itemized_list.php', + 'ezcDocumentDocbookToEzXmlLiteralLayoutHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/ezxml/literal_layout.php', + 'ezcDocumentDocbookToEzXmlMappingHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/ezxml/mapper.php', + 'ezcDocumentDocbookToEzXmlOrderedListHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/ezxml/ordered_list.php', + 'ezcDocumentDocbookToEzXmlParagraphHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/ezxml/paragraph.php', + 'ezcDocumentDocbookToEzXmlRecurseHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/ezxml/recurse.php', + 'ezcDocumentDocbookToEzXmlSectionHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/ezxml/section.php', + 'ezcDocumentDocbookToEzXmlTableCellHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/ezxml/table_cell.php', + 'ezcDocumentDocbookToEzXmlTableHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/ezxml/table.php', + 'ezcDocumentDocbookToEzXmlTitleHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/ezxml/title.php', + 'ezcDocumentDocbookToHtmlAnchorHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/xhtml/anchor.php', + 'ezcDocumentDocbookToHtmlBaseHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/xhtml/handler.php', + 'ezcDocumentDocbookToHtmlBlockquoteHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/xhtml/blockquote.php', + 'ezcDocumentDocbookToHtmlCommentHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/xhtml/comment.php', + 'ezcDocumentDocbookToHtmlConverter' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook_html.php', + 'ezcDocumentDocbookToHtmlConverterOptions' => $vendorDir . '/zetacomponents/document/src/options/converter_docbook_html.php', + 'ezcDocumentDocbookToHtmlDefinitionListEntryHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/xhtml/definition_list_entry.php', + 'ezcDocumentDocbookToHtmlEmphasisHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/xhtml/emphasis.php', + 'ezcDocumentDocbookToHtmlExternalLinkHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/xhtml/external_link.php', + 'ezcDocumentDocbookToHtmlFootnoteHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/xhtml/footnote.php', + 'ezcDocumentDocbookToHtmlHeadHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/xhtml/head.php', + 'ezcDocumentDocbookToHtmlIgnoreHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/xhtml/ignore.php', + 'ezcDocumentDocbookToHtmlInternalLinkHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/xhtml/internal_link.php', + 'ezcDocumentDocbookToHtmlLiteralLayoutHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/xhtml/literal_layout.php', + 'ezcDocumentDocbookToHtmlMappingHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/xhtml/mapper.php', + 'ezcDocumentDocbookToHtmlMediaObjectHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/xhtml/mediaobject.php', + 'ezcDocumentDocbookToHtmlParagraphHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/xhtml/paragraph.php', + 'ezcDocumentDocbookToHtmlSectionHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/xhtml/section.php', + 'ezcDocumentDocbookToHtmlSpecialParagraphHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/xhtml/special_paragraph.php', + 'ezcDocumentDocbookToHtmlTableCellHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/xhtml/table_cell.php', + 'ezcDocumentDocbookToHtmlXsltConverter' => $vendorDir . '/zetacomponents/document/src/converters/xslt/docbook_html.php', + 'ezcDocumentDocbookToHtmlXsltConverterOptions' => $vendorDir . '/zetacomponents/document/src/options/converter_docbook_html_xslt.php', + 'ezcDocumentDocbookToOdtAnchorHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/element_handlers/anchor.php', + 'ezcDocumentDocbookToOdtBaseHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/element_handlers/handler.php', + 'ezcDocumentDocbookToOdtCommentHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/element_handlers/comment.php', + 'ezcDocumentDocbookToOdtConverter' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook_odt.php', + 'ezcDocumentDocbookToOdtConverterOptions' => $vendorDir . '/zetacomponents/document/src/options/converter_docbook_odt.php', + 'ezcDocumentDocbookToOdtFootnoteHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/element_handlers/footnote.php', + 'ezcDocumentDocbookToOdtIgnoreHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/element_handlers/ignore.php', + 'ezcDocumentDocbookToOdtInlineHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/element_handlers/inline.php', + 'ezcDocumentDocbookToOdtLinkHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/element_handlers/link.php', + 'ezcDocumentDocbookToOdtListHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/element_handlers/list.php', + 'ezcDocumentDocbookToOdtLiteralLayoutHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/element_handlers/literal_layout.php', + 'ezcDocumentDocbookToOdtMappingHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/element_handlers/mapper.php', + 'ezcDocumentDocbookToOdtMediaObjectHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/element_handlers/media_object.php', + 'ezcDocumentDocbookToOdtPageBreakHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/element_handlers/page_break.php', + 'ezcDocumentDocbookToOdtParagraphHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/element_handlers/paragraph.php', + 'ezcDocumentDocbookToOdtSectionHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/element_handlers/section.php', + 'ezcDocumentDocbookToOdtTableHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/element_handlers/table.php', + 'ezcDocumentDocbookToOdtUlinkHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/element_handlers/ulink.php', + 'ezcDocumentDocbookToRstBaseHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/handler.php', + 'ezcDocumentDocbookToRstBeginPageHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/begin_page.php', + 'ezcDocumentDocbookToRstBlockquoteHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/blockquote.php', + 'ezcDocumentDocbookToRstCitationHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/citation.php', + 'ezcDocumentDocbookToRstCommentHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/comment.php', + 'ezcDocumentDocbookToRstConverter' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook_rst.php', + 'ezcDocumentDocbookToRstConverterOptions' => $vendorDir . '/zetacomponents/document/src/options/converter_docbook_rst.php', + 'ezcDocumentDocbookToRstEmphasisHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/emphasis.php', + 'ezcDocumentDocbookToRstExternalLinkHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/external_link.php', + 'ezcDocumentDocbookToRstFootnoteHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/footnote.php', + 'ezcDocumentDocbookToRstHeadHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/head.php', + 'ezcDocumentDocbookToRstIgnoreHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/ignore.php', + 'ezcDocumentDocbookToRstInlineMediaObjectHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/inlinemediaobject.php', + 'ezcDocumentDocbookToRstInternalLinkHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/internal_link.php', + 'ezcDocumentDocbookToRstItemizedListHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/itemized_list.php', + 'ezcDocumentDocbookToRstLiteralHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/literal.php', + 'ezcDocumentDocbookToRstLiteralLayoutHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/literal_layout.php', + 'ezcDocumentDocbookToRstMediaObjectHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/mediaobject.php', + 'ezcDocumentDocbookToRstOrderedListHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/ordered_list.php', + 'ezcDocumentDocbookToRstParagraphHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/paragraph.php', + 'ezcDocumentDocbookToRstRecurseHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/recurse.php', + 'ezcDocumentDocbookToRstSectionHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/section.php', + 'ezcDocumentDocbookToRstSpecialParagraphHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/special_paragraph.php', + 'ezcDocumentDocbookToRstTableHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/table.php', + 'ezcDocumentDocbookToRstVariableListHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/variable_list.php', + 'ezcDocumentDocbookToWikiBaseHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/wiki/handler.php', + 'ezcDocumentDocbookToWikiBeginPageHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/wiki/begin_page.php', + 'ezcDocumentDocbookToWikiConverter' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook_wiki.php', + 'ezcDocumentDocbookToWikiConverterOptions' => $vendorDir . '/zetacomponents/document/src/options/converter_docbook_wiki.php', + 'ezcDocumentDocbookToWikiEmphasisHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/wiki/emphasis.php', + 'ezcDocumentDocbookToWikiExternalLinkHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/wiki/external_link.php', + 'ezcDocumentDocbookToWikiIgnoreHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/wiki/ignore.php', + 'ezcDocumentDocbookToWikiInlineMediaObjectHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/wiki/inlinemediaobject.php', + 'ezcDocumentDocbookToWikiInternalLinkHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/wiki/internal_link.php', + 'ezcDocumentDocbookToWikiItemizedListHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/wiki/itemized_list.php', + 'ezcDocumentDocbookToWikiLiteralHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/wiki/literal.php', + 'ezcDocumentDocbookToWikiLiteralLayoutHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/wiki/literal_layout.php', + 'ezcDocumentDocbookToWikiMediaObjectHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/wiki/mediaobject.php', + 'ezcDocumentDocbookToWikiOrderedListHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/wiki/ordered_list.php', + 'ezcDocumentDocbookToWikiParagraphHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/wiki/paragraph.php', + 'ezcDocumentDocbookToWikiRecurseHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/wiki/recurse.php', + 'ezcDocumentDocbookToWikiSectionHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/wiki/section.php', + 'ezcDocumentDocbookToWikiTableHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/wiki/table.php', + 'ezcDocumentDokuwikiWiki' => $vendorDir . '/zetacomponents/document/src/document/wiki/dokuwiki.php', + 'ezcDocumentElementVisitorConverter' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor.php', + 'ezcDocumentElementVisitorHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor_handler.php', + 'ezcDocumentErroneousXmlException' => $vendorDir . '/zetacomponents/document/src/exceptions/erroneous_xml.php', + 'ezcDocumentErrorReporting' => $vendorDir . '/zetacomponents/document/src/interfaces/error_reporting.php', + 'ezcDocumentException' => $vendorDir . '/zetacomponents/document/src/exceptions/exception.php', + 'ezcDocumentEzXml' => $vendorDir . '/zetacomponents/document/src/document/xml/ezxml.php', + 'ezcDocumentEzXmlDummyLinkConverter' => $vendorDir . '/zetacomponents/document/src/document/xml/ezxml/dummy_link_converter.php', + 'ezcDocumentEzXmlDummyLinkProvider' => $vendorDir . '/zetacomponents/document/src/document/xml/ezxml/dummy_link_provider.php', + 'ezcDocumentEzXmlLinkConverter' => $vendorDir . '/zetacomponents/document/src/interfaces/ezxml_link_converter.php', + 'ezcDocumentEzXmlLinkProvider' => $vendorDir . '/zetacomponents/document/src/interfaces/ezxml_link_provider.php', + 'ezcDocumentEzXmlOptions' => $vendorDir . '/zetacomponents/document/src/options/document_ezxml.php', + 'ezcDocumentEzXmlToDocbookAnchorHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/ezxml/docbook/anchor.php', + 'ezcDocumentEzXmlToDocbookConverter' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/ezxml_docbook.php', + 'ezcDocumentEzXmlToDocbookConverterOptions' => $vendorDir . '/zetacomponents/document/src/options/converter_ezxml_docbook.php', + 'ezcDocumentEzXmlToDocbookEmphasisHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/ezxml/docbook/emphasis.php', + 'ezcDocumentEzXmlToDocbookHeaderHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/ezxml/docbook/header.php', + 'ezcDocumentEzXmlToDocbookLineHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/ezxml/docbook/line.php', + 'ezcDocumentEzXmlToDocbookLinkHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/ezxml/docbook/link.php', + 'ezcDocumentEzXmlToDocbookListHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/ezxml/docbook/list.php', + 'ezcDocumentEzXmlToDocbookLiteralHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/ezxml/docbook/literal.php', + 'ezcDocumentEzXmlToDocbookMappingHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/ezxml/docbook/mapper.php', + 'ezcDocumentEzXmlToDocbookTableCellHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/ezxml/docbook/table_cell.php', + 'ezcDocumentEzXmlToDocbookTableHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/ezxml/docbook/table.php', + 'ezcDocumentEzXmlToDocbookTableRowHandler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/ezxml/docbook/table_row.php', + 'ezcDocumentHtmlConverterOptions' => $vendorDir . '/zetacomponents/document/src/options/html_rendering.php', + 'ezcDocumentInvalidDocbookException' => $vendorDir . '/zetacomponents/document/src/exceptions/invalid_docbook.php', + 'ezcDocumentInvalidFontException' => $vendorDir . '/zetacomponents/document/src/exceptions/unknown_font.php', + 'ezcDocumentInvalidOdtException' => $vendorDir . '/zetacomponents/document/src/exceptions/invalid_odt.php', + 'ezcDocumentListBulletGuesser' => $vendorDir . '/zetacomponents/document/src/tools/list_bullet_guesser.php', + 'ezcDocumentListItemGenerator' => $vendorDir . '/zetacomponents/document/src/document/pdf/item_generator.php', + 'ezcDocumentLocateable' => $vendorDir . '/zetacomponents/document/src/interfaces/locateable.php', + 'ezcDocumentLocateableDomElement' => $vendorDir . '/zetacomponents/document/src/dom_elements/locateable.php', + 'ezcDocumentMissingVisitorException' => $vendorDir . '/zetacomponents/document/src/exceptions/missing_visitor.php', + 'ezcDocumentNoListItemGenerator' => $vendorDir . '/zetacomponents/document/src/document/pdf/item_generator/no.php', + 'ezcDocumentNumberedListItemGenerator' => $vendorDir . '/zetacomponents/document/src/document/pdf/item_generator/number.php', + 'ezcDocumentOdt' => $vendorDir . '/zetacomponents/document/src/document/xml/odt.php', + 'ezcDocumentOdtBaseFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/odt/filter/base.php', + 'ezcDocumentOdtDefaultPcssConverter' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/converter/default.php', + 'ezcDocumentOdtElementBaseFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/odt/filter/element/base.php', + 'ezcDocumentOdtElementFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/odt/filter/element.php', + 'ezcDocumentOdtElementFootnoteFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/odt/filter/element/footnote.php', + 'ezcDocumentOdtElementFrameFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/odt/filter/element/frame.php', + 'ezcDocumentOdtElementHeaderFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/odt/filter/element/header.php', + 'ezcDocumentOdtElementHtmlTableFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/odt/filter/element/html_table.php', + 'ezcDocumentOdtElementImageFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/odt/filter/element/image.php', + 'ezcDocumentOdtElementLinkFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/odt/filter/element/link.php', + 'ezcDocumentOdtElementListFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/odt/filter/element/list.php', + 'ezcDocumentOdtElementParagraphFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/odt/filter/element/paragraph.php', + 'ezcDocumentOdtElementTableFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/odt/filter/element/table.php', + 'ezcDocumentOdtElementWhitespaceFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/odt/filter/element/whitespace.php', + 'ezcDocumentOdtEmphasisStyleFilterRule' => $vendorDir . '/zetacomponents/document/src/document/xml/odt/filter/style/rule/emphasis.php', + 'ezcDocumentOdtFormattingProperties' => $vendorDir . '/zetacomponents/document/src/document/xml/odt/formatting/properties.php', + 'ezcDocumentOdtFormattingPropertiesExistException' => $vendorDir . '/zetacomponents/document/src/exceptions/odt/formatting_properties_exist.php', + 'ezcDocumentOdtFormattingPropertyCollection' => $vendorDir . '/zetacomponents/document/src/document/xml/odt/formatting/property_collection.php', + 'ezcDocumentOdtImageFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/odt/filter/image.php', + 'ezcDocumentOdtImageLocator' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/image_locator.php', + 'ezcDocumentOdtListLevelStyle' => $vendorDir . '/zetacomponents/document/src/document/xml/odt/list_level_style.php', + 'ezcDocumentOdtListLevelStyleBullet' => $vendorDir . '/zetacomponents/document/src/document/xml/odt/list_level_style/bullet.php', + 'ezcDocumentOdtListLevelStyleFilterRule' => $vendorDir . '/zetacomponents/document/src/document/xml/odt/filter/style/rule/list_level.php', + 'ezcDocumentOdtListLevelStyleNumber' => $vendorDir . '/zetacomponents/document/src/document/xml/odt/list_level_style/number.php', + 'ezcDocumentOdtListStyle' => $vendorDir . '/zetacomponents/document/src/document/xml/odt/list_style.php', + 'ezcDocumentOdtListStyleGenerator' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/generator/list.php', + 'ezcDocumentOdtMetaGenerator' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/meta_generator.php', + 'ezcDocumentOdtOptions' => $vendorDir . '/zetacomponents/document/src/options/document_odt.php', + 'ezcDocumentOdtParagraphStyleGenerator' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/generator/paragraph.php', + 'ezcDocumentOdtPcssBorderConverter' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/converter/border.php', + 'ezcDocumentOdtPcssColorConverter' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/converter/color.php', + 'ezcDocumentOdtPcssConverter' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/converter.php', + 'ezcDocumentOdtPcssConverterManager' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/converter_manager.php', + 'ezcDocumentOdtPcssConverterTools' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/converter_tools.php', + 'ezcDocumentOdtPcssFontConverter' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/converter/font.php', + 'ezcDocumentOdtPcssFontNameConverter' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/converter/font_name.php', + 'ezcDocumentOdtPcssFontSizeConverter' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/converter/font_size.php', + 'ezcDocumentOdtPcssFontStylePreprocessor' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/preprocessor/font.php', + 'ezcDocumentOdtPcssListStylePreprocessor' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/preprocessor/list.php', + 'ezcDocumentOdtPcssMarginConverter' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/converter/margin.php', + 'ezcDocumentOdtPcssParagraphStylePreprocessor' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/preprocessor/paragraph.php', + 'ezcDocumentOdtPcssPreprocessor' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/preprocessor.php', + 'ezcDocumentOdtPcssStyler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss.php', + 'ezcDocumentOdtPcssTextDecorationConverter' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/converter/text_decoration.php', + 'ezcDocumentOdtStyle' => $vendorDir . '/zetacomponents/document/src/document/xml/odt/style.php', + 'ezcDocumentOdtStyleExtractor' => $vendorDir . '/zetacomponents/document/src/document/xml/odt/style/extractor.php', + 'ezcDocumentOdtStyleFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/odt/filter/style.php', + 'ezcDocumentOdtStyleFilterRule' => $vendorDir . '/zetacomponents/document/src/document/xml/odt/filter/style/rule.php', + 'ezcDocumentOdtStyleGenerator' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/generator.php', + 'ezcDocumentOdtStyleInferencer' => $vendorDir . '/zetacomponents/document/src/document/xml/odt/style/inferencer.php', + 'ezcDocumentOdtStyleInformation' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/style_information.php', + 'ezcDocumentOdtStyleListPropertyGenerator' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/property_generator/list.php', + 'ezcDocumentOdtStyleParagraphPropertyGenerator' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/property_generator/paragraph.php', + 'ezcDocumentOdtStyleParser' => $vendorDir . '/zetacomponents/document/src/document/xml/odt/style/parser.php', + 'ezcDocumentOdtStylePropertyGenerator' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/property_generator.php', + 'ezcDocumentOdtStyleTableCellPropertyGenerator' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/property_generator/table_cell.php', + 'ezcDocumentOdtStyleTablePropertyGenerator' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/property_generator/table.php', + 'ezcDocumentOdtStyleTableRowPropertyGenerator' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/property_generator/table_row.php', + 'ezcDocumentOdtStyleTextPropertyGenerator' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/property_generator/text.php', + 'ezcDocumentOdtStyler' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler.php', + 'ezcDocumentOdtTableCellStyleGenerator' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/generator/table_cell.php', + 'ezcDocumentOdtTableRowStyleGenerator' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/generator/table_row.php', + 'ezcDocumentOdtTableStyleGenerator' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/generator/table.php', + 'ezcDocumentOdtTextProcessor' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/text_processor.php', + 'ezcDocumentOdtTextStyleGenerator' => $vendorDir . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/generator/text.php', + 'ezcDocumentOptions' => $vendorDir . '/zetacomponents/document/src/options/document.php', + 'ezcDocumentParser' => $vendorDir . '/zetacomponents/document/src/interfaces/parser.php', + 'ezcDocumentParserException' => $vendorDir . '/zetacomponents/document/src/exceptions/parser.php', + 'ezcDocumentParserOptions' => $vendorDir . '/zetacomponents/document/src/options/document_parser.php', + 'ezcDocumentPcssDeclarationDirective' => $vendorDir . '/zetacomponents/document/src/pcss/declaration_directive.php', + 'ezcDocumentPcssDirective' => $vendorDir . '/zetacomponents/document/src/pcss/directive.php', + 'ezcDocumentPcssLayoutDirective' => $vendorDir . '/zetacomponents/document/src/pcss/layout_directive.php', + 'ezcDocumentPcssMeasure' => $vendorDir . '/zetacomponents/document/src/pcss/measure.php', + 'ezcDocumentPcssParser' => $vendorDir . '/zetacomponents/document/src/pcss/parser.php', + 'ezcDocumentPcssStyleBorderBoxValue' => $vendorDir . '/zetacomponents/document/src/pcss/style/border_box_value.php', + 'ezcDocumentPcssStyleBorderValue' => $vendorDir . '/zetacomponents/document/src/pcss/style/border_value.php', + 'ezcDocumentPcssStyleBoxValue' => $vendorDir . '/zetacomponents/document/src/pcss/style/box_value.php', + 'ezcDocumentPcssStyleColorBoxValue' => $vendorDir . '/zetacomponents/document/src/pcss/style/color_box_value.php', + 'ezcDocumentPcssStyleColorValue' => $vendorDir . '/zetacomponents/document/src/pcss/style/color_value.php', + 'ezcDocumentPcssStyleInferencer' => $vendorDir . '/zetacomponents/document/src/pcss/style_inferencer.php', + 'ezcDocumentPcssStyleIntValue' => $vendorDir . '/zetacomponents/document/src/pcss/style/int_value.php', + 'ezcDocumentPcssStyleLineBoxValue' => $vendorDir . '/zetacomponents/document/src/pcss/style/line_box_value.php', + 'ezcDocumentPcssStyleLineValue' => $vendorDir . '/zetacomponents/document/src/pcss/style/line_value.php', + 'ezcDocumentPcssStyleListValue' => $vendorDir . '/zetacomponents/document/src/pcss/style/list_value.php', + 'ezcDocumentPcssStyleMeasureBoxValue' => $vendorDir . '/zetacomponents/document/src/pcss/style/measure_box_value.php', + 'ezcDocumentPcssStyleMeasureValue' => $vendorDir . '/zetacomponents/document/src/pcss/style/measure_value.php', + 'ezcDocumentPcssStyleSrcValue' => $vendorDir . '/zetacomponents/document/src/pcss/style/src_value.php', + 'ezcDocumentPcssStyleStringValue' => $vendorDir . '/zetacomponents/document/src/pcss/style/string_value.php', + 'ezcDocumentPcssStyleValue' => $vendorDir . '/zetacomponents/document/src/pcss/style/value.php', + 'ezcDocumentPdf' => $vendorDir . '/zetacomponents/document/src/document/pdf.php', + 'ezcDocumentPdfBlockRenderer' => $vendorDir . '/zetacomponents/document/src/document/pdf/renderer/block.php', + 'ezcDocumentPdfBlockquoteRenderer' => $vendorDir . '/zetacomponents/document/src/document/pdf/renderer/blockquote.php', + 'ezcDocumentPdfBoundingBox' => $vendorDir . '/zetacomponents/document/src/document/pdf/box.php', + 'ezcDocumentPdfDefaultHyphenator' => $vendorDir . '/zetacomponents/document/src/document/pdf/hyphenator/default.php', + 'ezcDocumentPdfDefaultTableColumnWidthCalculator' => $vendorDir . '/zetacomponents/document/src/document/pdf/default_table_column_width_calculator.php', + 'ezcDocumentPdfDefaultTokenizer' => $vendorDir . '/zetacomponents/document/src/document/pdf/tokenizer/default.php', + 'ezcDocumentPdfDriver' => $vendorDir . '/zetacomponents/document/src/document/pdf/driver.php', + 'ezcDocumentPdfFooterOptions' => $vendorDir . '/zetacomponents/document/src/options/document_pdf_footer.php', + 'ezcDocumentPdfFooterPdfPart' => $vendorDir . '/zetacomponents/document/src/document/pdf/part/footer.php', + 'ezcDocumentPdfHaruDriver' => $vendorDir . '/zetacomponents/document/src/document/pdf/driver/haru.php', + 'ezcDocumentPdfHeaderPdfPart' => $vendorDir . '/zetacomponents/document/src/document/pdf/part/header.php', + 'ezcDocumentPdfHyphenator' => $vendorDir . '/zetacomponents/document/src/document/pdf/hyphenator.php', + 'ezcDocumentPdfImage' => $vendorDir . '/zetacomponents/document/src/document/pdf/image.php', + 'ezcDocumentPdfImageHandler' => $vendorDir . '/zetacomponents/document/src/document/pdf/image/handler.php', + 'ezcDocumentPdfListItemRenderer' => $vendorDir . '/zetacomponents/document/src/document/pdf/renderer/list_item.php', + 'ezcDocumentPdfListRenderer' => $vendorDir . '/zetacomponents/document/src/document/pdf/renderer/list.php', + 'ezcDocumentPdfLiteralBlockRenderer' => $vendorDir . '/zetacomponents/document/src/document/pdf/renderer/literal_block.php', + 'ezcDocumentPdfLiteralTokenizer' => $vendorDir . '/zetacomponents/document/src/document/pdf/tokenizer/literal.php', + 'ezcDocumentPdfMainRenderer' => $vendorDir . '/zetacomponents/document/src/document/pdf/renderer/main.php', + 'ezcDocumentPdfMediaObjectRenderer' => $vendorDir . '/zetacomponents/document/src/document/pdf/renderer/mediaobject.php', + 'ezcDocumentPdfOptions' => $vendorDir . '/zetacomponents/document/src/options/document_pdf.php', + 'ezcDocumentPdfPage' => $vendorDir . '/zetacomponents/document/src/document/pdf/page.php', + 'ezcDocumentPdfPart' => $vendorDir . '/zetacomponents/document/src/document/pdf/part.php', + 'ezcDocumentPdfPhpImageHandler' => $vendorDir . '/zetacomponents/document/src/document/pdf/image/php.php', + 'ezcDocumentPdfRenderer' => $vendorDir . '/zetacomponents/document/src/document/pdf/renderer.php', + 'ezcDocumentPdfSvgDriver' => $vendorDir . '/zetacomponents/document/src/document/pdf/driver/svg.php', + 'ezcDocumentPdfTableColumnWidthCalculator' => $vendorDir . '/zetacomponents/document/src/document/pdf/table_column_width_calculator.php', + 'ezcDocumentPdfTableRenderer' => $vendorDir . '/zetacomponents/document/src/document/pdf/renderer/table.php', + 'ezcDocumentPdfTcpdfDriver' => $vendorDir . '/zetacomponents/document/src/document/pdf/driver/tcpdf.php', + 'ezcDocumentPdfTextBlockRenderer' => $vendorDir . '/zetacomponents/document/src/document/pdf/renderer/text_block.php', + 'ezcDocumentPdfTextBoxRenderer' => $vendorDir . '/zetacomponents/document/src/document/pdf/renderer/text_box.php', + 'ezcDocumentPdfTitleRenderer' => $vendorDir . '/zetacomponents/document/src/document/pdf/renderer/title.php', + 'ezcDocumentPdfTokenizer' => $vendorDir . '/zetacomponents/document/src/document/pdf/tokenizer.php', + 'ezcDocumentPdfTransactionalDriverWrapper' => $vendorDir . '/zetacomponents/document/src/document/pdf/driver/wrapper.php', + 'ezcDocumentPdfTransactionalDriverWrapperState' => $vendorDir . '/zetacomponents/document/src/document/pdf/driver/wrapper_state.php', + 'ezcDocumentPdfWrappingTextBoxRenderer' => $vendorDir . '/zetacomponents/document/src/document/pdf/renderer/paragraph.php', + 'ezcDocumentPropertyContainerDomElement' => $vendorDir . '/zetacomponents/document/src/dom_elements/property_container.php', + 'ezcDocumentRomanListItemGenerator' => $vendorDir . '/zetacomponents/document/src/document/pdf/item_generator/roman.php', + 'ezcDocumentRst' => $vendorDir . '/zetacomponents/document/src/document/rst.php', + 'ezcDocumentRstAnonymousLinkNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/link_anonymous.php', + 'ezcDocumentRstAnonymousReferenceNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/anon_reference.php', + 'ezcDocumentRstAttentionDirective' => $vendorDir . '/zetacomponents/document/src/document/rst/directive/attention.php', + 'ezcDocumentRstBlockNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/block.php', + 'ezcDocumentRstBlockquoteAnnotationNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/blockquote_annotation.php', + 'ezcDocumentRstBlockquoteNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/blockquote.php', + 'ezcDocumentRstBulletListListNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/bullet_list_list.php', + 'ezcDocumentRstBulletListNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/bullet_list.php', + 'ezcDocumentRstCommentNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/comment.php', + 'ezcDocumentRstContentsDirective' => $vendorDir . '/zetacomponents/document/src/document/rst/directive/contents.php', + 'ezcDocumentRstDangerDirective' => $vendorDir . '/zetacomponents/document/src/document/rst/directive/danger.php', + 'ezcDocumentRstDefinitionListListNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/definition_list_list.php', + 'ezcDocumentRstDefinitionListNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/definition_list.php', + 'ezcDocumentRstDirective' => $vendorDir . '/zetacomponents/document/src/document/rst/directive.php', + 'ezcDocumentRstDirectiveNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/directive.php', + 'ezcDocumentRstDocbookVisitor' => $vendorDir . '/zetacomponents/document/src/document/rst/visitor/docbook.php', + 'ezcDocumentRstDocumentNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/document.php', + 'ezcDocumentRstEmphasisTextRole' => $vendorDir . '/zetacomponents/document/src/document/rst/role/emphasis.php', + 'ezcDocumentRstEnumeratedListListNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/enumerated_list_list.php', + 'ezcDocumentRstEnumeratedListNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/enumerated_list.php', + 'ezcDocumentRstExternalReferenceNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/link_reference.php', + 'ezcDocumentRstFieldListNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/field_list.php', + 'ezcDocumentRstFigureDirective' => $vendorDir . '/zetacomponents/document/src/document/rst/directive/figure.php', + 'ezcDocumentRstFootnoteNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/footnote.php', + 'ezcDocumentRstImageDirective' => $vendorDir . '/zetacomponents/document/src/document/rst/directive/image.php', + 'ezcDocumentRstIncludeDirective' => $vendorDir . '/zetacomponents/document/src/document/rst/directive/include.php', + 'ezcDocumentRstLineBlockLineNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/line_block_line.php', + 'ezcDocumentRstLineBlockNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/line_block.php', + 'ezcDocumentRstLinkNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/link.php', + 'ezcDocumentRstLiteralBlockNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/literal_block.php', + 'ezcDocumentRstLiteralNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/literal.php', + 'ezcDocumentRstLiteralTextRole' => $vendorDir . '/zetacomponents/document/src/document/rst/role/literal.php', + 'ezcDocumentRstMarkupEmphasisNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/markup_emphasis.php', + 'ezcDocumentRstMarkupInlineLiteralNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/markup_inline_literal.php', + 'ezcDocumentRstMarkupInterpretedTextNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/markup_interpreted_text.php', + 'ezcDocumentRstMarkupNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/markup.php', + 'ezcDocumentRstMarkupStrongEmphasisNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/markup_strong_emphasis.php', + 'ezcDocumentRstMarkupSubstitutionNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/markup_substitution.php', + 'ezcDocumentRstMissingDirectiveHandlerException' => $vendorDir . '/zetacomponents/document/src/exceptions/missing_directive_handler.php', + 'ezcDocumentRstMissingTextRoleHandlerException' => $vendorDir . '/zetacomponents/document/src/exceptions/missing_text_role_handler.php', + 'ezcDocumentRstNamedReferenceNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/named_reference.php', + 'ezcDocumentRstNode' => $vendorDir . '/zetacomponents/document/src/document/rst/node.php', + 'ezcDocumentRstNoteDirective' => $vendorDir . '/zetacomponents/document/src/document/rst/directive/note.php', + 'ezcDocumentRstNoticeDirective' => $vendorDir . '/zetacomponents/document/src/document/rst/directive/notice.php', + 'ezcDocumentRstOptions' => $vendorDir . '/zetacomponents/document/src/options/document_rst.php', + 'ezcDocumentRstParagraphNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/paragraph.php', + 'ezcDocumentRstParser' => $vendorDir . '/zetacomponents/document/src/document/rst/parser.php', + 'ezcDocumentRstReferenceNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/reference.php', + 'ezcDocumentRstSectionNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/section.php', + 'ezcDocumentRstStack' => $vendorDir . '/zetacomponents/document/src/document/rst/document_stack.php', + 'ezcDocumentRstStrongTextRole' => $vendorDir . '/zetacomponents/document/src/document/rst/role/strong.php', + 'ezcDocumentRstSubscriptTextRole' => $vendorDir . '/zetacomponents/document/src/document/rst/role/subscript.php', + 'ezcDocumentRstSubstitutionNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/substitution.php', + 'ezcDocumentRstSuperscriptTextRole' => $vendorDir . '/zetacomponents/document/src/document/rst/role/superscript.php', + 'ezcDocumentRstTableBodyNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/table_body.php', + 'ezcDocumentRstTableCellNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/table_cell.php', + 'ezcDocumentRstTableHeadNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/table_head.php', + 'ezcDocumentRstTableNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/table.php', + 'ezcDocumentRstTableRowNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/table_row.php', + 'ezcDocumentRstTargetNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/target.php', + 'ezcDocumentRstTextLineNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/text_line.php', + 'ezcDocumentRstTextRole' => $vendorDir . '/zetacomponents/document/src/document/rst/role.php', + 'ezcDocumentRstTitleNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/title.php', + 'ezcDocumentRstTitleReferenceTextRole' => $vendorDir . '/zetacomponents/document/src/document/rst/role/title_reference.php', + 'ezcDocumentRstToken' => $vendorDir . '/zetacomponents/document/src/document/rst/token.php', + 'ezcDocumentRstTokenizer' => $vendorDir . '/zetacomponents/document/src/document/rst/tokenizer.php', + 'ezcDocumentRstTokenizerException' => $vendorDir . '/zetacomponents/document/src/exceptions/rst_tokenizer.php', + 'ezcDocumentRstTransitionNode' => $vendorDir . '/zetacomponents/document/src/document/rst/nodes/transition.php', + 'ezcDocumentRstVisitor' => $vendorDir . '/zetacomponents/document/src/document/rst/visitor.php', + 'ezcDocumentRstWarningDirective' => $vendorDir . '/zetacomponents/document/src/document/rst/directive/warning.php', + 'ezcDocumentRstXhtmlBodyVisitor' => $vendorDir . '/zetacomponents/document/src/document/rst/visitor/xhtml_body.php', + 'ezcDocumentRstXhtmlDirective' => $vendorDir . '/zetacomponents/document/src/interfaces/rst_xhtml_directive.php', + 'ezcDocumentRstXhtmlTextRole' => $vendorDir . '/zetacomponents/document/src/interfaces/rst_xhtml_role.php', + 'ezcDocumentRstXhtmlVisitor' => $vendorDir . '/zetacomponents/document/src/document/rst/visitor/xhtml.php', + 'ezcDocumentValidation' => $vendorDir . '/zetacomponents/document/src/interfaces/validation.php', + 'ezcDocumentValidationError' => $vendorDir . '/zetacomponents/document/src/validation_error.php', + 'ezcDocumentVisitException' => $vendorDir . '/zetacomponents/document/src/exceptions/visitor.php', + 'ezcDocumentWiki' => $vendorDir . '/zetacomponents/document/src/document/wiki.php', + 'ezcDocumentWikiBlockLevelNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/block.php', + 'ezcDocumentWikiBlockMarkupToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/block_markup.php', + 'ezcDocumentWikiBlockquoteNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/blockquote.php', + 'ezcDocumentWikiBoldNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/bold.php', + 'ezcDocumentWikiBoldToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/bold.php', + 'ezcDocumentWikiBulletListItemNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/bullet_list_item.php', + 'ezcDocumentWikiBulletListItemToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/bullet_list.php', + 'ezcDocumentWikiBulletListNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/bullet_list.php', + 'ezcDocumentWikiCodePlugin' => $vendorDir . '/zetacomponents/document/src/document/wiki/plugin/code.php', + 'ezcDocumentWikiConfluenceLinkStartToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/confluence_link_start.php', + 'ezcDocumentWikiConfluenceTokenizer' => $vendorDir . '/zetacomponents/document/src/document/wiki/tokenizer/confluence.php', + 'ezcDocumentWikiCreoleTokenizer' => $vendorDir . '/zetacomponents/document/src/document/wiki/tokenizer/creole.php', + 'ezcDocumentWikiDefinitionListItemToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/definition_list.php', + 'ezcDocumentWikiDeletedNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/deleted.php', + 'ezcDocumentWikiDeletedToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/deleted.php', + 'ezcDocumentWikiDocbookVisitor' => $vendorDir . '/zetacomponents/document/src/document/wiki/visitor/docbook.php', + 'ezcDocumentWikiDocumentNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/document.php', + 'ezcDocumentWikiDokuwikiTokenizer' => $vendorDir . '/zetacomponents/document/src/document/wiki/tokenizer/dokuwiki.php', + 'ezcDocumentWikiEndOfFileToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/end_of_file.php', + 'ezcDocumentWikiEnumeratedListItemNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/enumerated_list_item.php', + 'ezcDocumentWikiEnumeratedListItemToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/enumerated_list.php', + 'ezcDocumentWikiEnumeratedListNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/enumerated_list.php', + 'ezcDocumentWikiEscapeCharacterToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/escape_character.php', + 'ezcDocumentWikiExternalLinkNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/external_link.php', + 'ezcDocumentWikiExternalLinkToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/external_link.php', + 'ezcDocumentWikiFootnoteEndNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/footnote_end.php', + 'ezcDocumentWikiFootnoteEndToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/footnote_end.php', + 'ezcDocumentWikiFootnoteNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/footnote.php', + 'ezcDocumentWikiFootnoteStartToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/footnote_start.php', + 'ezcDocumentWikiImageEndNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/image_end.php', + 'ezcDocumentWikiImageEndToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/image_end.php', + 'ezcDocumentWikiImageNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/image.php', + 'ezcDocumentWikiImageStartToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/image_start.php', + 'ezcDocumentWikiInlineLiteralNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/inline_literal.php', + 'ezcDocumentWikiInlineLiteralToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/inline_literal.php', + 'ezcDocumentWikiInlineMarkupToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/inline_markup.php', + 'ezcDocumentWikiInlineNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/inline.php', + 'ezcDocumentWikiInlineQuoteNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/inline_quote.php', + 'ezcDocumentWikiInlineQuoteToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/inline_quote.php', + 'ezcDocumentWikiInterWikiLinkNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/inter_wiki_link.php', + 'ezcDocumentWikiInterWikiLinkToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/inter_wiki_link.php', + 'ezcDocumentWikiInternalLinkNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/internal_link.php', + 'ezcDocumentWikiInternalLinkToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/internal_link.php', + 'ezcDocumentWikiInvisibleBreakNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/invisible_break.php', + 'ezcDocumentWikiItalicNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/italic.php', + 'ezcDocumentWikiItalicToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/italic.php', + 'ezcDocumentWikiLineBreakNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/line_break.php', + 'ezcDocumentWikiLineBreakToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/line_break.php', + 'ezcDocumentWikiLineLevelNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/line.php', + 'ezcDocumentWikiLineMarkupToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/line_markup.php', + 'ezcDocumentWikiLinkEndNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/link_end.php', + 'ezcDocumentWikiLinkEndToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/link_end.php', + 'ezcDocumentWikiLinkNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/link.php', + 'ezcDocumentWikiLinkStartToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/link_start.php', + 'ezcDocumentWikiListNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/list.php', + 'ezcDocumentWikiLiteralBlockNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/literal_block.php', + 'ezcDocumentWikiLiteralBlockToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/literal_block.php', + 'ezcDocumentWikiLiteralLineToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/literal_line.php', + 'ezcDocumentWikiMatchingInlineNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/matching_inline.php', + 'ezcDocumentWikiMediawikiEmphasisToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/mediawiki_emphasis.php', + 'ezcDocumentWikiMediawikiTokenizer' => $vendorDir . '/zetacomponents/document/src/document/wiki/tokenizer/mediawiki.php', + 'ezcDocumentWikiMissingPluginHandlerException' => $vendorDir . '/zetacomponents/document/src/exceptions/missing_plugin_handler.php', + 'ezcDocumentWikiMonospaceNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/monospace.php', + 'ezcDocumentWikiMonospaceToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/monospace.php', + 'ezcDocumentWikiNewLineToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/new_line.php', + 'ezcDocumentWikiNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/node.php', + 'ezcDocumentWikiOptions' => $vendorDir . '/zetacomponents/document/src/options/document_wiki.php', + 'ezcDocumentWikiPageBreakNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/page_break.php', + 'ezcDocumentWikiPageBreakToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/page_break.php', + 'ezcDocumentWikiParagraphIndentationToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/indentation.php', + 'ezcDocumentWikiParagraphNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/paragraph.php', + 'ezcDocumentWikiParser' => $vendorDir . '/zetacomponents/document/src/document/wiki/parser.php', + 'ezcDocumentWikiPlugin' => $vendorDir . '/zetacomponents/document/src/document/wiki/plugin.php', + 'ezcDocumentWikiPluginNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/plugin.php', + 'ezcDocumentWikiPluginToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/plugin.php', + 'ezcDocumentWikiQuoteToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/quote.php', + 'ezcDocumentWikiSectionNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/section.php', + 'ezcDocumentWikiSeparatorNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/separator.php', + 'ezcDocumentWikiSeparatorToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/separator.php', + 'ezcDocumentWikiSpecialCharsToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/special_chars.php', + 'ezcDocumentWikiStrikeToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/strike.php', + 'ezcDocumentWikiSubscriptNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/subscript.php', + 'ezcDocumentWikiSubscriptToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/subscript.php', + 'ezcDocumentWikiSuperscriptNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/superscript.php', + 'ezcDocumentWikiSuperscriptToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/superscript.php', + 'ezcDocumentWikiTableCellNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/table_cell.php', + 'ezcDocumentWikiTableHeaderSeparatorNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/table_header_separator.php', + 'ezcDocumentWikiTableHeaderToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/table_header.php', + 'ezcDocumentWikiTableNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/table.php', + 'ezcDocumentWikiTableRowNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/table_row.php', + 'ezcDocumentWikiTableRowToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/table_row.php', + 'ezcDocumentWikiTextLineToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/text_line.php', + 'ezcDocumentWikiTextNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/text.php', + 'ezcDocumentWikiTitleNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/title.php', + 'ezcDocumentWikiTitleToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/title.php', + 'ezcDocumentWikiToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token.php', + 'ezcDocumentWikiTokenizer' => $vendorDir . '/zetacomponents/document/src/document/wiki/tokenizer.php', + 'ezcDocumentWikiTokenizerException' => $vendorDir . '/zetacomponents/document/src/exceptions/wiki_tokenizer.php', + 'ezcDocumentWikiUnderlineNode' => $vendorDir . '/zetacomponents/document/src/document/wiki/nodes/underline.php', + 'ezcDocumentWikiUnderlineToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/underline.php', + 'ezcDocumentWikiVisitor' => $vendorDir . '/zetacomponents/document/src/document/wiki/visitor.php', + 'ezcDocumentWikiWhitespaceToken' => $vendorDir . '/zetacomponents/document/src/document/wiki/token/whitespace.php', + 'ezcDocumentXhtml' => $vendorDir . '/zetacomponents/document/src/document/xml/xhtml.php', + 'ezcDocumentXhtmlBaseFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/xhtml/filter/base.php', + 'ezcDocumentXhtmlBlockquoteElementFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/xhtml/filter/element/blockquote.php', + 'ezcDocumentXhtmlContentLocatorFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/xhtml/filter/content_locator.php', + 'ezcDocumentXhtmlConversion' => $vendorDir . '/zetacomponents/document/src/interfaces/conversions/xhtml.php', + 'ezcDocumentXhtmlDefinitionListElementFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/xhtml/filter/element/definitionlist.php', + 'ezcDocumentXhtmlElementBaseFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/xhtml/filter/element/base.php', + 'ezcDocumentXhtmlElementFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/xhtml/filter/element.php', + 'ezcDocumentXhtmlElementMappingFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/xhtml/filter/element/mapping.php', + 'ezcDocumentXhtmlEnumeratedElementFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/xhtml/filter/element/enumerated.php', + 'ezcDocumentXhtmlFootnoteElementFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/xhtml/filter/element/footnote.php', + 'ezcDocumentXhtmlHeaderElementFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/xhtml/filter/element/header.php', + 'ezcDocumentXhtmlImageElementFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/xhtml/filter/element/image.php', + 'ezcDocumentXhtmlLineBlockElementFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/xhtml/filter/element/lineblock.php', + 'ezcDocumentXhtmlLinkElementFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/xhtml/filter/element/link.php', + 'ezcDocumentXhtmlLiteralElementFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/xhtml/filter/element/literal.php', + 'ezcDocumentXhtmlMetadataFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/xhtml/filter/metadata.php', + 'ezcDocumentXhtmlOptions' => $vendorDir . '/zetacomponents/document/src/options/document_xhtml.php', + 'ezcDocumentXhtmlParagraphElementFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/xhtml/filter/element/paragraph.php', + 'ezcDocumentXhtmlSpecialParagraphElementFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/xhtml/filter/element/special_paragraph.php', + 'ezcDocumentXhtmlStrongElementFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/xhtml/filter/element/strong.php', + 'ezcDocumentXhtmlTableCellElementFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/xhtml/filter/element/tablecell.php', + 'ezcDocumentXhtmlTableElementFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/xhtml/filter/element/table.php', + 'ezcDocumentXhtmlTablesFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/xhtml/filter/tables.php', + 'ezcDocumentXhtmlTextToParagraphFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/xhtml/filter/element/text.php', + 'ezcDocumentXhtmlXpathFilter' => $vendorDir . '/zetacomponents/document/src/document/xml/xhtml/filter/xpath.php', + 'ezcDocumentXmlBase' => $vendorDir . '/zetacomponents/document/src/document/xml_base.php', + 'ezcDocumentXmlOptions' => $vendorDir . '/zetacomponents/document/src/options/document_xml.php', + 'ezcDocumentXsltConverter' => $vendorDir . '/zetacomponents/document/src/converters/xslt.php', + 'ezcDocumentXsltConverterOptions' => $vendorDir . '/zetacomponents/document/src/options/converter_xslt.php', 'phpCAS' => $vendorDir . '/apereo/phpcas/source/CAS.php', + 'phpDocumentor\\Application' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Application.php', + 'phpDocumentor\\Bootstrap' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Bootstrap.php', + 'phpDocumentor\\Command\\Command' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Command/Command.php', + 'phpDocumentor\\Command\\Helper\\ConfigurationHelper' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Command/Helper/ConfigurationHelper.php', + 'phpDocumentor\\Command\\Helper\\LoggerHelper' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Command/Helper/LoggerHelper.php', + 'phpDocumentor\\Command\\Phar\\UpdateCommand' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Command/Phar/UpdateCommand.php', + 'phpDocumentor\\Command\\Project\\RunCommand' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Command/Project/RunCommand.php', + 'phpDocumentor\\Compiler\\Compiler' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Compiler/Compiler.php', + 'phpDocumentor\\Compiler\\CompilerPassInterface' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Compiler/CompilerPassInterface.php', + 'phpDocumentor\\Compiler\\Linker\\Linker' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Compiler/Linker/Linker.php', + 'phpDocumentor\\Compiler\\Pass\\Debug' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Compiler/Pass/Debug.php', + 'phpDocumentor\\Compiler\\Pass\\ElementsIndexBuilder' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Compiler/Pass/ElementsIndexBuilder.php', + 'phpDocumentor\\Compiler\\Pass\\ExampleTagsEnricher' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Compiler/Pass/ExampleTagsEnricher.php', + 'phpDocumentor\\Compiler\\Pass\\MarkerFromTagsExtractor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Compiler/Pass/MarkerFromTagsExtractor.php', + 'phpDocumentor\\Compiler\\Pass\\NamespaceTreeBuilder' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Compiler/Pass/NamespaceTreeBuilder.php', + 'phpDocumentor\\Compiler\\Pass\\PackageTreeBuilder' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Compiler/Pass/PackageTreeBuilder.php', + 'phpDocumentor\\Compiler\\Pass\\ResolveInlineLinkAndSeeTags' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Compiler/Pass/ResolveInlineLinkAndSeeTags.php', + 'phpDocumentor\\Configuration' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Configuration.php', + 'phpDocumentor\\Configuration\\Loader' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Configuration/Loader.php', + 'phpDocumentor\\Configuration\\Logging' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Configuration/Logging.php', + 'phpDocumentor\\Configuration\\Merger' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Configuration/Merger.php', + 'phpDocumentor\\Configuration\\Merger\\Annotation\\Replace' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Configuration/Merger/Annotation/Replace.php', + 'phpDocumentor\\Configuration\\ServiceProvider' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Configuration/ServiceProvider.php', + 'phpDocumentor\\Console\\Input\\ArgvInput' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Console/Input/ArgvInput.php', + 'phpDocumentor\\Console\\Output\\Output' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Console/Output/Output.php', + 'phpDocumentor\\Descriptor\\ArgumentDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/ArgumentDescriptor.php', + 'phpDocumentor\\Descriptor\\Builder\\AssemblerAbstract' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/AssemblerAbstract.php', + 'phpDocumentor\\Descriptor\\Builder\\AssemblerFactory' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/AssemblerFactory.php', + 'phpDocumentor\\Descriptor\\Builder\\AssemblerInterface' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/AssemblerInterface.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\ArgumentAssembler' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/ArgumentAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\AssemblerAbstract' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/AssemblerAbstract.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\ClassAssembler' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/ClassAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\ConstantAssembler' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/ConstantAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\FileAssembler' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/FileAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\FunctionAssembler' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/FunctionAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\InterfaceAssembler' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/InterfaceAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\MethodAssembler' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/MethodAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\PropertyAssembler' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/PropertyAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\Tags\\AuthorAssembler' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/Tags/AuthorAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\Tags\\DeprecatedAssembler' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/Tags/DeprecatedAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\Tags\\ExampleAssembler' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/Tags/ExampleAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\Tags\\GenericTagAssembler' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/Tags/GenericTagAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\Tags\\LinkAssembler' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/Tags/LinkAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\Tags\\MethodAssembler' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/Tags/MethodAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\Tags\\ParamAssembler' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/Tags/ParamAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\Tags\\PropertyAssembler' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/Tags/PropertyAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\Tags\\ReturnAssembler' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/Tags/ReturnAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\Tags\\SeeAssembler' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/Tags/SeeAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\Tags\\SinceAssembler' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/Tags/SinceAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\Tags\\ThrowsAssembler' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/Tags/ThrowsAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\Tags\\TypeCollectionAssembler' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/Tags/TypeCollectionAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\Tags\\UsesAssembler' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/Tags/UsesAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\Tags\\VarAssembler' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/Tags/VarAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\Tags\\VersionAssembler' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/Tags/VersionAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\TraitAssembler' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/TraitAssembler.php', + 'phpDocumentor\\Descriptor\\Cache\\ProjectDescriptorMapper' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Cache/ProjectDescriptorMapper.php', + 'phpDocumentor\\Descriptor\\ClassDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/ClassDescriptor.php', + 'phpDocumentor\\Descriptor\\Collection' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Collection.php', + 'phpDocumentor\\Descriptor\\ConstantDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/ConstantDescriptor.php', + 'phpDocumentor\\Descriptor\\DescriptorAbstract' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/DescriptorAbstract.php', + 'phpDocumentor\\Descriptor\\Example\\Finder' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Example/Finder.php', + 'phpDocumentor\\Descriptor\\Exception\\MissingDependencyException' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Exception/MissingDependencyException.php', + 'phpDocumentor\\Descriptor\\FileDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/FileDescriptor.php', + 'phpDocumentor\\Descriptor\\Filter\\ClassFactory' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Filter/ClassFactory.php', + 'phpDocumentor\\Descriptor\\Filter\\Filter' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Filter/Filter.php', + 'phpDocumentor\\Descriptor\\Filter\\Filterable' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Filter/Filterable.php', + 'phpDocumentor\\Descriptor\\Filter\\StripIgnore' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Filter/StripIgnore.php', + 'phpDocumentor\\Descriptor\\Filter\\StripInternal' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Filter/StripInternal.php', + 'phpDocumentor\\Descriptor\\Filter\\StripOnVisibility' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Filter/StripOnVisibility.php', + 'phpDocumentor\\Descriptor\\FunctionDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/FunctionDescriptor.php', + 'phpDocumentor\\Descriptor\\InterfaceDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/InterfaceDescriptor.php', + 'phpDocumentor\\Descriptor\\Interfaces\\ArgumentInterface' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Interfaces/ArgumentInterface.php', + 'phpDocumentor\\Descriptor\\Interfaces\\ChildInterface' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Interfaces/ChildInterface.php', + 'phpDocumentor\\Descriptor\\Interfaces\\ClassInterface' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Interfaces/ClassInterface.php', + 'phpDocumentor\\Descriptor\\Interfaces\\ConstantInterface' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Interfaces/ConstantInterface.php', + 'phpDocumentor\\Descriptor\\Interfaces\\ContainerInterface' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Interfaces/ContainerInterface.php', + 'phpDocumentor\\Descriptor\\Interfaces\\ElementInterface' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Interfaces/ElementInterface.php', + 'phpDocumentor\\Descriptor\\Interfaces\\FileInterface' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Interfaces/FileInterface.php', + 'phpDocumentor\\Descriptor\\Interfaces\\FunctionInterface' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Interfaces/FunctionInterface.php', + 'phpDocumentor\\Descriptor\\Interfaces\\InterfaceInterface' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Interfaces/InterfaceInterface.php', + 'phpDocumentor\\Descriptor\\Interfaces\\MethodInterface' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Interfaces/MethodInterface.php', + 'phpDocumentor\\Descriptor\\Interfaces\\NamespaceInterface' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Interfaces/NamespaceInterface.php', + 'phpDocumentor\\Descriptor\\Interfaces\\PackageInterface' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Interfaces/PackageInterface.php', + 'phpDocumentor\\Descriptor\\Interfaces\\ProjectInterface' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Interfaces/ProjectInterface.php', + 'phpDocumentor\\Descriptor\\Interfaces\\PropertyInterface' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Interfaces/PropertyInterface.php', + 'phpDocumentor\\Descriptor\\Interfaces\\TraitInterface' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Interfaces/TraitInterface.php', + 'phpDocumentor\\Descriptor\\Interfaces\\TypeInterface' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Interfaces/TypeInterface.php', + 'phpDocumentor\\Descriptor\\Interfaces\\VisibilityInterface' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Interfaces/VisibilityInterface.php', + 'phpDocumentor\\Descriptor\\MethodDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/MethodDescriptor.php', + 'phpDocumentor\\Descriptor\\NamespaceDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/NamespaceDescriptor.php', + 'phpDocumentor\\Descriptor\\PackageDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/PackageDescriptor.php', + 'phpDocumentor\\Descriptor\\ProjectAnalyzer' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/ProjectAnalyzer.php', + 'phpDocumentor\\Descriptor\\ProjectDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/ProjectDescriptor.php', + 'phpDocumentor\\Descriptor\\ProjectDescriptorBuilder' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/ProjectDescriptorBuilder.php', + 'phpDocumentor\\Descriptor\\ProjectDescriptor\\Settings' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/ProjectDescriptor/Settings.php', + 'phpDocumentor\\Descriptor\\PropertyDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/PropertyDescriptor.php', + 'phpDocumentor\\Descriptor\\ServiceProvider' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/ServiceProvider.php', + 'phpDocumentor\\Descriptor\\TagDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/TagDescriptor.php', + 'phpDocumentor\\Descriptor\\Tag\\AuthorDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Tag/AuthorDescriptor.php', + 'phpDocumentor\\Descriptor\\Tag\\BaseTypes\\TypedAbstract' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Tag/BaseTypes/TypedAbstract.php', + 'phpDocumentor\\Descriptor\\Tag\\BaseTypes\\TypedVariableAbstract' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Tag/BaseTypes/TypedVariableAbstract.php', + 'phpDocumentor\\Descriptor\\Tag\\DeprecatedDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Tag/DeprecatedDescriptor.php', + 'phpDocumentor\\Descriptor\\Tag\\ExampleDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Tag/ExampleDescriptor.php', + 'phpDocumentor\\Descriptor\\Tag\\LinkDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Tag/LinkDescriptor.php', + 'phpDocumentor\\Descriptor\\Tag\\MethodDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Tag/MethodDescriptor.php', + 'phpDocumentor\\Descriptor\\Tag\\ParamDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Tag/ParamDescriptor.php', + 'phpDocumentor\\Descriptor\\Tag\\PropertyDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Tag/PropertyDescriptor.php', + 'phpDocumentor\\Descriptor\\Tag\\ReturnDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Tag/ReturnDescriptor.php', + 'phpDocumentor\\Descriptor\\Tag\\SeeDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Tag/SeeDescriptor.php', + 'phpDocumentor\\Descriptor\\Tag\\SinceDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Tag/SinceDescriptor.php', + 'phpDocumentor\\Descriptor\\Tag\\ThrowsDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Tag/ThrowsDescriptor.php', + 'phpDocumentor\\Descriptor\\Tag\\UsesDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Tag/UsesDescriptor.php', + 'phpDocumentor\\Descriptor\\Tag\\VarDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Tag/VarDescriptor.php', + 'phpDocumentor\\Descriptor\\Tag\\VersionDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Tag/VersionDescriptor.php', + 'phpDocumentor\\Descriptor\\TraitDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/TraitDescriptor.php', + 'phpDocumentor\\Descriptor\\Type\\BooleanDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Type/BooleanDescriptor.php', + 'phpDocumentor\\Descriptor\\Type\\CollectionDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Type/CollectionDescriptor.php', + 'phpDocumentor\\Descriptor\\Type\\FloatDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Type/FloatDescriptor.php', + 'phpDocumentor\\Descriptor\\Type\\IntegerDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Type/IntegerDescriptor.php', + 'phpDocumentor\\Descriptor\\Type\\StringDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Type/StringDescriptor.php', + 'phpDocumentor\\Descriptor\\Type\\UnknownTypeDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Type/UnknownTypeDescriptor.php', + 'phpDocumentor\\Descriptor\\Validator\\Error' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Validator/Error.php', + 'phpDocumentor\\Event\\DebugEvent' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Event/DebugEvent.php', + 'phpDocumentor\\Event\\Dispatcher' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Event/Dispatcher.php', + 'phpDocumentor\\Event\\EventAbstract' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Event/EventAbstract.php', + 'phpDocumentor\\Event\\LogEvent' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Event/LogEvent.php', + 'phpDocumentor\\Fileset\\Collection' => $vendorDir . '/phpdocumentor/fileset/src/phpDocumentor/Fileset/Collection.php', + 'phpDocumentor\\Fileset\\CollectionTest' => $vendorDir . '/phpdocumentor/fileset/tests/unit/phpDocumentor/Fileset/CollectionTest.php', + 'phpDocumentor\\Fileset\\Collection\\IgnorePatterns' => $vendorDir . '/phpdocumentor/fileset/src/phpDocumentor/Fileset/Collection/IgnorePatterns.php', + 'phpDocumentor\\Fileset\\Collection\\IgnorePatternsTest' => $vendorDir . '/phpdocumentor/fileset/tests/unit/phpDocumentor/Fileset/Collection/IgnorePatternsTest.php', + 'phpDocumentor\\Fileset\\File' => $vendorDir . '/phpdocumentor/fileset/src/phpDocumentor/Fileset/File.php', + 'phpDocumentor\\Fileset\\FileTest' => $vendorDir . '/phpdocumentor/fileset/tests/unit/phpDocumentor/Fileset/FileTest.php', + 'phpDocumentor\\GraphViz\\Attribute' => $vendorDir . '/phpdocumentor/graphviz/src/phpDocumentor/GraphViz/Attribute.php', + 'phpDocumentor\\GraphViz\\Edge' => $vendorDir . '/phpdocumentor/graphviz/src/phpDocumentor/GraphViz/Edge.php', + 'phpDocumentor\\GraphViz\\Exception' => $vendorDir . '/phpdocumentor/graphviz/src/phpDocumentor/GraphViz/Exception.php', + 'phpDocumentor\\GraphViz\\Graph' => $vendorDir . '/phpdocumentor/graphviz/src/phpDocumentor/GraphViz/Graph.php', + 'phpDocumentor\\GraphViz\\Node' => $vendorDir . '/phpdocumentor/graphviz/src/phpDocumentor/GraphViz/Node.php', + 'phpDocumentor\\Parser\\Command\\Project\\ParseCommand' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Parser/Command/Project/ParseCommand.php', + 'phpDocumentor\\Parser\\Configuration' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Parser/Configuration.php', + 'phpDocumentor\\Parser\\Configuration\\Files' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Parser/Configuration/Files.php', + 'phpDocumentor\\Parser\\Event\\PreFileEvent' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Parser/Event/PreFileEvent.php', + 'phpDocumentor\\Parser\\Exception' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Parser/Exception.php', + 'phpDocumentor\\Parser\\Exception\\FilesNotFoundException' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Parser/Exception/FilesNotFoundException.php', + 'phpDocumentor\\Parser\\Exception\\MissingDependencyException' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Parser/Exception/MissingDependencyException.php', + 'phpDocumentor\\Parser\\File' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Parser/File.php', + 'phpDocumentor\\Parser\\Parser' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Parser/Parser.php', + 'phpDocumentor\\Parser\\ServiceProvider' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Parser/ServiceProvider.php', + 'phpDocumentor\\Parser\\Util\\ParserPopulator' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Parser/Util/ParserPopulator.php', + 'phpDocumentor\\Partials\\Collection' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Partials/Collection.php', + 'phpDocumentor\\Partials\\Exception\\MissingNameForPartialException' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Partials/Exception/MissingNameForPartialException.php', + 'phpDocumentor\\Partials\\Partial' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Partials/Partial.php', + 'phpDocumentor\\Partials\\ServiceProvider' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Partials/ServiceProvider.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Classes\\HasPackageWithSubpackage' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Classes/HasPackageWithSubpackage.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Classes\\HasPackageWithSubpackageValidator' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Classes/HasPackageWithSubpackageValidator.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Classes\\HasSinglePackage' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Classes/HasSinglePackage.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Classes\\HasSinglePackageValidator' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Classes/HasSinglePackageValidator.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Classes\\HasSingleSubpackage' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Classes/HasSingleSubpackage.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Classes\\HasSingleSubpackageValidator' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Classes/HasSingleSubpackageValidator.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Functions\\AreAllArgumentsValid' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Functions/AreAllArgumentsValid.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Functions\\AreAllArgumentsValidValidator' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Functions/AreAllArgumentsValidValidator.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Functions\\DoesArgumentNameMatchParam' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Functions/DoesArgumentNameMatchParam.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Functions\\DoesArgumentNameMatchParamValidator' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Functions/DoesArgumentNameMatchParamValidator.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Functions\\DoesArgumentTypehintMatchParam' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Functions/DoesArgumentTypehintMatchParam.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Functions\\DoesArgumentTypehintMatchParamValidator' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Functions/DoesArgumentTypehintMatchParamValidator.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Functions\\DoesParamsExists' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Functions/DoesParamsExists.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Functions\\DoesParamsExistsValidator' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Functions/DoesParamsExistsValidator.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Functions\\IsArgumentInDocBlock' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Functions/IsArgumentInDocBlock.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Functions\\IsArgumentInDocBlockValidator' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Functions/IsArgumentInDocBlockValidator.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Functions\\IsParamTypeNotAnIdeDefault' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Functions/IsParamTypeNotAnIdeDefault.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Functions\\IsParamTypeNotAnIdeDefaultValidator' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Functions/IsParamTypeNotAnIdeDefaultValidator.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Functions\\IsReturnTypeNotAnIdeDefault' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Functions/IsReturnTypeNotAnIdeDefault.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Functions\\IsReturnTypeNotAnIdeDefaultValidator' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Functions/IsReturnTypeNotAnIdeDefaultValidator.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Property\\HasSummary' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Property/HasSummary.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Property\\HasSummaryValidator' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Property/HasSummaryValidator.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Functions\\AreAllArgumentsValid' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Functions/AreAllArgumentsValid.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\ValidationValueObject' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/ValidationValueObject.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\ValidatorAbstract' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/ValidatorAbstract.php', + 'phpDocumentor\\Plugin\\Core\\Exception' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Exception.php', + 'phpDocumentor\\Plugin\\Core\\ServiceProvider' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/ServiceProvider.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Behaviour\\Tag\\AuthorTag' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Behaviour/Tag/AuthorTag.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Behaviour\\Tag\\CoversTag' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Behaviour/Tag/CoversTag.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Behaviour\\Tag\\IgnoreTag' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Behaviour/Tag/IgnoreTag.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Behaviour\\Tag\\InternalTag' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Behaviour/Tag/InternalTag.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Behaviour\\Tag\\LicenseTag' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Behaviour/Tag/LicenseTag.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Behaviour\\Tag\\MethodTag' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Behaviour/Tag/MethodTag.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Behaviour\\Tag\\ParamTag' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Behaviour/Tag/ParamTag.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Behaviour\\Tag\\PropertyTag' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Behaviour/Tag/PropertyTag.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Behaviour\\Tag\\ReturnTag' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Behaviour/Tag/ReturnTag.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Behaviour\\Tag\\UsesTag' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Behaviour/Tag/UsesTag.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Behaviour\\Tag\\VarTag' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Behaviour/Tag/VarTag.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Writer\\Checkstyle' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Writer/Checkstyle.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Writer\\FileIo' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Writer/FileIo.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Writer\\Pathfinder' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Writer/Pathfinder.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Writer\\Sourcecode' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Writer/Sourcecode.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Writer\\Statistics' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Writer/Statistics.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Writer\\Xml' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Writer/Xml.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Writer\\Xml\\ArgumentConverter' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Writer/Xml/ArgumentConverter.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Writer\\Xml\\ConstantConverter' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Writer/Xml/ConstantConverter.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Writer\\Xml\\DocBlockConverter' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Writer/Xml/DocBlockConverter.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Writer\\Xml\\InterfaceConverter' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Writer/Xml/InterfaceConverter.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Writer\\Xml\\MethodConverter' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Writer/Xml/MethodConverter.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Writer\\Xml\\PropertyConverter' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Writer/Xml/PropertyConverter.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Writer\\Xml\\TagConverter' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Writer/Xml/TagConverter.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Writer\\Xml\\TraitConverter' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Writer/Xml/TraitConverter.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Writer\\Xsl' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Writer/Xsl.php', + 'phpDocumentor\\Plugin\\Core\\Xslt\\Extension' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Xslt/Extension.php', + 'phpDocumentor\\Plugin\\Graphs\\ServiceProvider' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Graphs/ServiceProvider.php', + 'phpDocumentor\\Plugin\\Graphs\\Writer\\Graph' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Graphs/Writer/Graph.php', + 'phpDocumentor\\Plugin\\LegacyNamespaceConverter\\LegacyNamespaceFilter' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/LegacyNamespaceConverter/LegacyNamespaceFilter.php', + 'phpDocumentor\\Plugin\\LegacyNamespaceConverter\\ServiceProvider' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/LegacyNamespaceConverter/ServiceProvider.php', + 'phpDocumentor\\Plugin\\LegacyNamespaceConverter\\Tests\\LegacyNamespaceFilterTest' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/LegacyNamespaceConverter/Tests/LegacyNamespaceFilterTest.php', + 'phpDocumentor\\Plugin\\Parameter' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Parameter.php', + 'phpDocumentor\\Plugin\\Plugin' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Plugin.php', + 'phpDocumentor\\Plugin\\Scrybe\\Command\\Manual\\BaseConvertCommand' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Command/Manual/BaseConvertCommand.php', + 'phpDocumentor\\Plugin\\Scrybe\\Command\\Manual\\ToHtmlCommand' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Command/Manual/ToHtmlCommand.php', + 'phpDocumentor\\Plugin\\Scrybe\\Command\\Manual\\ToLatexCommand' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Command/Manual/ToLatexCommand.php', + 'phpDocumentor\\Plugin\\Scrybe\\Command\\Manual\\ToPdfCommand' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Command/Manual/ToPdfCommand.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\BaseConverter' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/BaseConverter.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\ConverterInterface' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/ConverterInterface.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\Definition\\Definition' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/Definition/Definition.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\Definition\\Factory' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/Definition/Factory.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\Exception\\ConverterNotFoundException' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/Exception/ConverterNotFoundException.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\Factory' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/Factory.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\Format\\Collection' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/Format/Collection.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\Format\\Exception\\FormatNotFoundException' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/Format/Exception/FormatNotFoundException.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\Format\\Format' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/Format/Format.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\Metadata\\Assets' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/Metadata/Assets.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\Metadata\\Glossary' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/Metadata/Glossary.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\Metadata\\TableOfContents' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/Metadata/TableOfContents.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\Metadata\\TableOfContents\\BaseEntry' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/Metadata/TableOfContents/BaseEntry.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\Metadata\\TableOfContents\\File' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/Metadata/TableOfContents/File.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\Metadata\\TableOfContents\\Heading' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/Metadata/TableOfContents/Heading.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\Metadata\\TableOfContents\\Module' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/Metadata/TableOfContents/Module.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\RestructuredText\\Directives\\CodeBlock' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/RestructuredText/Directives/CodeBlock.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\RestructuredText\\Directives\\Figure' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/RestructuredText/Directives/Figure.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\RestructuredText\\Directives\\Image' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/RestructuredText/Directives/Image.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\RestructuredText\\Directives\\Toctree' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/RestructuredText/Directives/Toctree.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\RestructuredText\\Document' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/RestructuredText/Document.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\RestructuredText\\Roles\\Doc' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/RestructuredText/Roles/Doc.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\RestructuredText\\ToHtml' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/RestructuredText/ToHtml.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\RestructuredText\\Visitors\\Creator' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/RestructuredText/Visitors/Creator.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\RestructuredText\\Visitors\\Discover' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/RestructuredText/Visitors/Discover.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\ToHtmlInterface' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/ToHtmlInterface.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\ToLatexInterface' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/ToLatexInterface.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\ToPdfInterface' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/ToPdfInterface.php', + 'phpDocumentor\\Plugin\\Scrybe\\ServiceProvider' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/ServiceProvider.php', + 'phpDocumentor\\Plugin\\Scrybe\\Template\\Factory' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Template/Factory.php', + 'phpDocumentor\\Plugin\\Scrybe\\Template\\TemplateInterface' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Template/TemplateInterface.php', + 'phpDocumentor\\Plugin\\Scrybe\\Template\\Twig' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Template/Twig.php', + 'phpDocumentor\\Plugin\\ServiceProvider' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/ServiceProvider.php', + 'phpDocumentor\\Plugin\\Twig\\Extension' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Twig/Extension.php', + 'phpDocumentor\\Plugin\\Twig\\ExtensionInterface' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Twig/ExtensionInterface.php', + 'phpDocumentor\\Plugin\\Twig\\ServiceProvider' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Twig/ServiceProvider.php', + 'phpDocumentor\\Plugin\\Twig\\Writer\\Twig' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Twig/Writer/Twig.php', + 'phpDocumentor\\Reflection\\BaseReflector' => $vendorDir . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/BaseReflector.php', + 'phpDocumentor\\Reflection\\BaseReflectorMock' => $vendorDir . '/phpdocumentor/reflection/tests/mocks/phpDocumentor/Reflection/BaseReflectorMock.php', + 'phpDocumentor\\Reflection\\BaseReflectorTest' => $vendorDir . '/phpdocumentor/reflection/tests/unit/phpDocumentor/Reflection/BaseReflectorTest.php', + 'phpDocumentor\\Reflection\\ClassReflector' => $vendorDir . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/ClassReflector.php', + 'phpDocumentor\\Reflection\\ClassReflectorMock' => $vendorDir . '/phpdocumentor/reflection/tests/mocks/phpDocumentor/Reflection/ClassReflectorMock.php', + 'phpDocumentor\\Reflection\\ClassReflectorTest' => $vendorDir . '/phpdocumentor/reflection/tests/unit/phpDocumentor/Reflection/ClassReflectorTest.php', + 'phpDocumentor\\Reflection\\ClassReflector\\ConstantReflector' => $vendorDir . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/ClassReflector/ConstantReflector.php', + 'phpDocumentor\\Reflection\\ClassReflector\\MethodReflector' => $vendorDir . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/ClassReflector/MethodReflector.php', + 'phpDocumentor\\Reflection\\ClassReflector\\PropertyReflector' => $vendorDir . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/ClassReflector/PropertyReflector.php', + 'phpDocumentor\\Reflection\\ConstantReflector' => $vendorDir . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/ConstantReflector.php', + 'phpDocumentor\\Reflection\\DocBlock' => $vendorDir . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock.php', + 'phpDocumentor\\Reflection\\DocBlock\\Context' => $vendorDir . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Context.php', + 'phpDocumentor\\Reflection\\DocBlock\\Description' => $vendorDir . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Description.php', + 'phpDocumentor\\Reflection\\DocBlock\\Location' => $vendorDir . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Location.php', + 'phpDocumentor\\Reflection\\DocBlock\\Serializer' => $vendorDir . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Serializer.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag\\AuthorTag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/AuthorTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag\\CoversTag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/CoversTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag\\DeprecatedTag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/DeprecatedTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag\\ExampleTag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ExampleTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag\\LinkTag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/LinkTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag\\MethodTag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/MethodTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag\\ParamTag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ParamTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag\\PropertyReadTag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyReadTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag\\PropertyTag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag\\PropertyWriteTag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyWriteTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag\\ReturnTag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ReturnTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag\\SeeTag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SeeTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag\\SinceTag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SinceTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag\\SourceTag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SourceTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag\\ThrowsTag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ThrowsTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag\\UsesTag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/UsesTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag\\VarTag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/VarTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag\\VersionTag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/VersionTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Type\\Collection' => $vendorDir . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Type/Collection.php', + 'phpDocumentor\\Reflection\\Event\\ExportDocBlockTagEvent' => $vendorDir . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/Event/ExportDocBlockTagEvent.php', + 'phpDocumentor\\Reflection\\Event\\PostDocBlockExtractionEvent' => $vendorDir . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/Event/PostDocBlockExtractionEvent.php', + 'phpDocumentor\\Reflection\\Exception' => $vendorDir . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/Exception.php', + 'phpDocumentor\\Reflection\\Exception\\UnparsableFile' => $vendorDir . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/Exception/UnparsableFile.php', + 'phpDocumentor\\Reflection\\Exception\\UnreadableFile' => $vendorDir . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/Exception/UnreadableFile.php', + 'phpDocumentor\\Reflection\\FileReflector' => $vendorDir . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/FileReflector.php', + 'phpDocumentor\\Reflection\\FunctionReflector' => $vendorDir . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/FunctionReflector.php', + 'phpDocumentor\\Reflection\\FunctionReflector\\ArgumentReflector' => $vendorDir . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/FunctionReflector/ArgumentReflector.php', + 'phpDocumentor\\Reflection\\IncludeReflector' => $vendorDir . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/IncludeReflector.php', + 'phpDocumentor\\Reflection\\InterfaceReflector' => $vendorDir . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/InterfaceReflector.php', + 'phpDocumentor\\Reflection\\Lexer' => $vendorDir . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/Lexer.php', + 'phpDocumentor\\Reflection\\NodeExprMock' => $vendorDir . '/phpdocumentor/reflection/tests/mocks/phpDocumentor/Reflection/NodeExprMock.php', + 'phpDocumentor\\Reflection\\NodeStmtMock' => $vendorDir . '/phpdocumentor/reflection/tests/mocks/phpDocumentor/Reflection/NodeStmtMock.php', + 'phpDocumentor\\Reflection\\NodeStmtMock2' => $vendorDir . '/phpdocumentor/reflection/tests/mocks/phpDocumentor/Reflection/NodeStmtMock2.php', + 'phpDocumentor\\Reflection\\PrettyPrinter' => $vendorDir . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/PrettyPrinter.php', + 'phpDocumentor\\Reflection\\PrettyPrinterTest' => $vendorDir . '/phpdocumentor/reflection/tests/unit/phpDocumentor/Reflection/PrettyPrinterTest.php', + 'phpDocumentor\\Reflection\\ReflectionAbstract' => $vendorDir . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/ReflectionAbstract.php', + 'phpDocumentor\\Reflection\\TraitReflector' => $vendorDir . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/TraitReflector.php', + 'phpDocumentor\\Reflection\\Traverser' => $vendorDir . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/Traverser.php', + 'phpDocumentor\\Transformer\\Behaviour\\BehaviourAbstract' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Behaviour/BehaviourAbstract.php', + 'phpDocumentor\\Transformer\\Behaviour\\Collection' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Behaviour/Collection.php', + 'phpDocumentor\\Transformer\\Command\\Project\\TransformCommand' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Command/Project/TransformCommand.php', + 'phpDocumentor\\Transformer\\Command\\Template\\ListCommand' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Command/Template/ListCommand.php', + 'phpDocumentor\\Transformer\\Configuration' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Configuration.php', + 'phpDocumentor\\Transformer\\Configuration\\ExternalClassDocumentation' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Configuration/ExternalClassDocumentation.php', + 'phpDocumentor\\Transformer\\Configuration\\Transformations' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Configuration/Transformations.php', + 'phpDocumentor\\Transformer\\Configuration\\Transformations\\Template' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Configuration/Transformations/Template.php', + 'phpDocumentor\\Transformer\\Event\\PostTransformEvent' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Event/PostTransformEvent.php', + 'phpDocumentor\\Transformer\\Event\\PostTransformationEvent' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Event/PostTransformationEvent.php', + 'phpDocumentor\\Transformer\\Event\\PreTransformEvent' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Event/PreTransformEvent.php', + 'phpDocumentor\\Transformer\\Event\\PreTransformationEvent' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Event/PreTransformationEvent.php', + 'phpDocumentor\\Transformer\\Event\\PreXslWriterEvent' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Event/PreXslWriterEvent.php', + 'phpDocumentor\\Transformer\\Event\\WriterInitializationEvent' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Event/WriterInitializationEvent.php', + 'phpDocumentor\\Transformer\\Exception' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Exception.php', + 'phpDocumentor\\Transformer\\Exception\\MissingDependencyException' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Exception/MissingDependencyException.php', + 'phpDocumentor\\Transformer\\Exception\\UnknownWriter' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Exception/UnknownWriter.php', + 'phpDocumentor\\Transformer\\Router\\ExternalRouter' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Router/ExternalRouter.php', + 'phpDocumentor\\Transformer\\Router\\ForFileProxy' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Router/ForFileProxy.php', + 'phpDocumentor\\Transformer\\Router\\Matcher\\MatcherInterface' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Router/Matcher/MatcherInterface.php', + 'phpDocumentor\\Transformer\\Router\\Queue' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Router/Queue.php', + 'phpDocumentor\\Transformer\\Router\\Renderer' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Router/Renderer.php', + 'phpDocumentor\\Transformer\\Router\\RouterAbstract' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Router/RouterAbstract.php', + 'phpDocumentor\\Transformer\\Router\\Rule' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Router/Rule.php', + 'phpDocumentor\\Transformer\\Router\\StandardRouter' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Router/StandardRouter.php', + 'phpDocumentor\\Transformer\\Router\\UrlGenerator\\Standard\\ClassDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Router/UrlGenerator/Standard/ClassDescriptor.php', + 'phpDocumentor\\Transformer\\Router\\UrlGenerator\\Standard\\ConstantDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Router/UrlGenerator/Standard/ConstantDescriptor.php', + 'phpDocumentor\\Transformer\\Router\\UrlGenerator\\Standard\\FileDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Router/UrlGenerator/Standard/FileDescriptor.php', + 'phpDocumentor\\Transformer\\Router\\UrlGenerator\\Standard\\FunctionDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Router/UrlGenerator/Standard/FunctionDescriptor.php', + 'phpDocumentor\\Transformer\\Router\\UrlGenerator\\Standard\\MethodDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Router/UrlGenerator/Standard/MethodDescriptor.php', + 'phpDocumentor\\Transformer\\Router\\UrlGenerator\\Standard\\NamespaceDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Router/UrlGenerator/Standard/NamespaceDescriptor.php', + 'phpDocumentor\\Transformer\\Router\\UrlGenerator\\Standard\\PackageDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Router/UrlGenerator/Standard/PackageDescriptor.php', + 'phpDocumentor\\Transformer\\Router\\UrlGenerator\\Standard\\PropertyDescriptor' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Router/UrlGenerator/Standard/PropertyDescriptor.php', + 'phpDocumentor\\Transformer\\Router\\UrlGenerator\\Standard\\QualifiedNameToUrlConverter' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Router/UrlGenerator/Standard/QualifiedNameToUrlConverter.php', + 'phpDocumentor\\Transformer\\Router\\UrlGenerator\\UrlGeneratorInterface' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Router/UrlGenerator/UrlGeneratorInterface.php', + 'phpDocumentor\\Transformer\\ServiceProvider' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/ServiceProvider.php', + 'phpDocumentor\\Transformer\\Template' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Template.php', + 'phpDocumentor\\Transformer\\Template\\Collection' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Template/Collection.php', + 'phpDocumentor\\Transformer\\Template\\Factory' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Template/Factory.php', + 'phpDocumentor\\Transformer\\Template\\Parameter' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Template/Parameter.php', + 'phpDocumentor\\Transformer\\Template\\PathResolver' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Template/PathResolver.php', + 'phpDocumentor\\Transformer\\Transformation' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Transformation.php', + 'phpDocumentor\\Transformer\\Transformer' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Transformer.php', + 'phpDocumentor\\Transformer\\Writer\\Collection' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Writer/Collection.php', + 'phpDocumentor\\Transformer\\Writer\\Exception\\RequirementMissing' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Writer/Exception/RequirementMissing.php', + 'phpDocumentor\\Transformer\\Writer\\Initializable' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Writer/Initializable.php', + 'phpDocumentor\\Transformer\\Writer\\Routable' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Writer/Routable.php', + 'phpDocumentor\\Transformer\\Writer\\Translatable' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Writer/Translatable.php', + 'phpDocumentor\\Transformer\\Writer\\WriterAbstract' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Writer/WriterAbstract.php', + 'phpDocumentor\\Translator\\Configuration' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Translator/Configuration.php', + 'phpDocumentor\\Translator\\ServiceProvider' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Translator/ServiceProvider.php', + 'phpDocumentor\\Translator\\Translator' => $vendorDir . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Translator/Translator.php', 'phpseclib\\Crypt\\AES' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/AES.php', 'phpseclib\\Crypt\\Base' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Base.php', 'phpseclib\\Crypt\\Blowfish' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Blowfish.php', diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php index dc13f99af1..bf39574325 100644 --- a/vendor/composer/autoload_files.php +++ b/vendor/composer/autoload_files.php @@ -6,11 +6,21 @@ $vendorDir = dirname(dirname(__FILE__)); $baseDir = dirname($vendorDir); return array( + '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php', + '10a6847eba8a430a134fad89f4a30a26' => $vendorDir . '/zendframework/zend-cache/autoload/patternPluginManagerPolyfill.php', + '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', 'e88992873b7765f9b5710cab95ba5dd7' => $vendorDir . '/hoa/consistency/Prelude.php', + 'fe1bcd0336136e435eaf197895daf81a' => $vendorDir . '/nikic/php-parser/lib/bootstrap.php', + 'd9d39f82a605ebe5918f683dd402334c' => $vendorDir . '/padraic/humbug_get_contents/src/function.php', + '3a50d90d85c7fe889a94ae1114b921ce' => $vendorDir . '/padraic/humbug_get_contents/src/functions.php', '5255c38a0faeba867671b61dfda6d864' => $vendorDir . '/paragonie/random_compat/lib/random.php', '7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php', + '25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php', 'a0edc8309cc5e1d60e3047b5df6b7052' => $vendorDir . '/guzzlehttp/psr7/src/functions_include.php', + '6124b4c8570aa390c21fafd04a26c69f' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php', + '667aeda72477189d0494fecd327c3641' => $vendorDir . '/symfony/var-dumper/Resources/functions/dump.php', '2cffec82183ee1cea088009cef9a6fc3' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php', '757772e28a0943a9afe83def8db95bdf' => $vendorDir . '/mf2/mf2/Mf2/Parser.php', 'decc78cc4436b1292c6c0d151b19445c' => $vendorDir . '/phpseclib/phpseclib/phpseclib/bootstrap.php', + '801c31d8ed748cfa537fa45402288c95' => $vendorDir . '/psy/psysh/src/functions.php', ); diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php index 4770ac2cfc..e4e17ae006 100644 --- a/vendor/composer/autoload_namespaces.php +++ b/vendor/composer/autoload_namespaces.php @@ -6,6 +6,21 @@ $vendorDir = dirname(dirname(__FILE__)); $baseDir = dirname($vendorDir); return array( + 'phpDocumentor' => array($vendorDir . '/phpdocumentor/fileset/src', $vendorDir . '/phpdocumentor/fileset/tests/unit', $vendorDir . '/phpdocumentor/graphviz/src', $vendorDir . '/phpdocumentor/graphviz/tests/unit', $vendorDir . '/phpdocumentor/phpdocumentor/src', $vendorDir . '/phpdocumentor/phpdocumentor/tests/unit', $vendorDir . '/phpdocumentor/reflection/src', $vendorDir . '/phpdocumentor/reflection/tests/unit', $vendorDir . '/phpdocumentor/reflection/tests/mocks', $vendorDir . '/phpdocumentor/reflection-docblock/src'), + 'Twig_' => array($vendorDir . '/twig/twig/lib'), + 'Pimple' => array($vendorDir . '/pimple/pimple/lib'), + 'PhpCollection' => array($vendorDir . '/phpcollection/phpcollection/src'), + 'Parsedown' => array($vendorDir . '/erusev/parsedown'), + 'Neutron' => array($vendorDir . '/neutron/temporary-filesystem/src'), + 'Metadata\\' => array($vendorDir . '/jms/metadata/src'), + 'JMS\\Serializer' => array($vendorDir . '/jms/serializer/src'), + 'JMS\\' => array($vendorDir . '/jms/parser-lib/src'), 'HTMLPurifier' => array($vendorDir . '/ezyang/htmlpurifier/library'), + 'FFMpeg' => array($vendorDir . '/php-ffmpeg/php-ffmpeg/src'), + 'Evenement' => array($vendorDir . '/evenement/evenement/src'), 'Console' => array($vendorDir . '/pear/console_getopt'), + 'Cilex\\Provider\\Console' => array($vendorDir . '/cilex/console-service-provider/src'), + 'Cilex\\Provider' => array($vendorDir . '/phpdocumentor/phpdocumentor/src'), + 'Cilex' => array($vendorDir . '/cilex/cilex/src'), + 'Alchemy' => array($vendorDir . '/alchemy/binary-driver/src'), ); diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php index ab38f526de..b69e7c58e1 100644 --- a/vendor/composer/autoload_psr4.php +++ b/vendor/composer/autoload_psr4.php @@ -7,18 +7,63 @@ $baseDir = dirname($vendorDir); return array( 'phpseclib\\' => array($vendorDir . '/phpseclib/phpseclib/phpseclib'), + 'Zend\\Stdlib\\' => array($vendorDir . '/zendframework/zend-stdlib/src'), + 'Zend\\ServiceManager\\' => array($vendorDir . '/zendframework/zend-servicemanager/src'), + 'Zend\\Serializer\\' => array($vendorDir . '/zendframework/zend-serializer/src'), + 'Zend\\Json\\' => array($vendorDir . '/zendframework/zend-json/src'), + 'Zend\\I18n\\' => array($vendorDir . '/zendframework/zend-i18n/src'), + 'Zend\\Hydrator\\' => array($vendorDir . '/zendframework/zend-hydrator/src'), + 'Zend\\Filter\\' => array($vendorDir . '/zendframework/zend-filter/src'), + 'Zend\\EventManager\\' => array($vendorDir . '/zendframework/zend-eventmanager/src'), + 'Zend\\Config\\' => array($vendorDir . '/zendframework/zend-config/src'), + 'Zend\\Cache\\' => array($vendorDir . '/zendframework/zend-cache/src'), + 'XdgBaseDir\\' => array($vendorDir . '/dnoegel/php-xdg-base-dir/src'), 'XMPPHP\\' => array($vendorDir . '/diogocomposer/xmpphp/XMPPHP'), + 'Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'), + 'Twig\\' => array($vendorDir . '/twig/twig/src'), + '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\\Component\\VarDumper\\' => array($vendorDir . '/symfony/var-dumper'), + 'Symfony\\Component\\Validator\\' => array($vendorDir . '/symfony/validator'), + 'Symfony\\Component\\Translation\\' => array($vendorDir . '/symfony/translation'), + 'Symfony\\Component\\Stopwatch\\' => array($vendorDir . '/symfony/stopwatch'), + 'Symfony\\Component\\Process\\' => array($vendorDir . '/symfony/process'), + 'Symfony\\Component\\Finder\\' => array($vendorDir . '/symfony/finder'), + 'Symfony\\Component\\Filesystem\\' => array($vendorDir . '/symfony/filesystem'), + 'Symfony\\Component\\EventDispatcher\\' => array($vendorDir . '/symfony/event-dispatcher'), + 'Symfony\\Component\\Debug\\' => array($vendorDir . '/symfony/debug'), + 'Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'), + 'Symfony\\Component\\Config\\' => array($vendorDir . '/symfony/config'), 'Stomp\\' => array($vendorDir . '/stomp-php/stomp-php/src'), + 'Psy\\' => array($vendorDir . '/psy/psysh/src'), + 'Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'), + 'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'), 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'), + 'Psr\\Container\\' => array($vendorDir . '/psr/container/src'), + 'Psr\\Cache\\' => array($vendorDir . '/psr/cache/src'), + 'Prophecy\\' => array($vendorDir . '/phpspec/prophecy/src/Prophecy'), 'Predis\\' => array($vendorDir . '/predis/predis/src'), + 'PhpOption\\' => array($vendorDir . '/phpoption/phpoption/src/PhpOption'), 'ParagonIE\\ConstantTime\\' => array($vendorDir . '/paragonie/constant_time_encoding/src'), + 'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'), 'Michelf\\' => array($vendorDir . '/michelf/php-markdown/Michelf'), 'Masterminds\\' => array($vendorDir . '/masterminds/html5/src'), + 'JakubOnderka\\PhpConsoleHighlighter\\' => array($vendorDir . '/jakub-onderka/php-console-highlighter/src'), + 'JakubOnderka\\PhpConsoleColor\\' => array($vendorDir . '/jakub-onderka/php-console-color/src'), 'Intervention\\Image\\' => array($vendorDir . '/intervention/image/src/Intervention/Image'), + 'Interop\\Container\\' => array($vendorDir . '/container-interop/container-interop/src/Interop/Container'), + 'Humbug\\SelfUpdate\\' => array($vendorDir . '/padraic/phar-updater/src'), + 'Humbug\\' => array($vendorDir . '/padraic/humbug_get_contents/src'), 'Hoa\\Exception\\' => array($vendorDir . '/hoa/exception'), 'Hoa\\Event\\' => array($vendorDir . '/hoa/event'), 'Hoa\\Consistency\\' => array($vendorDir . '/hoa/consistency'), 'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'), 'Embed\\' => array($vendorDir . '/embed/embed/src'), + 'Doctrine\\Instantiator\\' => array($vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator'), + 'Doctrine\\Common\\Lexer\\' => array($vendorDir . '/doctrine/lexer/lib/Doctrine/Common/Lexer'), + 'Doctrine\\Common\\Cache\\' => array($vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache'), + 'Doctrine\\Common\\Annotations\\' => array($vendorDir . '/doctrine/annotations/lib/Doctrine/Common/Annotations'), + 'DeepCopy\\' => array($vendorDir . '/myclabs/deep-copy/src/DeepCopy'), 'Composer\\CaBundle\\' => array($vendorDir . '/composer/ca-bundle/src'), ); diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index 73dc192f9d..89861ec64c 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -7,13 +7,23 @@ namespace Composer\Autoload; class ComposerStaticInit444c3f31864f68a3f466e2c19837e185 { public static $files = array ( + '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php', + '10a6847eba8a430a134fad89f4a30a26' => __DIR__ . '/..' . '/zendframework/zend-cache/autoload/patternPluginManagerPolyfill.php', + '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', 'e88992873b7765f9b5710cab95ba5dd7' => __DIR__ . '/..' . '/hoa/consistency/Prelude.php', + 'fe1bcd0336136e435eaf197895daf81a' => __DIR__ . '/..' . '/nikic/php-parser/lib/bootstrap.php', + 'd9d39f82a605ebe5918f683dd402334c' => __DIR__ . '/..' . '/padraic/humbug_get_contents/src/function.php', + '3a50d90d85c7fe889a94ae1114b921ce' => __DIR__ . '/..' . '/padraic/humbug_get_contents/src/functions.php', '5255c38a0faeba867671b61dfda6d864' => __DIR__ . '/..' . '/paragonie/random_compat/lib/random.php', '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php', + '25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php', 'a0edc8309cc5e1d60e3047b5df6b7052' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/functions_include.php', + '6124b4c8570aa390c21fafd04a26c69f' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php', + '667aeda72477189d0494fecd327c3641' => __DIR__ . '/..' . '/symfony/var-dumper/Resources/functions/dump.php', '2cffec82183ee1cea088009cef9a6fc3' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php', '757772e28a0943a9afe83def8db95bdf' => __DIR__ . '/..' . '/mf2/mf2/Mf2/Parser.php', 'decc78cc4436b1292c6c0d151b19445c' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/bootstrap.php', + '801c31d8ed748cfa537fa45402288c95' => __DIR__ . '/..' . '/psy/psysh/src/functions.php', ); public static $prefixLengthsPsr4 = array ( @@ -21,31 +31,83 @@ class ComposerStaticInit444c3f31864f68a3f466e2c19837e185 array ( 'phpseclib\\' => 10, ), + 'Z' => + array ( + 'Zend\\Stdlib\\' => 12, + 'Zend\\ServiceManager\\' => 20, + 'Zend\\Serializer\\' => 16, + 'Zend\\Json\\' => 10, + 'Zend\\I18n\\' => 10, + 'Zend\\Hydrator\\' => 14, + 'Zend\\Filter\\' => 12, + 'Zend\\EventManager\\' => 18, + 'Zend\\Config\\' => 12, + 'Zend\\Cache\\' => 11, + ), 'X' => array ( + 'XdgBaseDir\\' => 11, 'XMPPHP\\' => 7, ), + 'W' => + array ( + 'Webmozart\\Assert\\' => 17, + ), + 'T' => + array ( + 'Twig\\' => 5, + ), 'S' => array ( + 'Symfony\\Polyfill\\Php72\\' => 23, + 'Symfony\\Polyfill\\Mbstring\\' => 26, + 'Symfony\\Polyfill\\Ctype\\' => 23, + 'Symfony\\Component\\VarDumper\\' => 28, + 'Symfony\\Component\\Validator\\' => 28, + 'Symfony\\Component\\Translation\\' => 30, + 'Symfony\\Component\\Stopwatch\\' => 28, + 'Symfony\\Component\\Process\\' => 26, + 'Symfony\\Component\\Finder\\' => 25, + 'Symfony\\Component\\Filesystem\\' => 29, + 'Symfony\\Component\\EventDispatcher\\' => 34, + 'Symfony\\Component\\Debug\\' => 24, + 'Symfony\\Component\\Console\\' => 26, + 'Symfony\\Component\\Config\\' => 25, 'Stomp\\' => 6, ), 'P' => array ( + 'Psy\\' => 4, + 'Psr\\SimpleCache\\' => 16, + 'Psr\\Log\\' => 8, 'Psr\\Http\\Message\\' => 17, + 'Psr\\Container\\' => 14, + 'Psr\\Cache\\' => 10, + 'Prophecy\\' => 9, 'Predis\\' => 7, + 'PhpOption\\' => 10, 'ParagonIE\\ConstantTime\\' => 23, ), 'M' => array ( + 'Monolog\\' => 8, 'Michelf\\' => 8, 'Masterminds\\' => 12, ), + 'J' => + array ( + 'JakubOnderka\\PhpConsoleHighlighter\\' => 35, + 'JakubOnderka\\PhpConsoleColor\\' => 29, + ), 'I' => array ( 'Intervention\\Image\\' => 19, + 'Interop\\Container\\' => 18, ), 'H' => array ( + 'Humbug\\SelfUpdate\\' => 18, + 'Humbug\\' => 7, 'Hoa\\Exception\\' => 14, 'Hoa\\Event\\' => 10, 'Hoa\\Consistency\\' => 16, @@ -58,6 +120,14 @@ class ComposerStaticInit444c3f31864f68a3f466e2c19837e185 array ( 'Embed\\' => 6, ), + 'D' => + array ( + 'Doctrine\\Instantiator\\' => 22, + 'Doctrine\\Common\\Lexer\\' => 22, + 'Doctrine\\Common\\Cache\\' => 22, + 'Doctrine\\Common\\Annotations\\' => 28, + 'DeepCopy\\' => 9, + ), 'C' => array ( 'Composer\\CaBundle\\' => 18, @@ -69,26 +139,166 @@ class ComposerStaticInit444c3f31864f68a3f466e2c19837e185 array ( 0 => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib', ), + 'Zend\\Stdlib\\' => + array ( + 0 => __DIR__ . '/..' . '/zendframework/zend-stdlib/src', + ), + 'Zend\\ServiceManager\\' => + array ( + 0 => __DIR__ . '/..' . '/zendframework/zend-servicemanager/src', + ), + 'Zend\\Serializer\\' => + array ( + 0 => __DIR__ . '/..' . '/zendframework/zend-serializer/src', + ), + 'Zend\\Json\\' => + array ( + 0 => __DIR__ . '/..' . '/zendframework/zend-json/src', + ), + 'Zend\\I18n\\' => + array ( + 0 => __DIR__ . '/..' . '/zendframework/zend-i18n/src', + ), + 'Zend\\Hydrator\\' => + array ( + 0 => __DIR__ . '/..' . '/zendframework/zend-hydrator/src', + ), + 'Zend\\Filter\\' => + array ( + 0 => __DIR__ . '/..' . '/zendframework/zend-filter/src', + ), + 'Zend\\EventManager\\' => + array ( + 0 => __DIR__ . '/..' . '/zendframework/zend-eventmanager/src', + ), + 'Zend\\Config\\' => + array ( + 0 => __DIR__ . '/..' . '/zendframework/zend-config/src', + ), + 'Zend\\Cache\\' => + array ( + 0 => __DIR__ . '/..' . '/zendframework/zend-cache/src', + ), + 'XdgBaseDir\\' => + array ( + 0 => __DIR__ . '/..' . '/dnoegel/php-xdg-base-dir/src', + ), 'XMPPHP\\' => array ( 0 => __DIR__ . '/..' . '/diogocomposer/xmpphp/XMPPHP', ), + 'Webmozart\\Assert\\' => + array ( + 0 => __DIR__ . '/..' . '/webmozart/assert/src', + ), + 'Twig\\' => + array ( + 0 => __DIR__ . '/..' . '/twig/twig/src', + ), + 'Symfony\\Polyfill\\Php72\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-php72', + ), + 'Symfony\\Polyfill\\Mbstring\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring', + ), + 'Symfony\\Polyfill\\Ctype\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-ctype', + ), + 'Symfony\\Component\\VarDumper\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/var-dumper', + ), + 'Symfony\\Component\\Validator\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/validator', + ), + 'Symfony\\Component\\Translation\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/translation', + ), + 'Symfony\\Component\\Stopwatch\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/stopwatch', + ), + 'Symfony\\Component\\Process\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/process', + ), + 'Symfony\\Component\\Finder\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/finder', + ), + 'Symfony\\Component\\Filesystem\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/filesystem', + ), + 'Symfony\\Component\\EventDispatcher\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/event-dispatcher', + ), + 'Symfony\\Component\\Debug\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/debug', + ), + 'Symfony\\Component\\Console\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/console', + ), + 'Symfony\\Component\\Config\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/config', + ), 'Stomp\\' => array ( 0 => __DIR__ . '/..' . '/stomp-php/stomp-php/src', ), + 'Psy\\' => + array ( + 0 => __DIR__ . '/..' . '/psy/psysh/src', + ), + 'Psr\\SimpleCache\\' => + array ( + 0 => __DIR__ . '/..' . '/psr/simple-cache/src', + ), + 'Psr\\Log\\' => + array ( + 0 => __DIR__ . '/..' . '/psr/log/Psr/Log', + ), 'Psr\\Http\\Message\\' => array ( 0 => __DIR__ . '/..' . '/psr/http-message/src', ), + 'Psr\\Container\\' => + array ( + 0 => __DIR__ . '/..' . '/psr/container/src', + ), + 'Psr\\Cache\\' => + array ( + 0 => __DIR__ . '/..' . '/psr/cache/src', + ), + 'Prophecy\\' => + array ( + 0 => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy', + ), 'Predis\\' => array ( 0 => __DIR__ . '/..' . '/predis/predis/src', ), + 'PhpOption\\' => + array ( + 0 => __DIR__ . '/..' . '/phpoption/phpoption/src/PhpOption', + ), 'ParagonIE\\ConstantTime\\' => array ( 0 => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src', ), + 'Monolog\\' => + array ( + 0 => __DIR__ . '/..' . '/monolog/monolog/src/Monolog', + ), 'Michelf\\' => array ( 0 => __DIR__ . '/..' . '/michelf/php-markdown/Michelf', @@ -97,10 +307,30 @@ class ComposerStaticInit444c3f31864f68a3f466e2c19837e185 array ( 0 => __DIR__ . '/..' . '/masterminds/html5/src', ), + 'JakubOnderka\\PhpConsoleHighlighter\\' => + array ( + 0 => __DIR__ . '/..' . '/jakub-onderka/php-console-highlighter/src', + ), + 'JakubOnderka\\PhpConsoleColor\\' => + array ( + 0 => __DIR__ . '/..' . '/jakub-onderka/php-console-color/src', + ), 'Intervention\\Image\\' => array ( 0 => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image', ), + 'Interop\\Container\\' => + array ( + 0 => __DIR__ . '/..' . '/container-interop/container-interop/src/Interop/Container', + ), + 'Humbug\\SelfUpdate\\' => + array ( + 0 => __DIR__ . '/..' . '/padraic/phar-updater/src', + ), + 'Humbug\\' => + array ( + 0 => __DIR__ . '/..' . '/padraic/humbug_get_contents/src', + ), 'Hoa\\Exception\\' => array ( 0 => __DIR__ . '/..' . '/hoa/exception', @@ -121,6 +351,26 @@ class ComposerStaticInit444c3f31864f68a3f466e2c19837e185 array ( 0 => __DIR__ . '/..' . '/embed/embed/src', ), + 'Doctrine\\Instantiator\\' => + array ( + 0 => __DIR__ . '/..' . '/doctrine/instantiator/src/Doctrine/Instantiator', + ), + 'Doctrine\\Common\\Lexer\\' => + array ( + 0 => __DIR__ . '/..' . '/doctrine/lexer/lib/Doctrine/Common/Lexer', + ), + 'Doctrine\\Common\\Cache\\' => + array ( + 0 => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache', + ), + 'Doctrine\\Common\\Annotations\\' => + array ( + 0 => __DIR__ . '/..' . '/doctrine/annotations/lib/Doctrine/Common/Annotations', + ), + 'DeepCopy\\' => + array ( + 0 => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy', + ), 'Composer\\CaBundle\\' => array ( 0 => __DIR__ . '/..' . '/composer/ca-bundle/src', @@ -128,6 +378,69 @@ class ComposerStaticInit444c3f31864f68a3f466e2c19837e185 ); public static $prefixesPsr0 = array ( + 'p' => + array ( + 'phpDocumentor' => + array ( + 0 => __DIR__ . '/..' . '/phpdocumentor/fileset/src', + 1 => __DIR__ . '/..' . '/phpdocumentor/fileset/tests/unit', + 2 => __DIR__ . '/..' . '/phpdocumentor/graphviz/src', + 3 => __DIR__ . '/..' . '/phpdocumentor/graphviz/tests/unit', + 4 => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src', + 5 => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/tests/unit', + 6 => __DIR__ . '/..' . '/phpdocumentor/reflection/src', + 7 => __DIR__ . '/..' . '/phpdocumentor/reflection/tests/unit', + 8 => __DIR__ . '/..' . '/phpdocumentor/reflection/tests/mocks', + 9 => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src', + ), + ), + 'T' => + array ( + 'Twig_' => + array ( + 0 => __DIR__ . '/..' . '/twig/twig/lib', + ), + ), + 'P' => + array ( + 'Pimple' => + array ( + 0 => __DIR__ . '/..' . '/pimple/pimple/lib', + ), + 'PhpCollection' => + array ( + 0 => __DIR__ . '/..' . '/phpcollection/phpcollection/src', + ), + 'Parsedown' => + array ( + 0 => __DIR__ . '/..' . '/erusev/parsedown', + ), + ), + 'N' => + array ( + 'Neutron' => + array ( + 0 => __DIR__ . '/..' . '/neutron/temporary-filesystem/src', + ), + ), + 'M' => + array ( + 'Metadata\\' => + array ( + 0 => __DIR__ . '/..' . '/jms/metadata/src', + ), + ), + 'J' => + array ( + 'JMS\\Serializer' => + array ( + 0 => __DIR__ . '/..' . '/jms/serializer/src', + ), + 'JMS\\' => + array ( + 0 => __DIR__ . '/..' . '/jms/parser-lib/src', + ), + ), 'H' => array ( 'HTMLPurifier' => @@ -135,16 +448,68 @@ class ComposerStaticInit444c3f31864f68a3f466e2c19837e185 0 => __DIR__ . '/..' . '/ezyang/htmlpurifier/library', ), ), + 'F' => + array ( + 'FFMpeg' => + array ( + 0 => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src', + ), + ), + 'E' => + array ( + 'Evenement' => + array ( + 0 => __DIR__ . '/..' . '/evenement/evenement/src', + ), + ), 'C' => array ( 'Console' => array ( 0 => __DIR__ . '/..' . '/pear/console_getopt', ), + 'Cilex\\Provider\\Console' => + array ( + 0 => __DIR__ . '/..' . '/cilex/console-service-provider/src', + ), + 'Cilex\\Provider' => + array ( + 0 => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src', + ), + 'Cilex' => + array ( + 0 => __DIR__ . '/..' . '/cilex/cilex/src', + ), + ), + 'A' => + array ( + 'Alchemy' => + array ( + 0 => __DIR__ . '/..' . '/alchemy/binary-driver/src', + ), ), ); public static $classMap = array ( + 'Alchemy\\BinaryDriver\\AbstractBinary' => __DIR__ . '/..' . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/AbstractBinary.php', + 'Alchemy\\BinaryDriver\\BinaryDriverTestCase' => __DIR__ . '/..' . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/BinaryDriverTestCase.php', + 'Alchemy\\BinaryDriver\\BinaryInterface' => __DIR__ . '/..' . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/BinaryInterface.php', + 'Alchemy\\BinaryDriver\\Configuration' => __DIR__ . '/..' . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/Configuration.php', + 'Alchemy\\BinaryDriver\\ConfigurationAwareInterface' => __DIR__ . '/..' . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/ConfigurationAwareInterface.php', + 'Alchemy\\BinaryDriver\\ConfigurationInterface' => __DIR__ . '/..' . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/ConfigurationInterface.php', + 'Alchemy\\BinaryDriver\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/Exception/ExceptionInterface.php', + 'Alchemy\\BinaryDriver\\Exception\\ExecutableNotFoundException' => __DIR__ . '/..' . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/Exception/ExecutableNotFoundException.php', + 'Alchemy\\BinaryDriver\\Exception\\ExecutionFailureException' => __DIR__ . '/..' . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/Exception/ExecutionFailureException.php', + 'Alchemy\\BinaryDriver\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/Exception/InvalidArgumentException.php', + 'Alchemy\\BinaryDriver\\Listeners\\DebugListener' => __DIR__ . '/..' . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/Listeners/DebugListener.php', + 'Alchemy\\BinaryDriver\\Listeners\\ListenerInterface' => __DIR__ . '/..' . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/Listeners/ListenerInterface.php', + 'Alchemy\\BinaryDriver\\Listeners\\Listeners' => __DIR__ . '/..' . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/Listeners/Listeners.php', + 'Alchemy\\BinaryDriver\\ProcessBuilderFactory' => __DIR__ . '/..' . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/ProcessBuilderFactory.php', + 'Alchemy\\BinaryDriver\\ProcessBuilderFactoryAwareInterface' => __DIR__ . '/..' . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/ProcessBuilderFactoryAwareInterface.php', + 'Alchemy\\BinaryDriver\\ProcessBuilderFactoryInterface' => __DIR__ . '/..' . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/ProcessBuilderFactoryInterface.php', + 'Alchemy\\BinaryDriver\\ProcessRunner' => __DIR__ . '/..' . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/ProcessRunner.php', + 'Alchemy\\BinaryDriver\\ProcessRunnerAwareInterface' => __DIR__ . '/..' . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/ProcessRunnerAwareInterface.php', + 'Alchemy\\BinaryDriver\\ProcessRunnerInterface' => __DIR__ . '/..' . '/alchemy/binary-driver/src/Alchemy/BinaryDriver/ProcessRunnerInterface.php', 'Auth_OpenID' => __DIR__ . '/..' . '/openid/php-openid/Auth/OpenID.php', 'Auth_OpenID_AX' => __DIR__ . '/..' . '/openid/php-openid/Auth/OpenID/AX.php', 'Auth_OpenID_AX_AttrInfo' => __DIR__ . '/..' . '/openid/php-openid/Auth/OpenID/AX.php', @@ -284,8 +649,103 @@ class ComposerStaticInit444c3f31864f68a3f466e2c19837e185 'CAS_Request_MultiRequestInterface' => __DIR__ . '/..' . '/apereo/phpcas/source/CAS/Request/MultiRequestInterface.php', 'CAS_Request_RequestInterface' => __DIR__ . '/..' . '/apereo/phpcas/source/CAS/Request/RequestInterface.php', 'CAS_TypeMismatchException' => __DIR__ . '/..' . '/apereo/phpcas/source/CAS/TypeMismatchException.php', + 'Cilex\\Application' => __DIR__ . '/..' . '/cilex/cilex/src/Cilex/Application.php', + 'Cilex\\Command\\Command' => __DIR__ . '/..' . '/cilex/cilex/src/Cilex/Command/Command.php', + 'Cilex\\Command\\DemoInfoCommand' => __DIR__ . '/..' . '/cilex/cilex/src/Cilex/Command/DemoInfoCommand.php', + 'Cilex\\Command\\GreetCommand' => __DIR__ . '/..' . '/cilex/cilex/src/Cilex/Command/GreetCommand.php', + 'Cilex\\Compiler' => __DIR__ . '/..' . '/cilex/cilex/src/Cilex/Compiler.php', + 'Cilex\\Provider\\ConfigServiceProvider' => __DIR__ . '/..' . '/cilex/cilex/src/Cilex/Provider/ConfigServiceProvider.php', + 'Cilex\\Provider\\Console\\Adapter\\Silex\\ConsoleServiceProvider' => __DIR__ . '/..' . '/cilex/console-service-provider/src/Cilex/Provider/Console/Adapter/Silex/ConsoleServiceProvider.php', + 'Cilex\\Provider\\Console\\BaseConsoleServiceProvider' => __DIR__ . '/..' . '/cilex/console-service-provider/src/Cilex/Provider/Console/BaseConsoleServiceProvider.php', + 'Cilex\\Provider\\Console\\ConsoleServiceProvider' => __DIR__ . '/..' . '/cilex/console-service-provider/src/Cilex/Provider/Console/ConsoleServiceProvider.php', + 'Cilex\\Provider\\Console\\ContainerAwareApplication' => __DIR__ . '/..' . '/cilex/console-service-provider/src/Cilex/Provider/Console/ContainerAwareApplication.php', + 'Cilex\\Provider\\DoctrineServiceProvider' => __DIR__ . '/..' . '/cilex/cilex/src/Cilex/Provider/DoctrineServiceProvider.php', + 'Cilex\\Provider\\JmsSerializerServiceProvider' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/Cilex/Provider/JmsSerializerServiceProvider.php', + 'Cilex\\Provider\\MonologServiceProvider' => __DIR__ . '/..' . '/cilex/cilex/src/Cilex/Provider/MonologServiceProvider.php', + 'Cilex\\Provider\\ValidatorServiceProvider' => __DIR__ . '/..' . '/cilex/cilex/src/Cilex/Provider/ValidatorServiceProvider.php', + 'Cilex\\ServiceProviderInterface' => __DIR__ . '/..' . '/cilex/cilex/src/Cilex/ServiceProviderInterface.php', 'Composer\\CaBundle\\CaBundle' => __DIR__ . '/..' . '/composer/ca-bundle/src/CaBundle.php', 'Console_Getopt' => __DIR__ . '/..' . '/pear/console_getopt/Console/Getopt.php', + 'DeepCopy\\DeepCopy' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/DeepCopy.php', + 'DeepCopy\\Exception\\CloneException' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php', + 'DeepCopy\\Exception\\PropertyException' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Exception/PropertyException.php', + 'DeepCopy\\Filter\\Doctrine\\DoctrineCollectionFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php', + 'DeepCopy\\Filter\\Doctrine\\DoctrineEmptyCollectionFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php', + 'DeepCopy\\Filter\\Doctrine\\DoctrineProxyFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php', + 'DeepCopy\\Filter\\Filter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php', + 'DeepCopy\\Filter\\KeepFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/KeepFilter.php', + 'DeepCopy\\Filter\\ReplaceFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.php', + 'DeepCopy\\Filter\\SetNullFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php', + 'DeepCopy\\Matcher\\Doctrine\\DoctrineProxyMatcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php', + 'DeepCopy\\Matcher\\Matcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php', + 'DeepCopy\\Matcher\\PropertyMatcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.php', + 'DeepCopy\\Matcher\\PropertyNameMatcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php', + 'DeepCopy\\Matcher\\PropertyTypeMatcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php', + 'DeepCopy\\Reflection\\ReflectionHelper' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php', + 'DeepCopy\\TypeFilter\\Date\\DateIntervalFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php', + 'DeepCopy\\TypeFilter\\ReplaceFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php', + 'DeepCopy\\TypeFilter\\ShallowCopyFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php', + 'DeepCopy\\TypeFilter\\Spl\\ArrayObjectFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/ArrayObjectFilter.php', + 'DeepCopy\\TypeFilter\\Spl\\SplDoublyLinkedList' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php', + 'DeepCopy\\TypeFilter\\Spl\\SplDoublyLinkedListFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.php', + 'DeepCopy\\TypeFilter\\TypeFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php', + 'DeepCopy\\TypeMatcher\\TypeMatcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.php', + 'Doctrine\\Common\\Annotations\\Annotation' => __DIR__ . '/..' . '/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation.php', + 'Doctrine\\Common\\Annotations\\AnnotationException' => __DIR__ . '/..' . '/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationException.php', + 'Doctrine\\Common\\Annotations\\AnnotationReader' => __DIR__ . '/..' . '/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationReader.php', + 'Doctrine\\Common\\Annotations\\AnnotationRegistry' => __DIR__ . '/..' . '/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationRegistry.php', + 'Doctrine\\Common\\Annotations\\Annotation\\Attribute' => __DIR__ . '/..' . '/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Attribute.php', + 'Doctrine\\Common\\Annotations\\Annotation\\Attributes' => __DIR__ . '/..' . '/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Attributes.php', + 'Doctrine\\Common\\Annotations\\Annotation\\Enum' => __DIR__ . '/..' . '/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Enum.php', + 'Doctrine\\Common\\Annotations\\Annotation\\IgnoreAnnotation' => __DIR__ . '/..' . '/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php', + 'Doctrine\\Common\\Annotations\\Annotation\\Required' => __DIR__ . '/..' . '/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Required.php', + 'Doctrine\\Common\\Annotations\\Annotation\\Target' => __DIR__ . '/..' . '/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Target.php', + 'Doctrine\\Common\\Annotations\\CachedReader' => __DIR__ . '/..' . '/doctrine/annotations/lib/Doctrine/Common/Annotations/CachedReader.php', + 'Doctrine\\Common\\Annotations\\DocLexer' => __DIR__ . '/..' . '/doctrine/annotations/lib/Doctrine/Common/Annotations/DocLexer.php', + 'Doctrine\\Common\\Annotations\\DocParser' => __DIR__ . '/..' . '/doctrine/annotations/lib/Doctrine/Common/Annotations/DocParser.php', + 'Doctrine\\Common\\Annotations\\FileCacheReader' => __DIR__ . '/..' . '/doctrine/annotations/lib/Doctrine/Common/Annotations/FileCacheReader.php', + 'Doctrine\\Common\\Annotations\\IndexedReader' => __DIR__ . '/..' . '/doctrine/annotations/lib/Doctrine/Common/Annotations/IndexedReader.php', + 'Doctrine\\Common\\Annotations\\PhpParser' => __DIR__ . '/..' . '/doctrine/annotations/lib/Doctrine/Common/Annotations/PhpParser.php', + 'Doctrine\\Common\\Annotations\\Reader' => __DIR__ . '/..' . '/doctrine/annotations/lib/Doctrine/Common/Annotations/Reader.php', + 'Doctrine\\Common\\Annotations\\SimpleAnnotationReader' => __DIR__ . '/..' . '/doctrine/annotations/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php', + 'Doctrine\\Common\\Annotations\\TokenParser' => __DIR__ . '/..' . '/doctrine/annotations/lib/Doctrine/Common/Annotations/TokenParser.php', + 'Doctrine\\Common\\Cache\\ApcCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/ApcCache.php', + 'Doctrine\\Common\\Cache\\ApcuCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/ApcuCache.php', + 'Doctrine\\Common\\Cache\\ArrayCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/ArrayCache.php', + 'Doctrine\\Common\\Cache\\Cache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/Cache.php', + 'Doctrine\\Common\\Cache\\CacheProvider' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/CacheProvider.php', + 'Doctrine\\Common\\Cache\\ChainCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/ChainCache.php', + 'Doctrine\\Common\\Cache\\ClearableCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/ClearableCache.php', + 'Doctrine\\Common\\Cache\\CouchbaseBucketCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/CouchbaseBucketCache.php', + 'Doctrine\\Common\\Cache\\CouchbaseCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/CouchbaseCache.php', + 'Doctrine\\Common\\Cache\\ExtMongoDBCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/ExtMongoDBCache.php', + 'Doctrine\\Common\\Cache\\FileCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/FileCache.php', + 'Doctrine\\Common\\Cache\\FilesystemCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/FilesystemCache.php', + 'Doctrine\\Common\\Cache\\FlushableCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/FlushableCache.php', + 'Doctrine\\Common\\Cache\\InvalidCacheId' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/InvalidCacheId.php', + 'Doctrine\\Common\\Cache\\LegacyMongoDBCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/LegacyMongoDBCache.php', + 'Doctrine\\Common\\Cache\\MemcacheCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/MemcacheCache.php', + 'Doctrine\\Common\\Cache\\MemcachedCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/MemcachedCache.php', + 'Doctrine\\Common\\Cache\\MongoDBCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/MongoDBCache.php', + 'Doctrine\\Common\\Cache\\MultiDeleteCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/MultiDeleteCache.php', + 'Doctrine\\Common\\Cache\\MultiGetCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/MultiGetCache.php', + 'Doctrine\\Common\\Cache\\MultiOperationCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/MultiOperationCache.php', + 'Doctrine\\Common\\Cache\\MultiPutCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/MultiPutCache.php', + 'Doctrine\\Common\\Cache\\PhpFileCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/PhpFileCache.php', + 'Doctrine\\Common\\Cache\\PredisCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/PredisCache.php', + 'Doctrine\\Common\\Cache\\RedisCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/RedisCache.php', + 'Doctrine\\Common\\Cache\\SQLite3Cache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/SQLite3Cache.php', + 'Doctrine\\Common\\Cache\\Version' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/Version.php', + 'Doctrine\\Common\\Cache\\VoidCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/VoidCache.php', + 'Doctrine\\Common\\Cache\\WinCacheCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/WinCacheCache.php', + 'Doctrine\\Common\\Cache\\XcacheCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/XcacheCache.php', + 'Doctrine\\Common\\Cache\\ZendDataCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/ZendDataCache.php', + 'Doctrine\\Common\\Lexer\\AbstractLexer' => __DIR__ . '/..' . '/doctrine/lexer/lib/Doctrine/Common/Lexer/AbstractLexer.php', + 'Doctrine\\Instantiator\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php', + 'Doctrine\\Instantiator\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/doctrine/instantiator/src/Doctrine/Instantiator/Exception/InvalidArgumentException.php', + 'Doctrine\\Instantiator\\Exception\\UnexpectedValueException' => __DIR__ . '/..' . '/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php', + 'Doctrine\\Instantiator\\Instantiator' => __DIR__ . '/..' . '/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php', + 'Doctrine\\Instantiator\\InstantiatorInterface' => __DIR__ . '/..' . '/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php', 'Embed\\Adapters\\Adapter' => __DIR__ . '/..' . '/embed/embed/src/Adapters/Adapter.php', 'Embed\\Adapters\\Archive' => __DIR__ . '/..' . '/embed/embed/src/Adapters/Archive.php', 'Embed\\Adapters\\Cadenaser' => __DIR__ . '/..' . '/embed/embed/src/Adapters/Cadenaser.php', @@ -310,7 +770,6 @@ class ComposerStaticInit444c3f31864f68a3f466e2c19837e185 'Embed\\Adapters\\Sassmeister' => __DIR__ . '/..' . '/embed/embed/src/Adapters/Sassmeister.php', 'Embed\\Adapters\\Slides' => __DIR__ . '/..' . '/embed/embed/src/Adapters/Slides.php', 'Embed\\Adapters\\Snipplr' => __DIR__ . '/..' . '/embed/embed/src/Adapters/Snipplr.php', - 'Embed\\Adapters\\Twitter' => __DIR__ . '/..' . '/embed/embed/src/Adapters/Twitter.php', 'Embed\\Adapters\\Vimeo' => __DIR__ . '/..' . '/embed/embed/src/Adapters/Vimeo.php', 'Embed\\Adapters\\Webpage' => __DIR__ . '/..' . '/embed/embed/src/Adapters/Webpage.php', 'Embed\\Adapters\\Wikipedia' => __DIR__ . '/..' . '/embed/embed/src/Adapters/Wikipedia.php', @@ -357,7 +816,6 @@ class ComposerStaticInit444c3f31864f68a3f466e2c19837e185 'Embed\\Providers\\OEmbed\\Jsbin' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Jsbin.php', 'Embed\\Providers\\OEmbed\\Kickstarter' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Kickstarter.php', 'Embed\\Providers\\OEmbed\\Meetup' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Meetup.php', - 'Embed\\Providers\\OEmbed\\Mixcloud' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Mixcloud.php', 'Embed\\Providers\\OEmbed\\Photobucket' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Photobucket.php', 'Embed\\Providers\\OEmbed\\Poll' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Poll.php', 'Embed\\Providers\\OEmbed\\Polldaddy' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Polldaddy.php', @@ -367,19 +825,119 @@ class ComposerStaticInit444c3f31864f68a3f466e2c19837e185 'Embed\\Providers\\OEmbed\\Smugmug' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Smugmug.php', 'Embed\\Providers\\OEmbed\\Soundcloud' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Soundcloud.php', 'Embed\\Providers\\OEmbed\\Spotify' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Spotify.php', - 'Embed\\Providers\\OEmbed\\Tiktok' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Tiktok.php', 'Embed\\Providers\\OEmbed\\Tumblr' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Tumblr.php', 'Embed\\Providers\\OEmbed\\Twitch' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Twitch.php', 'Embed\\Providers\\OEmbed\\Twitter' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Twitter.php', 'Embed\\Providers\\OEmbed\\Ustream' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Ustream.php', 'Embed\\Providers\\OEmbed\\Vimeo' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Vimeo.php', - 'Embed\\Providers\\OEmbed\\Wordpress' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Wordpress.php', 'Embed\\Providers\\OEmbed\\Youtube' => __DIR__ . '/..' . '/embed/embed/src/Providers/OEmbed/Youtube.php', 'Embed\\Providers\\OpenGraph' => __DIR__ . '/..' . '/embed/embed/src/Providers/OpenGraph.php', 'Embed\\Providers\\Provider' => __DIR__ . '/..' . '/embed/embed/src/Providers/Provider.php', 'Embed\\Providers\\Sailthru' => __DIR__ . '/..' . '/embed/embed/src/Providers/Sailthru.php', 'Embed\\Providers\\TwitterCards' => __DIR__ . '/..' . '/embed/embed/src/Providers/TwitterCards.php', 'Embed\\Utils' => __DIR__ . '/..' . '/embed/embed/src/Utils.php', + 'Evenement\\EventEmitter' => __DIR__ . '/..' . '/evenement/evenement/src/Evenement/EventEmitter.php', + 'Evenement\\EventEmitterInterface' => __DIR__ . '/..' . '/evenement/evenement/src/Evenement/EventEmitterInterface.php', + 'Evenement\\EventEmitterTrait' => __DIR__ . '/..' . '/evenement/evenement/src/Evenement/EventEmitterTrait.php', + 'FFMpeg\\Coordinate\\AspectRatio' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Coordinate/AspectRatio.php', + 'FFMpeg\\Coordinate\\Dimension' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Coordinate/Dimension.php', + 'FFMpeg\\Coordinate\\FrameRate' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Coordinate/FrameRate.php', + 'FFMpeg\\Coordinate\\Point' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Coordinate/Point.php', + 'FFMpeg\\Coordinate\\TimeCode' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Coordinate/TimeCode.php', + 'FFMpeg\\Driver\\FFMpegDriver' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Driver/FFMpegDriver.php', + 'FFMpeg\\Driver\\FFProbeDriver' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Driver/FFProbeDriver.php', + 'FFMpeg\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Exception/ExceptionInterface.php', + 'FFMpeg\\Exception\\ExecutableNotFoundException' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Exception/ExecutableNotFoundException.php', + 'FFMpeg\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Exception/InvalidArgumentException.php', + 'FFMpeg\\Exception\\LogicException' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Exception/LogicException.php', + 'FFMpeg\\Exception\\RuntimeException' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Exception/RuntimeException.php', + 'FFMpeg\\FFMpeg' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFMpeg.php', + 'FFMpeg\\FFMpegServiceProvider' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFMpegServiceProvider.php', + 'FFMpeg\\FFProbe' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe.php', + 'FFMpeg\\FFProbe\\DataMapping\\AbstractData' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/DataMapping/AbstractData.php', + 'FFMpeg\\FFProbe\\DataMapping\\Format' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/DataMapping/Format.php', + 'FFMpeg\\FFProbe\\DataMapping\\Stream' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/DataMapping/Stream.php', + 'FFMpeg\\FFProbe\\DataMapping\\StreamCollection' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/DataMapping/StreamCollection.php', + 'FFMpeg\\FFProbe\\Mapper' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/Mapper.php', + 'FFMpeg\\FFProbe\\MapperInterface' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/MapperInterface.php', + 'FFMpeg\\FFProbe\\OptionsTester' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/OptionsTester.php', + 'FFMpeg\\FFProbe\\OptionsTesterInterface' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/OptionsTesterInterface.php', + 'FFMpeg\\FFProbe\\OutputParser' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/OutputParser.php', + 'FFMpeg\\FFProbe\\OutputParserInterface' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/OutputParserInterface.php', + 'FFMpeg\\Filters\\AdvancedMedia\\ANullSrcFilter' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/ANullSrcFilter.php', + 'FFMpeg\\Filters\\AdvancedMedia\\AbstractComplexFilter' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/AbstractComplexFilter.php', + 'FFMpeg\\Filters\\AdvancedMedia\\ComplexCompatibleFilter' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/ComplexCompatibleFilter.php', + 'FFMpeg\\Filters\\AdvancedMedia\\ComplexFilterContainer' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/ComplexFilterContainer.php', + 'FFMpeg\\Filters\\AdvancedMedia\\ComplexFilterInterface' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/ComplexFilterInterface.php', + 'FFMpeg\\Filters\\AdvancedMedia\\ComplexFilters' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/ComplexFilters.php', + 'FFMpeg\\Filters\\AdvancedMedia\\CustomComplexFilter' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/CustomComplexFilter.php', + 'FFMpeg\\Filters\\AdvancedMedia\\SineFilter' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/SineFilter.php', + 'FFMpeg\\Filters\\AdvancedMedia\\TestSrcFilter' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/TestSrcFilter.php', + 'FFMpeg\\Filters\\AdvancedMedia\\XStackFilter' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/XStackFilter.php', + 'FFMpeg\\Filters\\Audio\\AddMetadataFilter' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Audio/AddMetadataFilter.php', + 'FFMpeg\\Filters\\Audio\\AudioClipFilter' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Audio/AudioClipFilter.php', + 'FFMpeg\\Filters\\Audio\\AudioFilterInterface' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Audio/AudioFilterInterface.php', + 'FFMpeg\\Filters\\Audio\\AudioFilters' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Audio/AudioFilters.php', + 'FFMpeg\\Filters\\Audio\\AudioResamplableFilter' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Audio/AudioResamplableFilter.php', + 'FFMpeg\\Filters\\Audio\\CustomFilter' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Audio/CustomFilter.php', + 'FFMpeg\\Filters\\Audio\\SimpleFilter' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Audio/SimpleFilter.php', + 'FFMpeg\\Filters\\Concat\\ConcatFilterInterface' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Concat/ConcatFilterInterface.php', + 'FFMpeg\\Filters\\Concat\\ConcatFilters' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Concat/ConcatFilters.php', + 'FFMpeg\\Filters\\FilterInterface' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/FilterInterface.php', + 'FFMpeg\\Filters\\FiltersCollection' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/FiltersCollection.php', + 'FFMpeg\\Filters\\Frame\\CustomFrameFilter' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Frame/CustomFrameFilter.php', + 'FFMpeg\\Filters\\Frame\\DisplayRatioFixerFilter' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Frame/DisplayRatioFixerFilter.php', + 'FFMpeg\\Filters\\Frame\\FrameFilterInterface' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Frame/FrameFilterInterface.php', + 'FFMpeg\\Filters\\Frame\\FrameFilters' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Frame/FrameFilters.php', + 'FFMpeg\\Filters\\Gif\\GifFilterInterface' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Gif/GifFilterInterface.php', + 'FFMpeg\\Filters\\Gif\\GifFilters' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Gif/GifFilters.php', + 'FFMpeg\\Filters\\Video\\ClipFilter' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/ClipFilter.php', + 'FFMpeg\\Filters\\Video\\CropFilter' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/CropFilter.php', + 'FFMpeg\\Filters\\Video\\CustomFilter' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/CustomFilter.php', + 'FFMpeg\\Filters\\Video\\ExtractMultipleFramesFilter' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/ExtractMultipleFramesFilter.php', + 'FFMpeg\\Filters\\Video\\FrameRateFilter' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/FrameRateFilter.php', + 'FFMpeg\\Filters\\Video\\PadFilter' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/PadFilter.php', + 'FFMpeg\\Filters\\Video\\ResizeFilter' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/ResizeFilter.php', + 'FFMpeg\\Filters\\Video\\RotateFilter' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/RotateFilter.php', + 'FFMpeg\\Filters\\Video\\SynchronizeFilter' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/SynchronizeFilter.php', + 'FFMpeg\\Filters\\Video\\VideoFilterInterface' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/VideoFilterInterface.php', + 'FFMpeg\\Filters\\Video\\VideoFilters' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/VideoFilters.php', + 'FFMpeg\\Filters\\Video\\WatermarkFilter' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/WatermarkFilter.php', + 'FFMpeg\\Filters\\Waveform\\WaveformDownmixFilter' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Waveform/WaveformDownmixFilter.php', + 'FFMpeg\\Filters\\Waveform\\WaveformFilterInterface' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Waveform/WaveformFilterInterface.php', + 'FFMpeg\\Filters\\Waveform\\WaveformFilters' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Waveform/WaveformFilters.php', + 'FFMpeg\\Format\\AudioInterface' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/AudioInterface.php', + 'FFMpeg\\Format\\Audio\\Aac' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Audio/Aac.php', + 'FFMpeg\\Format\\Audio\\DefaultAudio' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Audio/DefaultAudio.php', + 'FFMpeg\\Format\\Audio\\Flac' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Audio/Flac.php', + 'FFMpeg\\Format\\Audio\\Mp3' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Audio/Mp3.php', + 'FFMpeg\\Format\\Audio\\Vorbis' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Audio/Vorbis.php', + 'FFMpeg\\Format\\Audio\\Wav' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Audio/Wav.php', + 'FFMpeg\\Format\\FormatInterface' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/FormatInterface.php', + 'FFMpeg\\Format\\FrameInterface' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/FrameInterface.php', + 'FFMpeg\\Format\\ProgressListener\\AbstractProgressListener' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/ProgressListener/AbstractProgressListener.php', + 'FFMpeg\\Format\\ProgressListener\\AudioProgressListener' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/ProgressListener/AudioProgressListener.php', + 'FFMpeg\\Format\\ProgressListener\\VideoProgressListener' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/ProgressListener/VideoProgressListener.php', + 'FFMpeg\\Format\\ProgressableInterface' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/ProgressableInterface.php', + 'FFMpeg\\Format\\VideoInterface' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/VideoInterface.php', + 'FFMpeg\\Format\\Video\\DefaultVideo' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Video/DefaultVideo.php', + 'FFMpeg\\Format\\Video\\Ogg' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Video/Ogg.php', + 'FFMpeg\\Format\\Video\\WMV' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Video/WMV.php', + 'FFMpeg\\Format\\Video\\WMV3' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Video/WMV3.php', + 'FFMpeg\\Format\\Video\\WebM' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Video/WebM.php', + 'FFMpeg\\Format\\Video\\X264' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Video/X264.php', + 'FFMpeg\\Media\\AbstractMediaType' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/AbstractMediaType.php', + 'FFMpeg\\Media\\AbstractStreamableMedia' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/AbstractStreamableMedia.php', + 'FFMpeg\\Media\\AbstractVideo' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/AbstractVideo.php', + 'FFMpeg\\Media\\AdvancedMedia' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/AdvancedMedia.php', + 'FFMpeg\\Media\\Audio' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/Audio.php', + 'FFMpeg\\Media\\Clip' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/Clip.php', + 'FFMpeg\\Media\\Concat' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/Concat.php', + 'FFMpeg\\Media\\Frame' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/Frame.php', + 'FFMpeg\\Media\\Gif' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/Gif.php', + 'FFMpeg\\Media\\MediaTypeInterface' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/MediaTypeInterface.php', + 'FFMpeg\\Media\\Video' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/Video.php', + 'FFMpeg\\Media\\Waveform' => __DIR__ . '/..' . '/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/Waveform.php', 'GuzzleHttp\\Psr7\\AppendStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/AppendStream.php', 'GuzzleHttp\\Psr7\\BufferStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/BufferStream.php', 'GuzzleHttp\\Psr7\\CachingStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/CachingStream.php', @@ -667,6 +1225,22 @@ class ComposerStaticInit444c3f31864f68a3f466e2c19837e185 'Hoa\\Exception\\Test\\Unit\\Exception' => __DIR__ . '/..' . '/hoa/exception/Test/Unit/Exception.php', 'Hoa\\Exception\\Test\\Unit\\Group' => __DIR__ . '/..' . '/hoa/exception/Test/Unit/Group.php', 'Hoa\\Exception\\Test\\Unit\\Idle' => __DIR__ . '/..' . '/hoa/exception/Test/Unit/Idle.php', + 'Humbug\\FileGetContents' => __DIR__ . '/..' . '/padraic/humbug_get_contents/src/FileGetContents.php', + 'Humbug\\SelfUpdate\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/padraic/phar-updater/src/Exception/ExceptionInterface.php', + 'Humbug\\SelfUpdate\\Exception\\FilesystemException' => __DIR__ . '/..' . '/padraic/phar-updater/src/Exception/FilesystemException.php', + 'Humbug\\SelfUpdate\\Exception\\HttpRequestException' => __DIR__ . '/..' . '/padraic/phar-updater/src/Exception/HttpRequestException.php', + 'Humbug\\SelfUpdate\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/padraic/phar-updater/src/Exception/InvalidArgumentException.php', + 'Humbug\\SelfUpdate\\Exception\\JsonParsingException' => __DIR__ . '/..' . '/padraic/phar-updater/src/Exception/JsonParsingException.php', + 'Humbug\\SelfUpdate\\Exception\\NoSignatureException' => __DIR__ . '/..' . '/padraic/phar-updater/src/Exception/NoSignatureException.php', + 'Humbug\\SelfUpdate\\Exception\\RuntimeException' => __DIR__ . '/..' . '/padraic/phar-updater/src/Exception/RuntimeException.php', + 'Humbug\\SelfUpdate\\Strategy\\GithubStrategy' => __DIR__ . '/..' . '/padraic/phar-updater/src/Strategy/GithubStrategy.php', + 'Humbug\\SelfUpdate\\Strategy\\ShaStrategy' => __DIR__ . '/..' . '/padraic/phar-updater/src/Strategy/ShaStrategy.php', + 'Humbug\\SelfUpdate\\Strategy\\StrategyInterface' => __DIR__ . '/..' . '/padraic/phar-updater/src/Strategy/StrategyInterface.php', + 'Humbug\\SelfUpdate\\Updater' => __DIR__ . '/..' . '/padraic/phar-updater/src/Updater.php', + 'Humbug\\SelfUpdate\\VersionParser' => __DIR__ . '/..' . '/padraic/phar-updater/src/VersionParser.php', + 'Interop\\Container\\ContainerInterface' => __DIR__ . '/..' . '/container-interop/container-interop/src/Interop/Container/ContainerInterface.php', + 'Interop\\Container\\Exception\\ContainerException' => __DIR__ . '/..' . '/container-interop/container-interop/src/Interop/Container/Exception/ContainerException.php', + 'Interop\\Container\\Exception\\NotFoundException' => __DIR__ . '/..' . '/container-interop/container-interop/src/Interop/Container/Exception/NotFoundException.php', 'Intervention\\Image\\AbstractColor' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/AbstractColor.php', 'Intervention\\Image\\AbstractDecoder' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/AbstractDecoder.php', 'Intervention\\Image\\AbstractDriver' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/AbstractDriver.php', @@ -793,6 +1367,141 @@ class ComposerStaticInit444c3f31864f68a3f466e2c19837e185 'Intervention\\Image\\Point' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Point.php', 'Intervention\\Image\\Response' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Response.php', 'Intervention\\Image\\Size' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Size.php', + 'JMS\\Parser\\AbstractLexer' => __DIR__ . '/..' . '/jms/parser-lib/src/JMS/Parser/AbstractLexer.php', + 'JMS\\Parser\\AbstractParser' => __DIR__ . '/..' . '/jms/parser-lib/src/JMS/Parser/AbstractParser.php', + 'JMS\\Parser\\SimpleLexer' => __DIR__ . '/..' . '/jms/parser-lib/src/JMS/Parser/SimpleLexer.php', + 'JMS\\Parser\\SyntaxErrorException' => __DIR__ . '/..' . '/jms/parser-lib/src/JMS/Parser/SyntaxErrorException.php', + 'JMS\\Serializer\\AbstractVisitor' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/AbstractVisitor.php', + 'JMS\\Serializer\\Accessor\\AccessorStrategyInterface' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Accessor/AccessorStrategyInterface.php', + 'JMS\\Serializer\\Accessor\\DefaultAccessorStrategy' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Accessor/DefaultAccessorStrategy.php', + 'JMS\\Serializer\\Accessor\\ExpressionAccessorStrategy' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Accessor/ExpressionAccessorStrategy.php', + 'JMS\\Serializer\\Annotation\\AccessType' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Annotation/AccessType.php', + 'JMS\\Serializer\\Annotation\\Accessor' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Annotation/Accessor.php', + 'JMS\\Serializer\\Annotation\\AccessorOrder' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Annotation/AccessorOrder.php', + 'JMS\\Serializer\\Annotation\\Discriminator' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Annotation/Discriminator.php', + 'JMS\\Serializer\\Annotation\\Exclude' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Annotation/Exclude.php', + 'JMS\\Serializer\\Annotation\\ExclusionPolicy' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Annotation/ExclusionPolicy.php', + 'JMS\\Serializer\\Annotation\\Expose' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Annotation/Expose.php', + 'JMS\\Serializer\\Annotation\\Groups' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Annotation/Groups.php', + 'JMS\\Serializer\\Annotation\\HandlerCallback' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Annotation/HandlerCallback.php', + 'JMS\\Serializer\\Annotation\\Inline' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Annotation/Inline.php', + 'JMS\\Serializer\\Annotation\\MaxDepth' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Annotation/MaxDepth.php', + 'JMS\\Serializer\\Annotation\\PostDeserialize' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Annotation/PostDeserialize.php', + 'JMS\\Serializer\\Annotation\\PostSerialize' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Annotation/PostSerialize.php', + 'JMS\\Serializer\\Annotation\\PreSerialize' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Annotation/PreSerialize.php', + 'JMS\\Serializer\\Annotation\\ReadOnly' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Annotation/ReadOnly.php', + 'JMS\\Serializer\\Annotation\\SerializedName' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Annotation/SerializedName.php', + 'JMS\\Serializer\\Annotation\\Since' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Annotation/Since.php', + 'JMS\\Serializer\\Annotation\\SkipWhenEmpty' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Annotation/SkipWhenEmpty.php', + 'JMS\\Serializer\\Annotation\\Type' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Annotation/Type.php', + 'JMS\\Serializer\\Annotation\\Until' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Annotation/Until.php', + 'JMS\\Serializer\\Annotation\\Version' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Annotation/Version.php', + 'JMS\\Serializer\\Annotation\\VirtualProperty' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Annotation/VirtualProperty.php', + 'JMS\\Serializer\\Annotation\\XmlAttribute' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Annotation/XmlAttribute.php', + 'JMS\\Serializer\\Annotation\\XmlAttributeMap' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Annotation/XmlAttributeMap.php', + 'JMS\\Serializer\\Annotation\\XmlCollection' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Annotation/XmlCollection.php', + 'JMS\\Serializer\\Annotation\\XmlDiscriminator' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Annotation/XmlDiscriminator.php', + 'JMS\\Serializer\\Annotation\\XmlElement' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Annotation/XmlElement.php', + 'JMS\\Serializer\\Annotation\\XmlKeyValuePairs' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Annotation/XmlKeyValuePairs.php', + 'JMS\\Serializer\\Annotation\\XmlList' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Annotation/XmlList.php', + 'JMS\\Serializer\\Annotation\\XmlMap' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Annotation/XmlMap.php', + 'JMS\\Serializer\\Annotation\\XmlNamespace' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Annotation/XmlNamespace.php', + 'JMS\\Serializer\\Annotation\\XmlRoot' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Annotation/XmlRoot.php', + 'JMS\\Serializer\\Annotation\\XmlValue' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Annotation/XmlValue.php', + 'JMS\\Serializer\\ArrayTransformerInterface' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/ArrayTransformerInterface.php', + 'JMS\\Serializer\\Builder\\CallbackDriverFactory' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Builder/CallbackDriverFactory.php', + 'JMS\\Serializer\\Builder\\DefaultDriverFactory' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Builder/DefaultDriverFactory.php', + 'JMS\\Serializer\\Builder\\DriverFactoryInterface' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Builder/DriverFactoryInterface.php', + 'JMS\\Serializer\\Construction\\DoctrineObjectConstructor' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Construction/DoctrineObjectConstructor.php', + 'JMS\\Serializer\\Construction\\ObjectConstructorInterface' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Construction/ObjectConstructorInterface.php', + 'JMS\\Serializer\\Construction\\UnserializeObjectConstructor' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Construction/UnserializeObjectConstructor.php', + 'JMS\\Serializer\\Context' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Context.php', + 'JMS\\Serializer\\ContextFactory\\CallableContextFactory' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/ContextFactory/CallableContextFactory.php', + 'JMS\\Serializer\\ContextFactory\\CallableDeserializationContextFactory' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/ContextFactory/CallableDeserializationContextFactory.php', + 'JMS\\Serializer\\ContextFactory\\CallableSerializationContextFactory' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/ContextFactory/CallableSerializationContextFactory.php', + 'JMS\\Serializer\\ContextFactory\\DefaultDeserializationContextFactory' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/ContextFactory/DefaultDeserializationContextFactory.php', + 'JMS\\Serializer\\ContextFactory\\DefaultSerializationContextFactory' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/ContextFactory/DefaultSerializationContextFactory.php', + 'JMS\\Serializer\\ContextFactory\\DeserializationContextFactoryInterface' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/ContextFactory/DeserializationContextFactoryInterface.php', + 'JMS\\Serializer\\ContextFactory\\SerializationContextFactoryInterface' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/ContextFactory/SerializationContextFactoryInterface.php', + 'JMS\\Serializer\\DeserializationContext' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/DeserializationContext.php', + 'JMS\\Serializer\\EventDispatcher\\Event' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/EventDispatcher/Event.php', + 'JMS\\Serializer\\EventDispatcher\\EventDispatcher' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/EventDispatcher/EventDispatcher.php', + 'JMS\\Serializer\\EventDispatcher\\EventDispatcherInterface' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/EventDispatcher/EventDispatcherInterface.php', + 'JMS\\Serializer\\EventDispatcher\\EventSubscriberInterface' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/EventDispatcher/EventSubscriberInterface.php', + 'JMS\\Serializer\\EventDispatcher\\Events' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/EventDispatcher/Events.php', + 'JMS\\Serializer\\EventDispatcher\\LazyEventDispatcher' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/EventDispatcher/LazyEventDispatcher.php', + 'JMS\\Serializer\\EventDispatcher\\ObjectEvent' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/EventDispatcher/ObjectEvent.php', + 'JMS\\Serializer\\EventDispatcher\\PreDeserializeEvent' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/EventDispatcher/PreDeserializeEvent.php', + 'JMS\\Serializer\\EventDispatcher\\PreSerializeEvent' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/EventDispatcher/PreSerializeEvent.php', + 'JMS\\Serializer\\EventDispatcher\\Subscriber\\DoctrineProxySubscriber' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/EventDispatcher/Subscriber/DoctrineProxySubscriber.php', + 'JMS\\Serializer\\EventDispatcher\\Subscriber\\SymfonyValidatorSubscriber' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/EventDispatcher/Subscriber/SymfonyValidatorSubscriber.php', + 'JMS\\Serializer\\EventDispatcher\\Subscriber\\SymfonyValidatorValidatorSubscriber' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/EventDispatcher/Subscriber/SymfonyValidatorValidatorSubscriber.php', + 'JMS\\Serializer\\Exception\\Exception' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Exception/Exception.php', + 'JMS\\Serializer\\Exception\\ExpressionLanguageRequiredException' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Exception/ExpressionLanguageRequiredException.php', + 'JMS\\Serializer\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Exception/InvalidArgumentException.php', + 'JMS\\Serializer\\Exception\\LogicException' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Exception/LogicException.php', + 'JMS\\Serializer\\Exception\\ObjectConstructionException' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Exception/ObjectConstructionException.php', + 'JMS\\Serializer\\Exception\\RuntimeException' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Exception/RuntimeException.php', + 'JMS\\Serializer\\Exception\\UnsupportedFormatException' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Exception/UnsupportedFormatException.php', + 'JMS\\Serializer\\Exception\\ValidationFailedException' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Exception/ValidationFailedException.php', + 'JMS\\Serializer\\Exception\\XmlErrorException' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Exception/XmlErrorException.php', + 'JMS\\Serializer\\Exclusion\\DepthExclusionStrategy' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Exclusion/DepthExclusionStrategy.php', + 'JMS\\Serializer\\Exclusion\\DisjunctExclusionStrategy' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Exclusion/DisjunctExclusionStrategy.php', + 'JMS\\Serializer\\Exclusion\\ExclusionStrategyInterface' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Exclusion/ExclusionStrategyInterface.php', + 'JMS\\Serializer\\Exclusion\\ExpressionLanguageExclusionStrategy' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Exclusion/ExpressionLanguageExclusionStrategy.php', + 'JMS\\Serializer\\Exclusion\\GroupsExclusionStrategy' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Exclusion/GroupsExclusionStrategy.php', + 'JMS\\Serializer\\Exclusion\\VersionExclusionStrategy' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Exclusion/VersionExclusionStrategy.php', + 'JMS\\Serializer\\Expression\\ExpressionEvaluator' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Expression/ExpressionEvaluator.php', + 'JMS\\Serializer\\Expression\\ExpressionEvaluatorInterface' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Expression/ExpressionEvaluatorInterface.php', + 'JMS\\Serializer\\GenericDeserializationVisitor' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/GenericDeserializationVisitor.php', + 'JMS\\Serializer\\GenericSerializationVisitor' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/GenericSerializationVisitor.php', + 'JMS\\Serializer\\GraphNavigator' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/GraphNavigator.php', + 'JMS\\Serializer\\Handler\\ArrayCollectionHandler' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Handler/ArrayCollectionHandler.php', + 'JMS\\Serializer\\Handler\\ConstraintViolationHandler' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Handler/ConstraintViolationHandler.php', + 'JMS\\Serializer\\Handler\\DateHandler' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Handler/DateHandler.php', + 'JMS\\Serializer\\Handler\\FormErrorHandler' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Handler/FormErrorHandler.php', + 'JMS\\Serializer\\Handler\\HandlerRegistry' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Handler/HandlerRegistry.php', + 'JMS\\Serializer\\Handler\\HandlerRegistryInterface' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Handler/HandlerRegistryInterface.php', + 'JMS\\Serializer\\Handler\\LazyHandlerRegistry' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Handler/LazyHandlerRegistry.php', + 'JMS\\Serializer\\Handler\\PhpCollectionHandler' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Handler/PhpCollectionHandler.php', + 'JMS\\Serializer\\Handler\\PropelCollectionHandler' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Handler/PropelCollectionHandler.php', + 'JMS\\Serializer\\Handler\\StdClassHandler' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Handler/StdClassHandler.php', + 'JMS\\Serializer\\Handler\\SubscribingHandlerInterface' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Handler/SubscribingHandlerInterface.php', + 'JMS\\Serializer\\JsonDeserializationVisitor' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/JsonDeserializationVisitor.php', + 'JMS\\Serializer\\JsonSerializationVisitor' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/JsonSerializationVisitor.php', + 'JMS\\Serializer\\Metadata\\ClassMetadata' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Metadata/ClassMetadata.php', + 'JMS\\Serializer\\Metadata\\Driver\\AbstractDoctrineTypeDriver' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Metadata/Driver/AbstractDoctrineTypeDriver.php', + 'JMS\\Serializer\\Metadata\\Driver\\AnnotationDriver' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Metadata/Driver/AnnotationDriver.php', + 'JMS\\Serializer\\Metadata\\Driver\\DoctrinePHPCRTypeDriver' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Metadata/Driver/DoctrinePHPCRTypeDriver.php', + 'JMS\\Serializer\\Metadata\\Driver\\DoctrineTypeDriver' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Metadata/Driver/DoctrineTypeDriver.php', + 'JMS\\Serializer\\Metadata\\Driver\\PhpDriver' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Metadata/Driver/PhpDriver.php', + 'JMS\\Serializer\\Metadata\\Driver\\XmlDriver' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Metadata/Driver/XmlDriver.php', + 'JMS\\Serializer\\Metadata\\Driver\\YamlDriver' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Metadata/Driver/YamlDriver.php', + 'JMS\\Serializer\\Metadata\\ExpressionPropertyMetadata' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Metadata/ExpressionPropertyMetadata.php', + 'JMS\\Serializer\\Metadata\\PropertyMetadata' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Metadata/PropertyMetadata.php', + 'JMS\\Serializer\\Metadata\\StaticPropertyMetadata' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Metadata/StaticPropertyMetadata.php', + 'JMS\\Serializer\\Metadata\\VirtualPropertyMetadata' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Metadata/VirtualPropertyMetadata.php', + 'JMS\\Serializer\\Naming\\CacheNamingStrategy' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Naming/CacheNamingStrategy.php', + 'JMS\\Serializer\\Naming\\CamelCaseNamingStrategy' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Naming/CamelCaseNamingStrategy.php', + 'JMS\\Serializer\\Naming\\IdenticalPropertyNamingStrategy' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Naming/IdenticalPropertyNamingStrategy.php', + 'JMS\\Serializer\\Naming\\PropertyNamingStrategyInterface' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Naming/PropertyNamingStrategyInterface.php', + 'JMS\\Serializer\\Naming\\SerializedNameAnnotationStrategy' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Naming/SerializedNameAnnotationStrategy.php', + 'JMS\\Serializer\\SerializationContext' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/SerializationContext.php', + 'JMS\\Serializer\\Serializer' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Serializer.php', + 'JMS\\Serializer\\SerializerBuilder' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/SerializerBuilder.php', + 'JMS\\Serializer\\SerializerInterface' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/SerializerInterface.php', + 'JMS\\Serializer\\Twig\\SerializerExtension' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Twig/SerializerExtension.php', + 'JMS\\Serializer\\Twig\\SerializerRuntimeExtension' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Twig/SerializerRuntimeExtension.php', + 'JMS\\Serializer\\Twig\\SerializerRuntimeHelper' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Twig/SerializerRuntimeHelper.php', + 'JMS\\Serializer\\TypeParser' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/TypeParser.php', + 'JMS\\Serializer\\Util\\Writer' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/Util/Writer.php', + 'JMS\\Serializer\\VisitorInterface' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/VisitorInterface.php', + 'JMS\\Serializer\\XmlDeserializationVisitor' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/XmlDeserializationVisitor.php', + 'JMS\\Serializer\\XmlSerializationVisitor' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/XmlSerializationVisitor.php', + 'JMS\\Serializer\\YamlSerializationVisitor' => __DIR__ . '/..' . '/jms/serializer/src/JMS/Serializer/YamlSerializationVisitor.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/Highlighter.php', 'Masterminds\\HTML5' => __DIR__ . '/..' . '/masterminds/html5/src/HTML5.php', 'Masterminds\\HTML5\\Elements' => __DIR__ . '/..' . '/masterminds/html5/src/HTML5/Elements.php', 'Masterminds\\HTML5\\Entities' => __DIR__ . '/..' . '/masterminds/html5/src/HTML5/Entities.php', @@ -813,9 +1522,524 @@ class ComposerStaticInit444c3f31864f68a3f466e2c19837e185 'Masterminds\\HTML5\\Serializer\\OutputRules' => __DIR__ . '/..' . '/masterminds/html5/src/HTML5/Serializer/OutputRules.php', 'Masterminds\\HTML5\\Serializer\\RulesInterface' => __DIR__ . '/..' . '/masterminds/html5/src/HTML5/Serializer/RulesInterface.php', 'Masterminds\\HTML5\\Serializer\\Traverser' => __DIR__ . '/..' . '/masterminds/html5/src/HTML5/Serializer/Traverser.php', + 'Metadata\\AdvancedMetadataFactoryInterface' => __DIR__ . '/..' . '/jms/metadata/src/Metadata/AdvancedMetadataFactoryInterface.php', + 'Metadata\\Cache\\CacheInterface' => __DIR__ . '/..' . '/jms/metadata/src/Metadata/Cache/CacheInterface.php', + 'Metadata\\Cache\\DoctrineCacheAdapter' => __DIR__ . '/..' . '/jms/metadata/src/Metadata/Cache/DoctrineCacheAdapter.php', + 'Metadata\\Cache\\FileCache' => __DIR__ . '/..' . '/jms/metadata/src/Metadata/Cache/FileCache.php', + 'Metadata\\Cache\\PsrCacheAdapter' => __DIR__ . '/..' . '/jms/metadata/src/Metadata/Cache/PsrCacheAdapter.php', + 'Metadata\\ClassHierarchyMetadata' => __DIR__ . '/..' . '/jms/metadata/src/Metadata/ClassHierarchyMetadata.php', + 'Metadata\\ClassMetadata' => __DIR__ . '/..' . '/jms/metadata/src/Metadata/ClassMetadata.php', + 'Metadata\\Driver\\AbstractFileDriver' => __DIR__ . '/..' . '/jms/metadata/src/Metadata/Driver/AbstractFileDriver.php', + 'Metadata\\Driver\\AdvancedDriverInterface' => __DIR__ . '/..' . '/jms/metadata/src/Metadata/Driver/AdvancedDriverInterface.php', + 'Metadata\\Driver\\AdvancedFileLocatorInterface' => __DIR__ . '/..' . '/jms/metadata/src/Metadata/Driver/AdvancedFileLocatorInterface.php', + 'Metadata\\Driver\\DriverChain' => __DIR__ . '/..' . '/jms/metadata/src/Metadata/Driver/DriverChain.php', + 'Metadata\\Driver\\DriverInterface' => __DIR__ . '/..' . '/jms/metadata/src/Metadata/Driver/DriverInterface.php', + 'Metadata\\Driver\\FileLocator' => __DIR__ . '/..' . '/jms/metadata/src/Metadata/Driver/FileLocator.php', + 'Metadata\\Driver\\FileLocatorInterface' => __DIR__ . '/..' . '/jms/metadata/src/Metadata/Driver/FileLocatorInterface.php', + 'Metadata\\Driver\\LazyLoadingDriver' => __DIR__ . '/..' . '/jms/metadata/src/Metadata/Driver/LazyLoadingDriver.php', + 'Metadata\\MergeableClassMetadata' => __DIR__ . '/..' . '/jms/metadata/src/Metadata/MergeableClassMetadata.php', + 'Metadata\\MergeableInterface' => __DIR__ . '/..' . '/jms/metadata/src/Metadata/MergeableInterface.php', + 'Metadata\\MetadataFactory' => __DIR__ . '/..' . '/jms/metadata/src/Metadata/MetadataFactory.php', + 'Metadata\\MetadataFactoryInterface' => __DIR__ . '/..' . '/jms/metadata/src/Metadata/MetadataFactoryInterface.php', + 'Metadata\\MethodMetadata' => __DIR__ . '/..' . '/jms/metadata/src/Metadata/MethodMetadata.php', + 'Metadata\\NullMetadata' => __DIR__ . '/..' . '/jms/metadata/src/Metadata/NullMetadata.php', + 'Metadata\\PropertyMetadata' => __DIR__ . '/..' . '/jms/metadata/src/Metadata/PropertyMetadata.php', + 'Metadata\\Version' => __DIR__ . '/..' . '/jms/metadata/src/Metadata/Version.php', 'Michelf\\Markdown' => __DIR__ . '/..' . '/michelf/php-markdown/Michelf/Markdown.php', 'Michelf\\MarkdownExtra' => __DIR__ . '/..' . '/michelf/php-markdown/Michelf/MarkdownExtra.php', 'Michelf\\MarkdownInterface' => __DIR__ . '/..' . '/michelf/php-markdown/Michelf/MarkdownInterface.php', + 'Monolog\\ErrorHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/ErrorHandler.php', + 'Monolog\\Formatter\\ChromePHPFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php', + 'Monolog\\Formatter\\ElasticaFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php', + 'Monolog\\Formatter\\FlowdockFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php', + 'Monolog\\Formatter\\FluentdFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php', + 'Monolog\\Formatter\\FormatterInterface' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php', + 'Monolog\\Formatter\\GelfMessageFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php', + 'Monolog\\Formatter\\HtmlFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php', + 'Monolog\\Formatter\\JsonFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php', + 'Monolog\\Formatter\\LineFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/LineFormatter.php', + 'Monolog\\Formatter\\LogglyFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php', + 'Monolog\\Formatter\\LogstashFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php', + 'Monolog\\Formatter\\MongoDBFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php', + 'Monolog\\Formatter\\NormalizerFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php', + 'Monolog\\Formatter\\ScalarFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php', + 'Monolog\\Formatter\\WildfireFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php', + 'Monolog\\Handler\\AbstractHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/AbstractHandler.php', + 'Monolog\\Handler\\AbstractProcessingHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php', + 'Monolog\\Handler\\AbstractSyslogHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php', + 'Monolog\\Handler\\AmqpHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/AmqpHandler.php', + 'Monolog\\Handler\\BrowserConsoleHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php', + 'Monolog\\Handler\\BufferHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/BufferHandler.php', + 'Monolog\\Handler\\ChromePHPHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php', + 'Monolog\\Handler\\CouchDBHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php', + 'Monolog\\Handler\\CubeHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/CubeHandler.php', + 'Monolog\\Handler\\Curl\\Util' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/Curl/Util.php', + 'Monolog\\Handler\\DeduplicationHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php', + 'Monolog\\Handler\\DoctrineCouchDBHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php', + 'Monolog\\Handler\\DynamoDbHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php', + 'Monolog\\Handler\\ElasticSearchHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php', + 'Monolog\\Handler\\ErrorLogHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php', + 'Monolog\\Handler\\FilterHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FilterHandler.php', + 'Monolog\\Handler\\FingersCrossedHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php', + 'Monolog\\Handler\\FingersCrossed\\ActivationStrategyInterface' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php', + 'Monolog\\Handler\\FingersCrossed\\ChannelLevelActivationStrategy' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php', + 'Monolog\\Handler\\FingersCrossed\\ErrorLevelActivationStrategy' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php', + 'Monolog\\Handler\\FirePHPHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php', + 'Monolog\\Handler\\FleepHookHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php', + 'Monolog\\Handler\\FlowdockHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php', + 'Monolog\\Handler\\FormattableHandlerInterface' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.php', + 'Monolog\\Handler\\FormattableHandlerTrait' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.php', + 'Monolog\\Handler\\GelfHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/GelfHandler.php', + 'Monolog\\Handler\\GroupHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/GroupHandler.php', + 'Monolog\\Handler\\HandlerInterface' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/HandlerInterface.php', + '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', + 'Monolog\\Handler\\MandrillHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/MandrillHandler.php', + 'Monolog\\Handler\\MissingExtensionException' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php', + 'Monolog\\Handler\\MongoDBHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php', + 'Monolog\\Handler\\NativeMailerHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php', + 'Monolog\\Handler\\NewRelicHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php', + 'Monolog\\Handler\\NullHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/NullHandler.php', + 'Monolog\\Handler\\PHPConsoleHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php', + 'Monolog\\Handler\\ProcessableHandlerInterface' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.php', + 'Monolog\\Handler\\ProcessableHandlerTrait' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.php', + 'Monolog\\Handler\\PsrHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/PsrHandler.php', + 'Monolog\\Handler\\PushoverHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/PushoverHandler.php', + 'Monolog\\Handler\\RavenHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/RavenHandler.php', + 'Monolog\\Handler\\RedisHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/RedisHandler.php', + 'Monolog\\Handler\\RollbarHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/RollbarHandler.php', + 'Monolog\\Handler\\RotatingFileHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php', + 'Monolog\\Handler\\SamplingHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SamplingHandler.php', + 'Monolog\\Handler\\SlackHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SlackHandler.php', + 'Monolog\\Handler\\SlackWebhookHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php', + 'Monolog\\Handler\\Slack\\SlackRecord' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php', + 'Monolog\\Handler\\SlackbotHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SlackbotHandler.php', + 'Monolog\\Handler\\SocketHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SocketHandler.php', + 'Monolog\\Handler\\StreamHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/StreamHandler.php', + 'Monolog\\Handler\\SwiftMailerHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php', + 'Monolog\\Handler\\SyslogHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SyslogHandler.php', + 'Monolog\\Handler\\SyslogUdpHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php', + 'Monolog\\Handler\\SyslogUdp\\UdpSocket' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php', + 'Monolog\\Handler\\TestHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/TestHandler.php', + 'Monolog\\Handler\\WhatFailureGroupHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php', + 'Monolog\\Handler\\ZendMonitorHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php', + 'Monolog\\Logger' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Logger.php', + 'Monolog\\Processor\\GitProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/GitProcessor.php', + 'Monolog\\Processor\\IntrospectionProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php', + 'Monolog\\Processor\\MemoryPeakUsageProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php', + 'Monolog\\Processor\\MemoryProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php', + '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', + 'Neutron\\TemporaryFilesystem\\IOException' => __DIR__ . '/..' . '/neutron/temporary-filesystem/src/Neutron/TemporaryFilesystem/IOException.php', + 'Neutron\\TemporaryFilesystem\\Manager' => __DIR__ . '/..' . '/neutron/temporary-filesystem/src/Neutron/TemporaryFilesystem/Manager.php', + 'Neutron\\TemporaryFilesystem\\TemporaryFilesystem' => __DIR__ . '/..' . '/neutron/temporary-filesystem/src/Neutron/TemporaryFilesystem/TemporaryFilesystem.php', + 'Neutron\\TemporaryFilesystem\\TemporaryFilesystemInterface' => __DIR__ . '/..' . '/neutron/temporary-filesystem/src/Neutron/TemporaryFilesystem/TemporaryFilesystemInterface.php', + 'PHPUnit\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Exception.php', + 'PHPUnit\\Framework\\Assert' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Assert.php', + 'PHPUnit\\Framework\\AssertionFailedError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/AssertionFailedError.php', + 'PHPUnit\\Framework\\CodeCoverageException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/CodeCoverageException.php', + 'PHPUnit\\Framework\\Constraint\\ArrayHasKey' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ArrayHasKey.php', + 'PHPUnit\\Framework\\Constraint\\ArraySubset' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ArraySubset.php', + 'PHPUnit\\Framework\\Constraint\\Attribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Attribute.php', + 'PHPUnit\\Framework\\Constraint\\Callback' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Callback.php', + 'PHPUnit\\Framework\\Constraint\\ClassHasAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ClassHasAttribute.php', + 'PHPUnit\\Framework\\Constraint\\ClassHasStaticAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ClassHasStaticAttribute.php', + 'PHPUnit\\Framework\\Constraint\\Composite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Composite.php', + 'PHPUnit\\Framework\\Constraint\\Constraint' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Constraint.php', + 'PHPUnit\\Framework\\Constraint\\Count' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Count.php', + 'PHPUnit\\Framework\\Constraint\\DirectoryExists' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/DirectoryExists.php', + 'PHPUnit\\Framework\\Constraint\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Exception.php', + 'PHPUnit\\Framework\\Constraint\\ExceptionCode' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ExceptionCode.php', + 'PHPUnit\\Framework\\Constraint\\ExceptionMessage' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessage.php', + 'PHPUnit\\Framework\\Constraint\\ExceptionMessageRegularExpression' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessageRegularExpression.php', + 'PHPUnit\\Framework\\Constraint\\FileExists' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/FileExists.php', + 'PHPUnit\\Framework\\Constraint\\GreaterThan' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/GreaterThan.php', + 'PHPUnit\\Framework\\Constraint\\IsAnything' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsAnything.php', + 'PHPUnit\\Framework\\Constraint\\IsEmpty' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsEmpty.php', + 'PHPUnit\\Framework\\Constraint\\IsEqual' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsEqual.php', + 'PHPUnit\\Framework\\Constraint\\IsFalse' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsFalse.php', + 'PHPUnit\\Framework\\Constraint\\IsFinite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsFinite.php', + 'PHPUnit\\Framework\\Constraint\\IsIdentical' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php', + 'PHPUnit\\Framework\\Constraint\\IsInfinite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsInfinite.php', + 'PHPUnit\\Framework\\Constraint\\IsInstanceOf' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsInstanceOf.php', + 'PHPUnit\\Framework\\Constraint\\IsJson' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsJson.php', + 'PHPUnit\\Framework\\Constraint\\IsNan' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsNan.php', + 'PHPUnit\\Framework\\Constraint\\IsNull' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsNull.php', + 'PHPUnit\\Framework\\Constraint\\IsReadable' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsReadable.php', + 'PHPUnit\\Framework\\Constraint\\IsTrue' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsTrue.php', + 'PHPUnit\\Framework\\Constraint\\IsType' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsType.php', + 'PHPUnit\\Framework\\Constraint\\IsWritable' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsWritable.php', + 'PHPUnit\\Framework\\Constraint\\JsonMatches' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php', + 'PHPUnit\\Framework\\Constraint\\JsonMatchesErrorMessageProvider' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/JsonMatchesErrorMessageProvider.php', + 'PHPUnit\\Framework\\Constraint\\LessThan' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/LessThan.php', + 'PHPUnit\\Framework\\Constraint\\LogicalAnd' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/LogicalAnd.php', + 'PHPUnit\\Framework\\Constraint\\LogicalNot' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/LogicalNot.php', + 'PHPUnit\\Framework\\Constraint\\LogicalOr' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/LogicalOr.php', + 'PHPUnit\\Framework\\Constraint\\LogicalXor' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/LogicalXor.php', + 'PHPUnit\\Framework\\Constraint\\ObjectHasAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ObjectHasAttribute.php', + 'PHPUnit\\Framework\\Constraint\\RegularExpression' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/RegularExpression.php', + 'PHPUnit\\Framework\\Constraint\\SameSize' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/SameSize.php', + 'PHPUnit\\Framework\\Constraint\\StringContains' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/StringContains.php', + 'PHPUnit\\Framework\\Constraint\\StringEndsWith' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/StringEndsWith.php', + 'PHPUnit\\Framework\\Constraint\\StringMatchesFormatDescription' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/StringMatchesFormatDescription.php', + 'PHPUnit\\Framework\\Constraint\\StringStartsWith' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/StringStartsWith.php', + 'PHPUnit\\Framework\\Constraint\\TraversableContains' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/TraversableContains.php', + 'PHPUnit\\Framework\\Constraint\\TraversableContainsEqual' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/TraversableContainsEqual.php', + 'PHPUnit\\Framework\\Constraint\\TraversableContainsIdentical' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/TraversableContainsIdentical.php', + 'PHPUnit\\Framework\\Constraint\\TraversableContainsOnly' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/TraversableContainsOnly.php', + 'PHPUnit\\Framework\\CoveredCodeNotExecutedException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/CoveredCodeNotExecutedException.php', + 'PHPUnit\\Framework\\DataProviderTestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/DataProviderTestSuite.php', + 'PHPUnit\\Framework\\Error\\Deprecated' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error/Deprecated.php', + 'PHPUnit\\Framework\\Error\\Error' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error/Error.php', + 'PHPUnit\\Framework\\Error\\Notice' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error/Notice.php', + 'PHPUnit\\Framework\\Error\\Warning' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error/Warning.php', + 'PHPUnit\\Framework\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/Exception.php', + 'PHPUnit\\Framework\\ExceptionWrapper' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/ExceptionWrapper.php', + 'PHPUnit\\Framework\\ExpectationFailedException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/ExpectationFailedException.php', + 'PHPUnit\\Framework\\IncompleteTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/IncompleteTest.php', + 'PHPUnit\\Framework\\IncompleteTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/IncompleteTestCase.php', + 'PHPUnit\\Framework\\IncompleteTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/IncompleteTestError.php', + 'PHPUnit\\Framework\\InvalidArgumentException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/InvalidArgumentException.php', + 'PHPUnit\\Framework\\InvalidCoversTargetException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/InvalidCoversTargetException.php', + 'PHPUnit\\Framework\\InvalidDataProviderException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/InvalidDataProviderException.php', + 'PHPUnit\\Framework\\InvalidParameterGroupException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/InvalidParameterGroupException.php', + 'PHPUnit\\Framework\\MissingCoversAnnotationException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/MissingCoversAnnotationException.php', + 'PHPUnit\\Framework\\MockObject\\Api' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Api/Api.php', + 'PHPUnit\\Framework\\MockObject\\BadMethodCallException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/BadMethodCallException.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\Identity' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/Identity.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\InvocationMocker' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationMocker.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\InvocationStubber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationStubber.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\Match' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/Match.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\MethodNameMatch' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/MethodNameMatch.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\ParametersMatch' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/ParametersMatch.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\Stub' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/Stub.php', + 'PHPUnit\\Framework\\MockObject\\ConfigurableMethod' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/ConfigurableMethod.php', + 'PHPUnit\\Framework\\MockObject\\ConfigurableMethodsAlreadyInitializedException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/ConfigurableMethodsAlreadyInitializedException.php', + 'PHPUnit\\Framework\\MockObject\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/Exception.php', + 'PHPUnit\\Framework\\MockObject\\Generator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator.php', + 'PHPUnit\\Framework\\MockObject\\IncompatibleReturnValueException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/IncompatibleReturnValueException.php', + 'PHPUnit\\Framework\\MockObject\\Invocation' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Invocation.php', + 'PHPUnit\\Framework\\MockObject\\InvocationHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/InvocationHandler.php', + 'PHPUnit\\Framework\\MockObject\\Matcher' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Matcher.php', + 'PHPUnit\\Framework\\MockObject\\Method' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Api/Method.php', + 'PHPUnit\\Framework\\MockObject\\MethodNameConstraint' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MethodNameConstraint.php', + 'PHPUnit\\Framework\\MockObject\\MockBuilder' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php', + 'PHPUnit\\Framework\\MockObject\\MockClass' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockClass.php', + 'PHPUnit\\Framework\\MockObject\\MockMethod' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockMethod.php', + 'PHPUnit\\Framework\\MockObject\\MockMethodSet' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockMethodSet.php', + 'PHPUnit\\Framework\\MockObject\\MockObject' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockObject.php', + 'PHPUnit\\Framework\\MockObject\\MockTrait' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockTrait.php', + 'PHPUnit\\Framework\\MockObject\\MockType' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockType.php', + 'PHPUnit\\Framework\\MockObject\\MockedCloneMethod' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Api/MockedCloneMethod.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\AnyInvokedCount' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/AnyInvokedCount.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\AnyParameters' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/AnyParameters.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\ConsecutiveParameters' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/ConsecutiveParameters.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\InvocationOrder' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvocationOrder.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtIndex' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtIndex.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtLeastCount' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastCount.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtLeastOnce' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastOnce.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtMostCount' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtMostCount.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedCount' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedCount.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\MethodName' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/MethodName.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\Parameters' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/Parameters.php', + 'PHPUnit\\Framework\\MockObject\\Rule\\ParametersRule' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/ParametersRule.php', + 'PHPUnit\\Framework\\MockObject\\RuntimeException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/RuntimeException.php', + 'PHPUnit\\Framework\\MockObject\\Stub' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ConsecutiveCalls' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ConsecutiveCalls.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/Exception.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnArgument' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnArgument.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnCallback' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnCallback.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnReference' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnReference.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnSelf' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnSelf.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnStub' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnStub.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnValueMap' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnValueMap.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\Stub' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/Stub.php', + 'PHPUnit\\Framework\\MockObject\\UnmockedCloneMethod' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Api/UnmockedCloneMethod.php', + 'PHPUnit\\Framework\\MockObject\\Verifiable' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Verifiable.php', + 'PHPUnit\\Framework\\NoChildTestSuiteException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/NoChildTestSuiteException.php', + 'PHPUnit\\Framework\\OutputError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/OutputError.php', + 'PHPUnit\\Framework\\PHPTAssertionFailedError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/PHPTAssertionFailedError.php', + 'PHPUnit\\Framework\\RiskyTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/RiskyTestError.php', + 'PHPUnit\\Framework\\SelfDescribing' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SelfDescribing.php', + 'PHPUnit\\Framework\\SkippedTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SkippedTest.php', + 'PHPUnit\\Framework\\SkippedTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SkippedTestCase.php', + 'PHPUnit\\Framework\\SkippedTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/SkippedTestError.php', + 'PHPUnit\\Framework\\SkippedTestSuiteError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/SkippedTestSuiteError.php', + 'PHPUnit\\Framework\\SyntheticError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/SyntheticError.php', + 'PHPUnit\\Framework\\SyntheticSkippedError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/SyntheticSkippedError.php', + 'PHPUnit\\Framework\\Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Test.php', + 'PHPUnit\\Framework\\TestBuilder' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestBuilder.php', + 'PHPUnit\\Framework\\TestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestCase.php', + 'PHPUnit\\Framework\\TestFailure' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestFailure.php', + 'PHPUnit\\Framework\\TestListener' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestListener.php', + 'PHPUnit\\Framework\\TestListenerDefaultImplementation' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestListenerDefaultImplementation.php', + 'PHPUnit\\Framework\\TestResult' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestResult.php', + 'PHPUnit\\Framework\\TestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestSuite.php', + 'PHPUnit\\Framework\\TestSuiteIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestSuiteIterator.php', + 'PHPUnit\\Framework\\UnintentionallyCoveredCodeError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/UnintentionallyCoveredCodeError.php', + 'PHPUnit\\Framework\\Warning' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/Warning.php', + 'PHPUnit\\Framework\\WarningTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/WarningTestCase.php', + 'PHPUnit\\Runner\\AfterIncompleteTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterIncompleteTestHook.php', + 'PHPUnit\\Runner\\AfterLastTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterLastTestHook.php', + 'PHPUnit\\Runner\\AfterRiskyTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterRiskyTestHook.php', + 'PHPUnit\\Runner\\AfterSkippedTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterSkippedTestHook.php', + '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', + 'PHPUnit\\Runner\\BeforeTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/BeforeTestHook.php', + 'PHPUnit\\Runner\\DefaultTestResultCache' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/DefaultTestResultCache.php', + 'PHPUnit\\Runner\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception.php', + 'PHPUnit\\Runner\\Filter\\ExcludeGroupFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/ExcludeGroupFilterIterator.php', + 'PHPUnit\\Runner\\Filter\\Factory' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/Factory.php', + 'PHPUnit\\Runner\\Filter\\GroupFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php', + 'PHPUnit\\Runner\\Filter\\IncludeGroupFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/IncludeGroupFilterIterator.php', + 'PHPUnit\\Runner\\Filter\\NameFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php', + 'PHPUnit\\Runner\\Hook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/Hook.php', + 'PHPUnit\\Runner\\NullTestResultCache' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/NullTestResultCache.php', + 'PHPUnit\\Runner\\PhptTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/PhptTestCase.php', + 'PHPUnit\\Runner\\ResultCacheExtension' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ResultCacheExtension.php', + 'PHPUnit\\Runner\\StandardTestSuiteLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php', + 'PHPUnit\\Runner\\TestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/TestHook.php', + 'PHPUnit\\Runner\\TestListenerAdapter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/TestListenerAdapter.php', + 'PHPUnit\\Runner\\TestResultCache' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResultCache.php', + 'PHPUnit\\Runner\\TestSuiteLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestSuiteLoader.php', + 'PHPUnit\\Runner\\TestSuiteSorter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestSuiteSorter.php', + 'PHPUnit\\Runner\\Version' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Version.php', + 'PHPUnit\\TextUI\\Command' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command.php', + 'PHPUnit\\TextUI\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Exception.php', + 'PHPUnit\\TextUI\\Help' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Help.php', + 'PHPUnit\\TextUI\\ResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/ResultPrinter.php', + 'PHPUnit\\TextUI\\TestRunner' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/TestRunner.php', + 'PHPUnit\\Util\\Annotation\\DocBlock' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Annotation/DocBlock.php', + 'PHPUnit\\Util\\Annotation\\Registry' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Annotation/Registry.php', + 'PHPUnit\\Util\\Blacklist' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Blacklist.php', + 'PHPUnit\\Util\\Color' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Color.php', + 'PHPUnit\\Util\\Configuration' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Configuration.php', + 'PHPUnit\\Util\\ConfigurationGenerator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/ConfigurationGenerator.php', + 'PHPUnit\\Util\\ErrorHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/ErrorHandler.php', + 'PHPUnit\\Util\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Exception.php', + 'PHPUnit\\Util\\FileLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/FileLoader.php', + 'PHPUnit\\Util\\Filesystem' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Filesystem.php', + 'PHPUnit\\Util\\Filter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Filter.php', + 'PHPUnit\\Util\\Getopt' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Getopt.php', + 'PHPUnit\\Util\\GlobalState' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/GlobalState.php', + 'PHPUnit\\Util\\InvalidDataSetException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/InvalidDataSetException.php', + 'PHPUnit\\Util\\Json' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Json.php', + 'PHPUnit\\Util\\Log\\JUnit' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Log/JUnit.php', + 'PHPUnit\\Util\\Log\\TeamCity' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Log/TeamCity.php', + 'PHPUnit\\Util\\PHP\\AbstractPhpProcess' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP/AbstractPhpProcess.php', + 'PHPUnit\\Util\\PHP\\DefaultPhpProcess' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php', + 'PHPUnit\\Util\\PHP\\WindowsPhpProcess' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP/WindowsPhpProcess.php', + 'PHPUnit\\Util\\Printer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Printer.php', + 'PHPUnit\\Util\\RegularExpression' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/RegularExpression.php', + 'PHPUnit\\Util\\Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Test.php', + 'PHPUnit\\Util\\TestDox\\CliTestDoxPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php', + 'PHPUnit\\Util\\TestDox\\HtmlResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/HtmlResultPrinter.php', + 'PHPUnit\\Util\\TestDox\\NamePrettifier' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php', + 'PHPUnit\\Util\\TestDox\\ResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter.php', + 'PHPUnit\\Util\\TestDox\\TestDoxPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/TestDoxPrinter.php', + 'PHPUnit\\Util\\TestDox\\TextResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/TextResultPrinter.php', + 'PHPUnit\\Util\\TestDox\\XmlResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/XmlResultPrinter.php', + 'PHPUnit\\Util\\TextTestListRenderer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TextTestListRenderer.php', + 'PHPUnit\\Util\\Type' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Type.php', + 'PHPUnit\\Util\\VersionComparisonOperator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/VersionComparisonOperator.php', + 'PHPUnit\\Util\\XdebugFilterScriptGenerator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/XdebugFilterScriptGenerator.php', + 'PHPUnit\\Util\\Xml' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Xml.php', + 'PHPUnit\\Util\\XmlTestListRenderer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/XmlTestListRenderer.php', + 'PHP_Token' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_TokenWithScope' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_TokenWithScopeAndVisibility' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ABSTRACT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_AMPERSAND' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_AND_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ARRAY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ARRAY_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_AS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_AT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BACKTICK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BAD_CHARACTER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BOOLEAN_AND' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BOOLEAN_OR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BOOL_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BREAK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CALLABLE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CARET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CASE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CATCH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CHARACTER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLASS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLASS_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLASS_NAME_CONSTANT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLONE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLOSE_BRACKET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLOSE_CURLY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLOSE_SQUARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLOSE_TAG' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_COALESCE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_COALESCE_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_COLON' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_COMMA' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_COMMENT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CONCAT_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CONST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CONSTANT_ENCAPSED_STRING' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CONTINUE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CURLY_OPEN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DEC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DECLARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DEFAULT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DIR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DIV' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DIV_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DNUMBER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DO' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOC_COMMENT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOLLAR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOLLAR_OPEN_CURLY_BRACES' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOUBLE_ARROW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOUBLE_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOUBLE_COLON' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOUBLE_QUOTES' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ECHO' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ELLIPSIS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ELSE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ELSEIF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EMPTY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENCAPSED_AND_WHITESPACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDDECLARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDFOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDFOREACH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDIF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDSWITCH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDWHILE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_END_HEREDOC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EVAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EXCLAMATION_MARK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EXIT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EXTENDS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FILE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FINAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FINALLY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FOREACH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FUNCTION' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FUNC_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_GLOBAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_GOTO' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_GT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_HALT_COMPILER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IMPLEMENTS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INCLUDE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INCLUDE_ONCE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INLINE_HTML' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INSTANCEOF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INSTEADOF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INTERFACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INT_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ISSET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_GREATER_OR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_IDENTICAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_NOT_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_NOT_IDENTICAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_SMALLER_OR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_Includes' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LINE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LIST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LNUMBER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LOGICAL_AND' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LOGICAL_OR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LOGICAL_XOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_METHOD_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_MINUS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_MINUS_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_MOD_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_MULT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_MUL_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_NAMESPACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_NEW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_NS_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_NS_SEPARATOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_NUM_STRING' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OBJECT_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OBJECT_OPERATOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OPEN_BRACKET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OPEN_CURLY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OPEN_SQUARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OPEN_TAG' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OPEN_TAG_WITH_ECHO' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PAAMAYIM_NEKUDOTAYIM' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PERCENT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PIPE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PLUS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PLUS_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_POW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_POW_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PRINT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PRIVATE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PROTECTED' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PUBLIC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_QUESTION_MARK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_REQUIRE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_REQUIRE_ONCE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_RETURN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SEMICOLON' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SL_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SPACESHIP' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_START_HEREDOC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_STATIC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_STRING' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_STRING_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_STRING_VARNAME' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SWITCH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_Stream' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token/Stream.php', + 'PHP_Token_Stream_CachingFactory' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php', + 'PHP_Token_THROW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_TILDE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_TRAIT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_TRAIT_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_TRY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_UNSET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_UNSET_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_USE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_USE_FUNCTION' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_Util' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token/Util.php', + 'PHP_Token_VAR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_VARIABLE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_WHILE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_WHITESPACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_XOR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_YIELD' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_YIELD_FROM' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'ParagonIE\\ConstantTime\\Base32' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/Base32.php', 'ParagonIE\\ConstantTime\\Base32Hex' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/Base32Hex.php', 'ParagonIE\\ConstantTime\\Base64' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/Base64.php', @@ -827,6 +2051,97 @@ class ComposerStaticInit444c3f31864f68a3f466e2c19837e185 'ParagonIE\\ConstantTime\\Encoding' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/Encoding.php', 'ParagonIE\\ConstantTime\\Hex' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/Hex.php', 'ParagonIE\\ConstantTime\\RFC4648' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/RFC4648.php', + 'Parsedown' => __DIR__ . '/..' . '/erusev/parsedown/Parsedown.php', + 'PharIo\\Manifest\\Application' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Application.php', + 'PharIo\\Manifest\\ApplicationName' => __DIR__ . '/..' . '/phar-io/manifest/src/values/ApplicationName.php', + 'PharIo\\Manifest\\Author' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Author.php', + 'PharIo\\Manifest\\AuthorCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/values/AuthorCollection.php', + 'PharIo\\Manifest\\AuthorCollectionIterator' => __DIR__ . '/..' . '/phar-io/manifest/src/values/AuthorCollectionIterator.php', + 'PharIo\\Manifest\\AuthorElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/AuthorElement.php', + 'PharIo\\Manifest\\AuthorElementCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/AuthorElementCollection.php', + 'PharIo\\Manifest\\BundledComponent' => __DIR__ . '/..' . '/phar-io/manifest/src/values/BundledComponent.php', + 'PharIo\\Manifest\\BundledComponentCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/values/BundledComponentCollection.php', + 'PharIo\\Manifest\\BundledComponentCollectionIterator' => __DIR__ . '/..' . '/phar-io/manifest/src/values/BundledComponentCollectionIterator.php', + 'PharIo\\Manifest\\BundlesElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/BundlesElement.php', + 'PharIo\\Manifest\\ComponentElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ComponentElement.php', + 'PharIo\\Manifest\\ComponentElementCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ComponentElementCollection.php', + 'PharIo\\Manifest\\ContainsElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ContainsElement.php', + 'PharIo\\Manifest\\CopyrightElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/CopyrightElement.php', + 'PharIo\\Manifest\\CopyrightInformation' => __DIR__ . '/..' . '/phar-io/manifest/src/values/CopyrightInformation.php', + 'PharIo\\Manifest\\ElementCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ElementCollection.php', + 'PharIo\\Manifest\\Email' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Email.php', + 'PharIo\\Manifest\\Exception' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/Exception.php', + 'PharIo\\Manifest\\ExtElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ExtElement.php', + 'PharIo\\Manifest\\ExtElementCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ExtElementCollection.php', + 'PharIo\\Manifest\\Extension' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Extension.php', + 'PharIo\\Manifest\\ExtensionElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ExtensionElement.php', + 'PharIo\\Manifest\\InvalidApplicationNameException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php', + 'PharIo\\Manifest\\InvalidEmailException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/InvalidEmailException.php', + 'PharIo\\Manifest\\InvalidUrlException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/InvalidUrlException.php', + 'PharIo\\Manifest\\Library' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Library.php', + 'PharIo\\Manifest\\License' => __DIR__ . '/..' . '/phar-io/manifest/src/values/License.php', + 'PharIo\\Manifest\\LicenseElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/LicenseElement.php', + 'PharIo\\Manifest\\Manifest' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Manifest.php', + 'PharIo\\Manifest\\ManifestDocument' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ManifestDocument.php', + 'PharIo\\Manifest\\ManifestDocumentException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/ManifestDocumentException.php', + 'PharIo\\Manifest\\ManifestDocumentLoadingException' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ManifestDocumentLoadingException.php', + 'PharIo\\Manifest\\ManifestDocumentMapper' => __DIR__ . '/..' . '/phar-io/manifest/src/ManifestDocumentMapper.php', + 'PharIo\\Manifest\\ManifestDocumentMapperException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/ManifestDocumentMapperException.php', + 'PharIo\\Manifest\\ManifestElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ManifestElement.php', + 'PharIo\\Manifest\\ManifestElementException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/ManifestElementException.php', + 'PharIo\\Manifest\\ManifestLoader' => __DIR__ . '/..' . '/phar-io/manifest/src/ManifestLoader.php', + 'PharIo\\Manifest\\ManifestLoaderException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/ManifestLoaderException.php', + 'PharIo\\Manifest\\ManifestSerializer' => __DIR__ . '/..' . '/phar-io/manifest/src/ManifestSerializer.php', + 'PharIo\\Manifest\\PhpElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/PhpElement.php', + 'PharIo\\Manifest\\PhpExtensionRequirement' => __DIR__ . '/..' . '/phar-io/manifest/src/values/PhpExtensionRequirement.php', + 'PharIo\\Manifest\\PhpVersionRequirement' => __DIR__ . '/..' . '/phar-io/manifest/src/values/PhpVersionRequirement.php', + 'PharIo\\Manifest\\Requirement' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Requirement.php', + 'PharIo\\Manifest\\RequirementCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/values/RequirementCollection.php', + 'PharIo\\Manifest\\RequirementCollectionIterator' => __DIR__ . '/..' . '/phar-io/manifest/src/values/RequirementCollectionIterator.php', + 'PharIo\\Manifest\\RequiresElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/RequiresElement.php', + 'PharIo\\Manifest\\Type' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Type.php', + 'PharIo\\Manifest\\Url' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Url.php', + 'PharIo\\Version\\AbstractVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/AbstractVersionConstraint.php', + 'PharIo\\Version\\AndVersionConstraintGroup' => __DIR__ . '/..' . '/phar-io/version/src/constraints/AndVersionConstraintGroup.php', + 'PharIo\\Version\\AnyVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/AnyVersionConstraint.php', + 'PharIo\\Version\\ExactVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/ExactVersionConstraint.php', + 'PharIo\\Version\\Exception' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/Exception.php', + 'PharIo\\Version\\GreaterThanOrEqualToVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php', + 'PharIo\\Version\\InvalidPreReleaseSuffixException' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php', + 'PharIo\\Version\\InvalidVersionException' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/InvalidVersionException.php', + 'PharIo\\Version\\OrVersionConstraintGroup' => __DIR__ . '/..' . '/phar-io/version/src/constraints/OrVersionConstraintGroup.php', + 'PharIo\\Version\\PreReleaseSuffix' => __DIR__ . '/..' . '/phar-io/version/src/PreReleaseSuffix.php', + 'PharIo\\Version\\SpecificMajorAndMinorVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php', + 'PharIo\\Version\\SpecificMajorVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php', + 'PharIo\\Version\\UnsupportedVersionConstraintException' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/UnsupportedVersionConstraintException.php', + 'PharIo\\Version\\Version' => __DIR__ . '/..' . '/phar-io/version/src/Version.php', + 'PharIo\\Version\\VersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/VersionConstraint.php', + 'PharIo\\Version\\VersionConstraintParser' => __DIR__ . '/..' . '/phar-io/version/src/VersionConstraintParser.php', + 'PharIo\\Version\\VersionConstraintValue' => __DIR__ . '/..' . '/phar-io/version/src/VersionConstraintValue.php', + 'PharIo\\Version\\VersionNumber' => __DIR__ . '/..' . '/phar-io/version/src/VersionNumber.php', + 'PhpCollection\\AbstractCollection' => __DIR__ . '/..' . '/phpcollection/phpcollection/src/PhpCollection/AbstractCollection.php', + 'PhpCollection\\AbstractMap' => __DIR__ . '/..' . '/phpcollection/phpcollection/src/PhpCollection/AbstractMap.php', + 'PhpCollection\\AbstractSequence' => __DIR__ . '/..' . '/phpcollection/phpcollection/src/PhpCollection/AbstractSequence.php', + 'PhpCollection\\CollectionInterface' => __DIR__ . '/..' . '/phpcollection/phpcollection/src/PhpCollection/CollectionInterface.php', + 'PhpCollection\\EntityLikeObject' => __DIR__ . '/..' . '/phpcollection/phpcollection/src/PhpCollection/EntityLikeObject.php', + 'PhpCollection\\Map' => __DIR__ . '/..' . '/phpcollection/phpcollection/src/PhpCollection/Map.php', + 'PhpCollection\\MapInterface' => __DIR__ . '/..' . '/phpcollection/phpcollection/src/PhpCollection/MapInterface.php', + 'PhpCollection\\ObjectBasics' => __DIR__ . '/..' . '/phpcollection/phpcollection/src/PhpCollection/ObjectBasics.php', + 'PhpCollection\\ObjectBasicsHandler' => __DIR__ . '/..' . '/phpcollection/phpcollection/src/PhpCollection/ObjectBasicsHandler.php', + 'PhpCollection\\ObjectBasicsHandlerRegistry' => __DIR__ . '/..' . '/phpcollection/phpcollection/src/PhpCollection/ObjectBasicsHandlerRegistry.php', + 'PhpCollection\\ObjectBasicsHandler\\DateTimeHandler' => __DIR__ . '/..' . '/phpcollection/phpcollection/src/PhpCollection/ObjectBasicsHandler/DateTimeHandler.php', + 'PhpCollection\\ObjectBasicsHandler\\IdentityHandler' => __DIR__ . '/..' . '/phpcollection/phpcollection/src/PhpCollection/ObjectBasicsHandler/IdentityHandler.php', + 'PhpCollection\\Sequence' => __DIR__ . '/..' . '/phpcollection/phpcollection/src/PhpCollection/Sequence.php', + 'PhpCollection\\SequenceInterface' => __DIR__ . '/..' . '/phpcollection/phpcollection/src/PhpCollection/SequenceInterface.php', + 'PhpCollection\\Set' => __DIR__ . '/..' . '/phpcollection/phpcollection/src/PhpCollection/Set.php', + 'PhpCollection\\SetInterface' => __DIR__ . '/..' . '/phpcollection/phpcollection/src/PhpCollection/SetInterface.php', + 'PhpCollection\\SortableInterface' => __DIR__ . '/..' . '/phpcollection/phpcollection/src/PhpCollection/SortableInterface.php', + 'PhpCollection\\SortedSequence' => __DIR__ . '/..' . '/phpcollection/phpcollection/src/PhpCollection/SortedSequence.php', + 'PhpOption\\LazyOption' => __DIR__ . '/..' . '/phpoption/phpoption/src/PhpOption/LazyOption.php', + 'PhpOption\\None' => __DIR__ . '/..' . '/phpoption/phpoption/src/PhpOption/None.php', + 'PhpOption\\Option' => __DIR__ . '/..' . '/phpoption/phpoption/src/PhpOption/Option.php', + 'PhpOption\\Some' => __DIR__ . '/..' . '/phpoption/phpoption/src/PhpOption/Some.php', + 'Pimple' => __DIR__ . '/..' . '/pimple/pimple/lib/Pimple.php', 'Predis\\Autoloader' => __DIR__ . '/..' . '/predis/predis/src/Autoloader.php', 'Predis\\Client' => __DIR__ . '/..' . '/predis/predis/src/Client.php', 'Predis\\ClientContextInterface' => __DIR__ . '/..' . '/predis/predis/src/ClientContextInterface.php', @@ -1098,6 +2413,102 @@ class ComposerStaticInit444c3f31864f68a3f466e2c19837e185 'Predis\\Transaction\\AbortedMultiExecException' => __DIR__ . '/..' . '/predis/predis/src/Transaction/AbortedMultiExecException.php', 'Predis\\Transaction\\MultiExec' => __DIR__ . '/..' . '/predis/predis/src/Transaction/MultiExec.php', 'Predis\\Transaction\\MultiExecState' => __DIR__ . '/..' . '/predis/predis/src/Transaction/MultiExecState.php', + 'Prophecy\\Argument' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument.php', + 'Prophecy\\Argument\\ArgumentsWildcard' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/ArgumentsWildcard.php', + 'Prophecy\\Argument\\Token\\AnyValueToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValueToken.php', + 'Prophecy\\Argument\\Token\\AnyValuesToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValuesToken.php', + 'Prophecy\\Argument\\Token\\ApproximateValueToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/ApproximateValueToken.php', + 'Prophecy\\Argument\\Token\\ArrayCountToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayCountToken.php', + 'Prophecy\\Argument\\Token\\ArrayEntryToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEntryToken.php', + 'Prophecy\\Argument\\Token\\ArrayEveryEntryToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEveryEntryToken.php', + 'Prophecy\\Argument\\Token\\CallbackToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/CallbackToken.php', + 'Prophecy\\Argument\\Token\\ExactValueToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/ExactValueToken.php', + 'Prophecy\\Argument\\Token\\IdenticalValueToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/IdenticalValueToken.php', + 'Prophecy\\Argument\\Token\\LogicalAndToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalAndToken.php', + 'Prophecy\\Argument\\Token\\LogicalNotToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalNotToken.php', + 'Prophecy\\Argument\\Token\\ObjectStateToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/ObjectStateToken.php', + 'Prophecy\\Argument\\Token\\StringContainsToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/StringContainsToken.php', + 'Prophecy\\Argument\\Token\\TokenInterface' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/TokenInterface.php', + 'Prophecy\\Argument\\Token\\TypeToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/TypeToken.php', + 'Prophecy\\Call\\Call' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Call/Call.php', + 'Prophecy\\Call\\CallCenter' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Call/CallCenter.php', + 'Prophecy\\Comparator\\ClosureComparator' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Comparator/ClosureComparator.php', + 'Prophecy\\Comparator\\Factory' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Comparator/Factory.php', + 'Prophecy\\Comparator\\ProphecyComparator' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Comparator/ProphecyComparator.php', + 'Prophecy\\Doubler\\CachedDoubler' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/CachedDoubler.php', + 'Prophecy\\Doubler\\ClassPatch\\ClassPatchInterface' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ClassPatchInterface.php', + 'Prophecy\\Doubler\\ClassPatch\\DisableConstructorPatch' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php', + 'Prophecy\\Doubler\\ClassPatch\\HhvmExceptionPatch' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/HhvmExceptionPatch.php', + 'Prophecy\\Doubler\\ClassPatch\\KeywordPatch' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/KeywordPatch.php', + 'Prophecy\\Doubler\\ClassPatch\\MagicCallPatch' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php', + 'Prophecy\\Doubler\\ClassPatch\\ProphecySubjectPatch' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php', + 'Prophecy\\Doubler\\ClassPatch\\ReflectionClassNewInstancePatch' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatch.php', + 'Prophecy\\Doubler\\ClassPatch\\SplFileInfoPatch' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php', + 'Prophecy\\Doubler\\ClassPatch\\ThrowablePatch' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ThrowablePatch.php', + 'Prophecy\\Doubler\\ClassPatch\\TraversablePatch' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/TraversablePatch.php', + 'Prophecy\\Doubler\\DoubleInterface' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/DoubleInterface.php', + 'Prophecy\\Doubler\\Doubler' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/Doubler.php', + 'Prophecy\\Doubler\\Generator\\ClassCodeGenerator' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCodeGenerator.php', + 'Prophecy\\Doubler\\Generator\\ClassCreator' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCreator.php', + 'Prophecy\\Doubler\\Generator\\ClassMirror' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassMirror.php', + 'Prophecy\\Doubler\\Generator\\Node\\ArgumentNode' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ArgumentNode.php', + 'Prophecy\\Doubler\\Generator\\Node\\ClassNode' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ClassNode.php', + 'Prophecy\\Doubler\\Generator\\Node\\MethodNode' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/MethodNode.php', + 'Prophecy\\Doubler\\Generator\\ReflectionInterface' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/ReflectionInterface.php', + 'Prophecy\\Doubler\\Generator\\TypeHintReference' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/TypeHintReference.php', + 'Prophecy\\Doubler\\LazyDouble' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/LazyDouble.php', + 'Prophecy\\Doubler\\NameGenerator' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/NameGenerator.php', + 'Prophecy\\Exception\\Call\\UnexpectedCallException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Call/UnexpectedCallException.php', + 'Prophecy\\Exception\\Doubler\\ClassCreatorException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassCreatorException.php', + 'Prophecy\\Exception\\Doubler\\ClassMirrorException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassMirrorException.php', + 'Prophecy\\Exception\\Doubler\\ClassNotFoundException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassNotFoundException.php', + 'Prophecy\\Exception\\Doubler\\DoubleException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoubleException.php', + 'Prophecy\\Exception\\Doubler\\DoublerException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoublerException.php', + 'Prophecy\\Exception\\Doubler\\InterfaceNotFoundException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/InterfaceNotFoundException.php', + 'Prophecy\\Exception\\Doubler\\MethodNotExtendableException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotExtendableException.php', + 'Prophecy\\Exception\\Doubler\\MethodNotFoundException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotFoundException.php', + 'Prophecy\\Exception\\Doubler\\ReturnByReferenceException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/ReturnByReferenceException.php', + 'Prophecy\\Exception\\Exception' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Exception.php', + 'Prophecy\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/InvalidArgumentException.php', + 'Prophecy\\Exception\\Prediction\\AggregateException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Prediction/AggregateException.php', + 'Prophecy\\Exception\\Prediction\\FailedPredictionException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Prediction/FailedPredictionException.php', + 'Prophecy\\Exception\\Prediction\\NoCallsException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Prediction/NoCallsException.php', + 'Prophecy\\Exception\\Prediction\\PredictionException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Prediction/PredictionException.php', + 'Prophecy\\Exception\\Prediction\\UnexpectedCallsCountException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsCountException.php', + 'Prophecy\\Exception\\Prediction\\UnexpectedCallsException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsException.php', + 'Prophecy\\Exception\\Prophecy\\MethodProphecyException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Prophecy/MethodProphecyException.php', + 'Prophecy\\Exception\\Prophecy\\ObjectProphecyException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ObjectProphecyException.php', + 'Prophecy\\Exception\\Prophecy\\ProphecyException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ProphecyException.php', + 'Prophecy\\PhpDocumentor\\ClassAndInterfaceTagRetriever' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassAndInterfaceTagRetriever.php', + 'Prophecy\\PhpDocumentor\\ClassTagRetriever' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassTagRetriever.php', + 'Prophecy\\PhpDocumentor\\LegacyClassTagRetriever' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/PhpDocumentor/LegacyClassTagRetriever.php', + 'Prophecy\\PhpDocumentor\\MethodTagRetrieverInterface' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/PhpDocumentor/MethodTagRetrieverInterface.php', + 'Prophecy\\Prediction\\CallPrediction' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Prediction/CallPrediction.php', + 'Prophecy\\Prediction\\CallTimesPrediction' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Prediction/CallTimesPrediction.php', + 'Prophecy\\Prediction\\CallbackPrediction' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Prediction/CallbackPrediction.php', + 'Prophecy\\Prediction\\NoCallsPrediction' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Prediction/NoCallsPrediction.php', + 'Prophecy\\Prediction\\PredictionInterface' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Prediction/PredictionInterface.php', + 'Prophecy\\Promise\\CallbackPromise' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Promise/CallbackPromise.php', + 'Prophecy\\Promise\\PromiseInterface' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Promise/PromiseInterface.php', + 'Prophecy\\Promise\\ReturnArgumentPromise' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Promise/ReturnArgumentPromise.php', + 'Prophecy\\Promise\\ReturnPromise' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Promise/ReturnPromise.php', + 'Prophecy\\Promise\\ThrowPromise' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Promise/ThrowPromise.php', + 'Prophecy\\Prophecy\\MethodProphecy' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php', + 'Prophecy\\Prophecy\\ObjectProphecy' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Prophecy/ObjectProphecy.php', + 'Prophecy\\Prophecy\\ProphecyInterface' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Prophecy/ProphecyInterface.php', + 'Prophecy\\Prophecy\\ProphecySubjectInterface' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Prophecy/ProphecySubjectInterface.php', + 'Prophecy\\Prophecy\\Revealer' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Prophecy/Revealer.php', + 'Prophecy\\Prophecy\\RevealerInterface' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Prophecy/RevealerInterface.php', + 'Prophecy\\Prophet' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Prophet.php', + 'Prophecy\\Util\\ExportUtil' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Util/ExportUtil.php', + 'Prophecy\\Util\\StringUtil' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Util/StringUtil.php', + 'Psr\\Cache\\CacheException' => __DIR__ . '/..' . '/psr/cache/src/CacheException.php', + 'Psr\\Cache\\CacheItemInterface' => __DIR__ . '/..' . '/psr/cache/src/CacheItemInterface.php', + 'Psr\\Cache\\CacheItemPoolInterface' => __DIR__ . '/..' . '/psr/cache/src/CacheItemPoolInterface.php', + 'Psr\\Cache\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/cache/src/InvalidArgumentException.php', + 'Psr\\Container\\ContainerExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerExceptionInterface.php', + 'Psr\\Container\\ContainerInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerInterface.php', + 'Psr\\Container\\NotFoundExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/NotFoundExceptionInterface.php', 'Psr\\Http\\Message\\MessageInterface' => __DIR__ . '/..' . '/psr/http-message/src/MessageInterface.php', 'Psr\\Http\\Message\\RequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/RequestInterface.php', 'Psr\\Http\\Message\\ResponseInterface' => __DIR__ . '/..' . '/psr/http-message/src/ResponseInterface.php', @@ -1105,6 +2516,270 @@ class ComposerStaticInit444c3f31864f68a3f466e2c19837e185 'Psr\\Http\\Message\\StreamInterface' => __DIR__ . '/..' . '/psr/http-message/src/StreamInterface.php', 'Psr\\Http\\Message\\UploadedFileInterface' => __DIR__ . '/..' . '/psr/http-message/src/UploadedFileInterface.php', 'Psr\\Http\\Message\\UriInterface' => __DIR__ . '/..' . '/psr/http-message/src/UriInterface.php', + 'Psr\\Log\\AbstractLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/AbstractLogger.php', + 'Psr\\Log\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/log/Psr/Log/InvalidArgumentException.php', + 'Psr\\Log\\LogLevel' => __DIR__ . '/..' . '/psr/log/Psr/Log/LogLevel.php', + 'Psr\\Log\\LoggerAwareInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerAwareInterface.php', + 'Psr\\Log\\LoggerAwareTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerAwareTrait.php', + 'Psr\\Log\\LoggerInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerInterface.php', + 'Psr\\Log\\LoggerTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerTrait.php', + 'Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/NullLogger.php', + 'Psr\\Log\\Test\\DummyTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/DummyTest.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', + 'Psy\\CodeCleaner' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner.php', + 'Psy\\CodeCleaner\\AbstractClassPass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/AbstractClassPass.php', + 'Psy\\CodeCleaner\\AssignThisVariablePass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/AssignThisVariablePass.php', + 'Psy\\CodeCleaner\\CallTimePassByReferencePass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/CallTimePassByReferencePass.php', + 'Psy\\CodeCleaner\\CalledClassPass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/CalledClassPass.php', + 'Psy\\CodeCleaner\\CodeCleanerPass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/CodeCleanerPass.php', + 'Psy\\CodeCleaner\\ExitPass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/ExitPass.php', + 'Psy\\CodeCleaner\\FinalClassPass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/FinalClassPass.php', + 'Psy\\CodeCleaner\\FunctionContextPass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/FunctionContextPass.php', + 'Psy\\CodeCleaner\\FunctionReturnInWriteContextPass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/FunctionReturnInWriteContextPass.php', + 'Psy\\CodeCleaner\\ImplicitReturnPass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/ImplicitReturnPass.php', + 'Psy\\CodeCleaner\\InstanceOfPass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/InstanceOfPass.php', + 'Psy\\CodeCleaner\\LeavePsyshAlonePass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/LeavePsyshAlonePass.php', + 'Psy\\CodeCleaner\\LegacyEmptyPass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/LegacyEmptyPass.php', + 'Psy\\CodeCleaner\\ListPass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/ListPass.php', + 'Psy\\CodeCleaner\\LoopContextPass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/LoopContextPass.php', + 'Psy\\CodeCleaner\\MagicConstantsPass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/MagicConstantsPass.php', + 'Psy\\CodeCleaner\\NamespaceAwarePass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/NamespaceAwarePass.php', + 'Psy\\CodeCleaner\\NamespacePass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/NamespacePass.php', + 'Psy\\CodeCleaner\\NoReturnValue' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/NoReturnValue.php', + 'Psy\\CodeCleaner\\PassableByReferencePass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/PassableByReferencePass.php', + 'Psy\\CodeCleaner\\RequirePass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/RequirePass.php', + 'Psy\\CodeCleaner\\StrictTypesPass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/StrictTypesPass.php', + 'Psy\\CodeCleaner\\UseStatementPass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/UseStatementPass.php', + 'Psy\\CodeCleaner\\ValidClassNamePass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/ValidClassNamePass.php', + 'Psy\\CodeCleaner\\ValidConstantPass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/ValidConstantPass.php', + 'Psy\\CodeCleaner\\ValidConstructorPass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/ValidConstructorPass.php', + 'Psy\\CodeCleaner\\ValidFunctionNamePass' => __DIR__ . '/..' . '/psy/psysh/src/CodeCleaner/ValidFunctionNamePass.php', + 'Psy\\Command\\BufferCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/BufferCommand.php', + 'Psy\\Command\\ClearCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/ClearCommand.php', + 'Psy\\Command\\Command' => __DIR__ . '/..' . '/psy/psysh/src/Command/Command.php', + 'Psy\\Command\\DocCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/DocCommand.php', + 'Psy\\Command\\DumpCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/DumpCommand.php', + 'Psy\\Command\\EditCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/EditCommand.php', + 'Psy\\Command\\ExitCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/ExitCommand.php', + 'Psy\\Command\\HelpCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/HelpCommand.php', + 'Psy\\Command\\HistoryCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/HistoryCommand.php', + 'Psy\\Command\\ListCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/ListCommand.php', + 'Psy\\Command\\ListCommand\\ClassConstantEnumerator' => __DIR__ . '/..' . '/psy/psysh/src/Command/ListCommand/ClassConstantEnumerator.php', + 'Psy\\Command\\ListCommand\\ClassEnumerator' => __DIR__ . '/..' . '/psy/psysh/src/Command/ListCommand/ClassEnumerator.php', + 'Psy\\Command\\ListCommand\\ConstantEnumerator' => __DIR__ . '/..' . '/psy/psysh/src/Command/ListCommand/ConstantEnumerator.php', + 'Psy\\Command\\ListCommand\\Enumerator' => __DIR__ . '/..' . '/psy/psysh/src/Command/ListCommand/Enumerator.php', + 'Psy\\Command\\ListCommand\\FunctionEnumerator' => __DIR__ . '/..' . '/psy/psysh/src/Command/ListCommand/FunctionEnumerator.php', + 'Psy\\Command\\ListCommand\\GlobalVariableEnumerator' => __DIR__ . '/..' . '/psy/psysh/src/Command/ListCommand/GlobalVariableEnumerator.php', + 'Psy\\Command\\ListCommand\\InterfaceEnumerator' => __DIR__ . '/..' . '/psy/psysh/src/Command/ListCommand/InterfaceEnumerator.php', + 'Psy\\Command\\ListCommand\\MethodEnumerator' => __DIR__ . '/..' . '/psy/psysh/src/Command/ListCommand/MethodEnumerator.php', + 'Psy\\Command\\ListCommand\\PropertyEnumerator' => __DIR__ . '/..' . '/psy/psysh/src/Command/ListCommand/PropertyEnumerator.php', + 'Psy\\Command\\ListCommand\\TraitEnumerator' => __DIR__ . '/..' . '/psy/psysh/src/Command/ListCommand/TraitEnumerator.php', + 'Psy\\Command\\ListCommand\\VariableEnumerator' => __DIR__ . '/..' . '/psy/psysh/src/Command/ListCommand/VariableEnumerator.php', + 'Psy\\Command\\ParseCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/ParseCommand.php', + 'Psy\\Command\\PsyVersionCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/PsyVersionCommand.php', + 'Psy\\Command\\ReflectingCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/ReflectingCommand.php', + 'Psy\\Command\\ShowCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/ShowCommand.php', + 'Psy\\Command\\SudoCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/SudoCommand.php', + 'Psy\\Command\\ThrowUpCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/ThrowUpCommand.php', + 'Psy\\Command\\TimeitCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/TimeitCommand.php', + 'Psy\\Command\\TimeitCommand\\TimeitVisitor' => __DIR__ . '/..' . '/psy/psysh/src/Command/TimeitCommand/TimeitVisitor.php', + 'Psy\\Command\\TraceCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/TraceCommand.php', + 'Psy\\Command\\WhereamiCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/WhereamiCommand.php', + 'Psy\\Command\\WtfCommand' => __DIR__ . '/..' . '/psy/psysh/src/Command/WtfCommand.php', + 'Psy\\ConfigPaths' => __DIR__ . '/..' . '/psy/psysh/src/ConfigPaths.php', + 'Psy\\Configuration' => __DIR__ . '/..' . '/psy/psysh/src/Configuration.php', + 'Psy\\ConsoleColorFactory' => __DIR__ . '/..' . '/psy/psysh/src/ConsoleColorFactory.php', + 'Psy\\Context' => __DIR__ . '/..' . '/psy/psysh/src/Context.php', + 'Psy\\ContextAware' => __DIR__ . '/..' . '/psy/psysh/src/ContextAware.php', + 'Psy\\Exception\\BreakException' => __DIR__ . '/..' . '/psy/psysh/src/Exception/BreakException.php', + 'Psy\\Exception\\DeprecatedException' => __DIR__ . '/..' . '/psy/psysh/src/Exception/DeprecatedException.php', + 'Psy\\Exception\\ErrorException' => __DIR__ . '/..' . '/psy/psysh/src/Exception/ErrorException.php', + 'Psy\\Exception\\Exception' => __DIR__ . '/..' . '/psy/psysh/src/Exception/Exception.php', + 'Psy\\Exception\\FatalErrorException' => __DIR__ . '/..' . '/psy/psysh/src/Exception/FatalErrorException.php', + 'Psy\\Exception\\ParseErrorException' => __DIR__ . '/..' . '/psy/psysh/src/Exception/ParseErrorException.php', + 'Psy\\Exception\\RuntimeException' => __DIR__ . '/..' . '/psy/psysh/src/Exception/RuntimeException.php', + 'Psy\\Exception\\ThrowUpException' => __DIR__ . '/..' . '/psy/psysh/src/Exception/ThrowUpException.php', + 'Psy\\Exception\\TypeErrorException' => __DIR__ . '/..' . '/psy/psysh/src/Exception/TypeErrorException.php', + 'Psy\\ExecutionClosure' => __DIR__ . '/..' . '/psy/psysh/src/ExecutionClosure.php', + 'Psy\\ExecutionLoop' => __DIR__ . '/..' . '/psy/psysh/src/ExecutionLoop.php', + 'Psy\\ExecutionLoopClosure' => __DIR__ . '/..' . '/psy/psysh/src/ExecutionLoopClosure.php', + 'Psy\\ExecutionLoop\\AbstractListener' => __DIR__ . '/..' . '/psy/psysh/src/ExecutionLoop/AbstractListener.php', + 'Psy\\ExecutionLoop\\Listener' => __DIR__ . '/..' . '/psy/psysh/src/ExecutionLoop/Listener.php', + 'Psy\\ExecutionLoop\\ProcessForker' => __DIR__ . '/..' . '/psy/psysh/src/ExecutionLoop/ProcessForker.php', + 'Psy\\ExecutionLoop\\RunkitReloader' => __DIR__ . '/..' . '/psy/psysh/src/ExecutionLoop/RunkitReloader.php', + 'Psy\\Formatter\\CodeFormatter' => __DIR__ . '/..' . '/psy/psysh/src/Formatter/CodeFormatter.php', + 'Psy\\Formatter\\DocblockFormatter' => __DIR__ . '/..' . '/psy/psysh/src/Formatter/DocblockFormatter.php', + 'Psy\\Formatter\\Formatter' => __DIR__ . '/..' . '/psy/psysh/src/Formatter/Formatter.php', + 'Psy\\Formatter\\SignatureFormatter' => __DIR__ . '/..' . '/psy/psysh/src/Formatter/SignatureFormatter.php', + 'Psy\\Input\\CodeArgument' => __DIR__ . '/..' . '/psy/psysh/src/Input/CodeArgument.php', + 'Psy\\Input\\FilterOptions' => __DIR__ . '/..' . '/psy/psysh/src/Input/FilterOptions.php', + 'Psy\\Input\\ShellInput' => __DIR__ . '/..' . '/psy/psysh/src/Input/ShellInput.php', + 'Psy\\Input\\SilentInput' => __DIR__ . '/..' . '/psy/psysh/src/Input/SilentInput.php', + 'Psy\\Output\\OutputPager' => __DIR__ . '/..' . '/psy/psysh/src/Output/OutputPager.php', + 'Psy\\Output\\PassthruPager' => __DIR__ . '/..' . '/psy/psysh/src/Output/PassthruPager.php', + 'Psy\\Output\\ProcOutputPager' => __DIR__ . '/..' . '/psy/psysh/src/Output/ProcOutputPager.php', + 'Psy\\Output\\ShellOutput' => __DIR__ . '/..' . '/psy/psysh/src/Output/ShellOutput.php', + 'Psy\\ParserFactory' => __DIR__ . '/..' . '/psy/psysh/src/ParserFactory.php', + 'Psy\\Readline\\GNUReadline' => __DIR__ . '/..' . '/psy/psysh/src/Readline/GNUReadline.php', + 'Psy\\Readline\\HoaConsole' => __DIR__ . '/..' . '/psy/psysh/src/Readline/HoaConsole.php', + 'Psy\\Readline\\Libedit' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Libedit.php', + 'Psy\\Readline\\Readline' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Readline.php', + 'Psy\\Readline\\Transient' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Transient.php', + 'Psy\\Reflection\\ReflectionClassConstant' => __DIR__ . '/..' . '/psy/psysh/src/Reflection/ReflectionClassConstant.php', + 'Psy\\Reflection\\ReflectionConstant' => __DIR__ . '/..' . '/psy/psysh/src/Reflection/ReflectionConstant.php', + 'Psy\\Reflection\\ReflectionConstant_' => __DIR__ . '/..' . '/psy/psysh/src/Reflection/ReflectionConstant_.php', + 'Psy\\Reflection\\ReflectionLanguageConstruct' => __DIR__ . '/..' . '/psy/psysh/src/Reflection/ReflectionLanguageConstruct.php', + 'Psy\\Reflection\\ReflectionLanguageConstructParameter' => __DIR__ . '/..' . '/psy/psysh/src/Reflection/ReflectionLanguageConstructParameter.php', + 'Psy\\Shell' => __DIR__ . '/..' . '/psy/psysh/src/Shell.php', + 'Psy\\Sudo' => __DIR__ . '/..' . '/psy/psysh/src/Sudo.php', + 'Psy\\Sudo\\SudoVisitor' => __DIR__ . '/..' . '/psy/psysh/src/Sudo/SudoVisitor.php', + 'Psy\\TabCompletion\\AutoCompleter' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/AutoCompleter.php', + 'Psy\\TabCompletion\\Matcher\\AbstractContextAwareMatcher' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/Matcher/AbstractContextAwareMatcher.php', + 'Psy\\TabCompletion\\Matcher\\AbstractDefaultParametersMatcher' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/Matcher/AbstractDefaultParametersMatcher.php', + 'Psy\\TabCompletion\\Matcher\\AbstractMatcher' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/Matcher/AbstractMatcher.php', + 'Psy\\TabCompletion\\Matcher\\ClassAttributesMatcher' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/Matcher/ClassAttributesMatcher.php', + 'Psy\\TabCompletion\\Matcher\\ClassMethodDefaultParametersMatcher' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/Matcher/ClassMethodDefaultParametersMatcher.php', + 'Psy\\TabCompletion\\Matcher\\ClassMethodsMatcher' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/Matcher/ClassMethodsMatcher.php', + 'Psy\\TabCompletion\\Matcher\\ClassNamesMatcher' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/Matcher/ClassNamesMatcher.php', + 'Psy\\TabCompletion\\Matcher\\CommandsMatcher' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/Matcher/CommandsMatcher.php', + 'Psy\\TabCompletion\\Matcher\\ConstantsMatcher' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/Matcher/ConstantsMatcher.php', + 'Psy\\TabCompletion\\Matcher\\FunctionDefaultParametersMatcher' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/Matcher/FunctionDefaultParametersMatcher.php', + 'Psy\\TabCompletion\\Matcher\\FunctionsMatcher' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/Matcher/FunctionsMatcher.php', + 'Psy\\TabCompletion\\Matcher\\KeywordsMatcher' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/Matcher/KeywordsMatcher.php', + 'Psy\\TabCompletion\\Matcher\\MongoClientMatcher' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/Matcher/MongoClientMatcher.php', + 'Psy\\TabCompletion\\Matcher\\MongoDatabaseMatcher' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/Matcher/MongoDatabaseMatcher.php', + 'Psy\\TabCompletion\\Matcher\\ObjectAttributesMatcher' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/Matcher/ObjectAttributesMatcher.php', + 'Psy\\TabCompletion\\Matcher\\ObjectMethodDefaultParametersMatcher' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/Matcher/ObjectMethodDefaultParametersMatcher.php', + 'Psy\\TabCompletion\\Matcher\\ObjectMethodsMatcher' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/Matcher/ObjectMethodsMatcher.php', + 'Psy\\TabCompletion\\Matcher\\VariablesMatcher' => __DIR__ . '/..' . '/psy/psysh/src/TabCompletion/Matcher/VariablesMatcher.php', + 'Psy\\Util\\Docblock' => __DIR__ . '/..' . '/psy/psysh/src/Util/Docblock.php', + 'Psy\\Util\\Json' => __DIR__ . '/..' . '/psy/psysh/src/Util/Json.php', + 'Psy\\Util\\Mirror' => __DIR__ . '/..' . '/psy/psysh/src/Util/Mirror.php', + 'Psy\\Util\\Str' => __DIR__ . '/..' . '/psy/psysh/src/Util/Str.php', + 'Psy\\VarDumper\\Cloner' => __DIR__ . '/..' . '/psy/psysh/src/VarDumper/Cloner.php', + 'Psy\\VarDumper\\Dumper' => __DIR__ . '/..' . '/psy/psysh/src/VarDumper/Dumper.php', + 'Psy\\VarDumper\\Presenter' => __DIR__ . '/..' . '/psy/psysh/src/VarDumper/Presenter.php', + 'Psy\\VarDumper\\PresenterAware' => __DIR__ . '/..' . '/psy/psysh/src/VarDumper/PresenterAware.php', + 'Psy\\VersionUpdater\\Checker' => __DIR__ . '/..' . '/psy/psysh/src/VersionUpdater/Checker.php', + 'Psy\\VersionUpdater\\GitHubChecker' => __DIR__ . '/..' . '/psy/psysh/src/VersionUpdater/GitHubChecker.php', + 'Psy\\VersionUpdater\\IntervalChecker' => __DIR__ . '/..' . '/psy/psysh/src/VersionUpdater/IntervalChecker.php', + 'Psy\\VersionUpdater\\NoopChecker' => __DIR__ . '/..' . '/psy/psysh/src/VersionUpdater/NoopChecker.php', + 'SebastianBergmann\\CodeCoverage\\CodeCoverage' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage.php', + 'SebastianBergmann\\CodeCoverage\\CoveredCodeNotExecutedException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/CoveredCodeNotExecutedException.php', + 'SebastianBergmann\\CodeCoverage\\Driver\\Driver' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/Driver.php', + 'SebastianBergmann\\CodeCoverage\\Driver\\PCOV' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/PCOV.php', + 'SebastianBergmann\\CodeCoverage\\Driver\\PHPDBG' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/PHPDBG.php', + 'SebastianBergmann\\CodeCoverage\\Driver\\Xdebug' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/Xdebug.php', + 'SebastianBergmann\\CodeCoverage\\Exception' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/Exception.php', + 'SebastianBergmann\\CodeCoverage\\Filter' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Filter.php', + 'SebastianBergmann\\CodeCoverage\\InvalidArgumentException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/InvalidArgumentException.php', + 'SebastianBergmann\\CodeCoverage\\MissingCoversAnnotationException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/MissingCoversAnnotationException.php', + 'SebastianBergmann\\CodeCoverage\\Node\\AbstractNode' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/AbstractNode.php', + 'SebastianBergmann\\CodeCoverage\\Node\\Builder' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/Builder.php', + 'SebastianBergmann\\CodeCoverage\\Node\\Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/Directory.php', + 'SebastianBergmann\\CodeCoverage\\Node\\File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/File.php', + 'SebastianBergmann\\CodeCoverage\\Node\\Iterator' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/Iterator.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Clover' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Clover.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Crap4j' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Crap4j.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Dashboard' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Facade' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Facade.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Html\\File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Renderer' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer.php', + 'SebastianBergmann\\CodeCoverage\\Report\\PHP' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/PHP.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Text' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Text.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\BuildInformation' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/BuildInformation.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Coverage' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Coverage.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Directory.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Facade' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Facade.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/File.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Method' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Method.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Node' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Node.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Project' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Project.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Report' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Report.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Source' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Source.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Tests' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Tests.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Totals' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Totals.php', + 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Unit' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Unit.php', + 'SebastianBergmann\\CodeCoverage\\RuntimeException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/RuntimeException.php', + 'SebastianBergmann\\CodeCoverage\\UnintentionallyCoveredCodeException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/UnintentionallyCoveredCodeException.php', + 'SebastianBergmann\\CodeCoverage\\Util' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Util.php', + 'SebastianBergmann\\CodeCoverage\\Version' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Version.php', + 'SebastianBergmann\\CodeUnitReverseLookup\\Wizard' => __DIR__ . '/..' . '/sebastian/code-unit-reverse-lookup/src/Wizard.php', + 'SebastianBergmann\\Comparator\\ArrayComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ArrayComparator.php', + 'SebastianBergmann\\Comparator\\Comparator' => __DIR__ . '/..' . '/sebastian/comparator/src/Comparator.php', + 'SebastianBergmann\\Comparator\\ComparisonFailure' => __DIR__ . '/..' . '/sebastian/comparator/src/ComparisonFailure.php', + 'SebastianBergmann\\Comparator\\DOMNodeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/DOMNodeComparator.php', + 'SebastianBergmann\\Comparator\\DateTimeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/DateTimeComparator.php', + 'SebastianBergmann\\Comparator\\DoubleComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/DoubleComparator.php', + 'SebastianBergmann\\Comparator\\ExceptionComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ExceptionComparator.php', + 'SebastianBergmann\\Comparator\\Factory' => __DIR__ . '/..' . '/sebastian/comparator/src/Factory.php', + 'SebastianBergmann\\Comparator\\MockObjectComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/MockObjectComparator.php', + 'SebastianBergmann\\Comparator\\NumericComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/NumericComparator.php', + 'SebastianBergmann\\Comparator\\ObjectComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ObjectComparator.php', + 'SebastianBergmann\\Comparator\\ResourceComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ResourceComparator.php', + 'SebastianBergmann\\Comparator\\ScalarComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ScalarComparator.php', + 'SebastianBergmann\\Comparator\\SplObjectStorageComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/SplObjectStorageComparator.php', + 'SebastianBergmann\\Comparator\\TypeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/TypeComparator.php', + 'SebastianBergmann\\Diff\\Chunk' => __DIR__ . '/..' . '/sebastian/diff/src/Chunk.php', + 'SebastianBergmann\\Diff\\ConfigurationException' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/ConfigurationException.php', + 'SebastianBergmann\\Diff\\Diff' => __DIR__ . '/..' . '/sebastian/diff/src/Diff.php', + 'SebastianBergmann\\Diff\\Differ' => __DIR__ . '/..' . '/sebastian/diff/src/Differ.php', + 'SebastianBergmann\\Diff\\Exception' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/Exception.php', + 'SebastianBergmann\\Diff\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/InvalidArgumentException.php', + 'SebastianBergmann\\Diff\\Line' => __DIR__ . '/..' . '/sebastian/diff/src/Line.php', + 'SebastianBergmann\\Diff\\LongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/LongestCommonSubsequenceCalculator.php', + 'SebastianBergmann\\Diff\\MemoryEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php', + 'SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php', + 'SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php', + 'SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php', + 'SebastianBergmann\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php', + 'SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php', + 'SebastianBergmann\\Diff\\Parser' => __DIR__ . '/..' . '/sebastian/diff/src/Parser.php', + 'SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', + 'SebastianBergmann\\Environment\\Console' => __DIR__ . '/..' . '/sebastian/environment/src/Console.php', + 'SebastianBergmann\\Environment\\OperatingSystem' => __DIR__ . '/..' . '/sebastian/environment/src/OperatingSystem.php', + 'SebastianBergmann\\Environment\\Runtime' => __DIR__ . '/..' . '/sebastian/environment/src/Runtime.php', + 'SebastianBergmann\\Exporter\\Exporter' => __DIR__ . '/..' . '/sebastian/exporter/src/Exporter.php', + 'SebastianBergmann\\FileIterator\\Facade' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Facade.php', + 'SebastianBergmann\\FileIterator\\Factory' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Factory.php', + 'SebastianBergmann\\FileIterator\\Iterator' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Iterator.php', + 'SebastianBergmann\\GlobalState\\Blacklist' => __DIR__ . '/..' . '/sebastian/global-state/src/Blacklist.php', + 'SebastianBergmann\\GlobalState\\CodeExporter' => __DIR__ . '/..' . '/sebastian/global-state/src/CodeExporter.php', + 'SebastianBergmann\\GlobalState\\Exception' => __DIR__ . '/..' . '/sebastian/global-state/src/exceptions/Exception.php', + 'SebastianBergmann\\GlobalState\\Restorer' => __DIR__ . '/..' . '/sebastian/global-state/src/Restorer.php', + 'SebastianBergmann\\GlobalState\\RuntimeException' => __DIR__ . '/..' . '/sebastian/global-state/src/exceptions/RuntimeException.php', + 'SebastianBergmann\\GlobalState\\Snapshot' => __DIR__ . '/..' . '/sebastian/global-state/src/Snapshot.php', + 'SebastianBergmann\\ObjectEnumerator\\Enumerator' => __DIR__ . '/..' . '/sebastian/object-enumerator/src/Enumerator.php', + 'SebastianBergmann\\ObjectEnumerator\\Exception' => __DIR__ . '/..' . '/sebastian/object-enumerator/src/Exception.php', + 'SebastianBergmann\\ObjectEnumerator\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/object-enumerator/src/InvalidArgumentException.php', + 'SebastianBergmann\\ObjectReflector\\Exception' => __DIR__ . '/..' . '/sebastian/object-reflector/src/Exception.php', + 'SebastianBergmann\\ObjectReflector\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/object-reflector/src/InvalidArgumentException.php', + 'SebastianBergmann\\ObjectReflector\\ObjectReflector' => __DIR__ . '/..' . '/sebastian/object-reflector/src/ObjectReflector.php', + 'SebastianBergmann\\RecursionContext\\Context' => __DIR__ . '/..' . '/sebastian/recursion-context/src/Context.php', + 'SebastianBergmann\\RecursionContext\\Exception' => __DIR__ . '/..' . '/sebastian/recursion-context/src/Exception.php', + 'SebastianBergmann\\RecursionContext\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/recursion-context/src/InvalidArgumentException.php', + 'SebastianBergmann\\ResourceOperations\\ResourceOperations' => __DIR__ . '/..' . '/sebastian/resource-operations/src/ResourceOperations.php', + 'SebastianBergmann\\Timer\\Exception' => __DIR__ . '/..' . '/phpunit/php-timer/src/Exception.php', + 'SebastianBergmann\\Timer\\RuntimeException' => __DIR__ . '/..' . '/phpunit/php-timer/src/RuntimeException.php', + 'SebastianBergmann\\Timer\\Timer' => __DIR__ . '/..' . '/phpunit/php-timer/src/Timer.php', + 'SebastianBergmann\\Type\\CallableType' => __DIR__ . '/..' . '/sebastian/type/src/CallableType.php', + 'SebastianBergmann\\Type\\Exception' => __DIR__ . '/..' . '/sebastian/type/src/exception/Exception.php', + 'SebastianBergmann\\Type\\GenericObjectType' => __DIR__ . '/..' . '/sebastian/type/src/GenericObjectType.php', + 'SebastianBergmann\\Type\\IterableType' => __DIR__ . '/..' . '/sebastian/type/src/IterableType.php', + 'SebastianBergmann\\Type\\NullType' => __DIR__ . '/..' . '/sebastian/type/src/NullType.php', + 'SebastianBergmann\\Type\\ObjectType' => __DIR__ . '/..' . '/sebastian/type/src/ObjectType.php', + 'SebastianBergmann\\Type\\RuntimeException' => __DIR__ . '/..' . '/sebastian/type/src/exception/RuntimeException.php', + 'SebastianBergmann\\Type\\SimpleType' => __DIR__ . '/..' . '/sebastian/type/src/SimpleType.php', + 'SebastianBergmann\\Type\\Type' => __DIR__ . '/..' . '/sebastian/type/src/Type.php', + 'SebastianBergmann\\Type\\TypeName' => __DIR__ . '/..' . '/sebastian/type/src/TypeName.php', + 'SebastianBergmann\\Type\\UnknownType' => __DIR__ . '/..' . '/sebastian/type/src/UnknownType.php', + 'SebastianBergmann\\Type\\VoidType' => __DIR__ . '/..' . '/sebastian/type/src/VoidType.php', + 'SebastianBergmann\\Version' => __DIR__ . '/..' . '/sebastian/version/src/Version.php', 'Stomp\\Broker\\ActiveMq\\ActiveMq' => __DIR__ . '/..' . '/stomp-php/stomp-php/src/Broker/ActiveMq/ActiveMq.php', 'Stomp\\Broker\\ActiveMq\\Mode\\ActiveMqMode' => __DIR__ . '/..' . '/stomp-php/stomp-php/src/Broker/ActiveMq/Mode/ActiveMqMode.php', 'Stomp\\Broker\\ActiveMq\\Mode\\DurableSubscription' => __DIR__ . '/..' . '/stomp-php/stomp-php/src/Broker/ActiveMq/Mode/DurableSubscription.php', @@ -1150,6 +2825,906 @@ class ComposerStaticInit444c3f31864f68a3f466e2c19837e185 'Stomp\\Transport\\Message' => __DIR__ . '/..' . '/stomp-php/stomp-php/src/Transport/Message.php', 'Stomp\\Transport\\Parser' => __DIR__ . '/..' . '/stomp-php/stomp-php/src/Transport/Parser.php', 'Stomp\\Util\\IdGenerator' => __DIR__ . '/..' . '/stomp-php/stomp-php/src/Util/IdGenerator.php', + 'Symfony\\Component\\Config\\ConfigCache' => __DIR__ . '/..' . '/symfony/config/ConfigCache.php', + 'Symfony\\Component\\Config\\ConfigCacheFactory' => __DIR__ . '/..' . '/symfony/config/ConfigCacheFactory.php', + 'Symfony\\Component\\Config\\ConfigCacheFactoryInterface' => __DIR__ . '/..' . '/symfony/config/ConfigCacheFactoryInterface.php', + 'Symfony\\Component\\Config\\ConfigCacheInterface' => __DIR__ . '/..' . '/symfony/config/ConfigCacheInterface.php', + 'Symfony\\Component\\Config\\Definition\\ArrayNode' => __DIR__ . '/..' . '/symfony/config/Definition/ArrayNode.php', + 'Symfony\\Component\\Config\\Definition\\BaseNode' => __DIR__ . '/..' . '/symfony/config/Definition/BaseNode.php', + 'Symfony\\Component\\Config\\Definition\\BooleanNode' => __DIR__ . '/..' . '/symfony/config/Definition/BooleanNode.php', + 'Symfony\\Component\\Config\\Definition\\Builder\\ArrayNodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/ArrayNodeDefinition.php', + 'Symfony\\Component\\Config\\Definition\\Builder\\BooleanNodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/BooleanNodeDefinition.php', + 'Symfony\\Component\\Config\\Definition\\Builder\\EnumNodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/EnumNodeDefinition.php', + 'Symfony\\Component\\Config\\Definition\\Builder\\ExprBuilder' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/ExprBuilder.php', + 'Symfony\\Component\\Config\\Definition\\Builder\\FloatNodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/FloatNodeDefinition.php', + 'Symfony\\Component\\Config\\Definition\\Builder\\IntegerNodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/IntegerNodeDefinition.php', + 'Symfony\\Component\\Config\\Definition\\Builder\\MergeBuilder' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/MergeBuilder.php', + 'Symfony\\Component\\Config\\Definition\\Builder\\NodeBuilder' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/NodeBuilder.php', + 'Symfony\\Component\\Config\\Definition\\Builder\\NodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/NodeDefinition.php', + 'Symfony\\Component\\Config\\Definition\\Builder\\NodeParentInterface' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/NodeParentInterface.php', + 'Symfony\\Component\\Config\\Definition\\Builder\\NormalizationBuilder' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/NormalizationBuilder.php', + 'Symfony\\Component\\Config\\Definition\\Builder\\NumericNodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/NumericNodeDefinition.php', + 'Symfony\\Component\\Config\\Definition\\Builder\\ParentNodeDefinitionInterface' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/ParentNodeDefinitionInterface.php', + 'Symfony\\Component\\Config\\Definition\\Builder\\ScalarNodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/ScalarNodeDefinition.php', + 'Symfony\\Component\\Config\\Definition\\Builder\\TreeBuilder' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/TreeBuilder.php', + 'Symfony\\Component\\Config\\Definition\\Builder\\ValidationBuilder' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/ValidationBuilder.php', + 'Symfony\\Component\\Config\\Definition\\Builder\\VariableNodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/VariableNodeDefinition.php', + 'Symfony\\Component\\Config\\Definition\\ConfigurationInterface' => __DIR__ . '/..' . '/symfony/config/Definition/ConfigurationInterface.php', + 'Symfony\\Component\\Config\\Definition\\Dumper\\XmlReferenceDumper' => __DIR__ . '/..' . '/symfony/config/Definition/Dumper/XmlReferenceDumper.php', + 'Symfony\\Component\\Config\\Definition\\Dumper\\YamlReferenceDumper' => __DIR__ . '/..' . '/symfony/config/Definition/Dumper/YamlReferenceDumper.php', + 'Symfony\\Component\\Config\\Definition\\EnumNode' => __DIR__ . '/..' . '/symfony/config/Definition/EnumNode.php', + 'Symfony\\Component\\Config\\Definition\\Exception\\DuplicateKeyException' => __DIR__ . '/..' . '/symfony/config/Definition/Exception/DuplicateKeyException.php', + 'Symfony\\Component\\Config\\Definition\\Exception\\Exception' => __DIR__ . '/..' . '/symfony/config/Definition/Exception/Exception.php', + 'Symfony\\Component\\Config\\Definition\\Exception\\ForbiddenOverwriteException' => __DIR__ . '/..' . '/symfony/config/Definition/Exception/ForbiddenOverwriteException.php', + 'Symfony\\Component\\Config\\Definition\\Exception\\InvalidConfigurationException' => __DIR__ . '/..' . '/symfony/config/Definition/Exception/InvalidConfigurationException.php', + 'Symfony\\Component\\Config\\Definition\\Exception\\InvalidDefinitionException' => __DIR__ . '/..' . '/symfony/config/Definition/Exception/InvalidDefinitionException.php', + 'Symfony\\Component\\Config\\Definition\\Exception\\InvalidTypeException' => __DIR__ . '/..' . '/symfony/config/Definition/Exception/InvalidTypeException.php', + 'Symfony\\Component\\Config\\Definition\\Exception\\UnsetKeyException' => __DIR__ . '/..' . '/symfony/config/Definition/Exception/UnsetKeyException.php', + 'Symfony\\Component\\Config\\Definition\\FloatNode' => __DIR__ . '/..' . '/symfony/config/Definition/FloatNode.php', + 'Symfony\\Component\\Config\\Definition\\IntegerNode' => __DIR__ . '/..' . '/symfony/config/Definition/IntegerNode.php', + 'Symfony\\Component\\Config\\Definition\\NodeInterface' => __DIR__ . '/..' . '/symfony/config/Definition/NodeInterface.php', + 'Symfony\\Component\\Config\\Definition\\NumericNode' => __DIR__ . '/..' . '/symfony/config/Definition/NumericNode.php', + 'Symfony\\Component\\Config\\Definition\\Processor' => __DIR__ . '/..' . '/symfony/config/Definition/Processor.php', + 'Symfony\\Component\\Config\\Definition\\PrototypeNodeInterface' => __DIR__ . '/..' . '/symfony/config/Definition/PrototypeNodeInterface.php', + 'Symfony\\Component\\Config\\Definition\\PrototypedArrayNode' => __DIR__ . '/..' . '/symfony/config/Definition/PrototypedArrayNode.php', + 'Symfony\\Component\\Config\\Definition\\ReferenceDumper' => __DIR__ . '/..' . '/symfony/config/Definition/ReferenceDumper.php', + 'Symfony\\Component\\Config\\Definition\\ScalarNode' => __DIR__ . '/..' . '/symfony/config/Definition/ScalarNode.php', + 'Symfony\\Component\\Config\\Definition\\VariableNode' => __DIR__ . '/..' . '/symfony/config/Definition/VariableNode.php', + 'Symfony\\Component\\Config\\Exception\\FileLoaderImportCircularReferenceException' => __DIR__ . '/..' . '/symfony/config/Exception/FileLoaderImportCircularReferenceException.php', + 'Symfony\\Component\\Config\\Exception\\FileLoaderLoadException' => __DIR__ . '/..' . '/symfony/config/Exception/FileLoaderLoadException.php', + 'Symfony\\Component\\Config\\FileLocator' => __DIR__ . '/..' . '/symfony/config/FileLocator.php', + 'Symfony\\Component\\Config\\FileLocatorInterface' => __DIR__ . '/..' . '/symfony/config/FileLocatorInterface.php', + 'Symfony\\Component\\Config\\Loader\\DelegatingLoader' => __DIR__ . '/..' . '/symfony/config/Loader/DelegatingLoader.php', + 'Symfony\\Component\\Config\\Loader\\FileLoader' => __DIR__ . '/..' . '/symfony/config/Loader/FileLoader.php', + 'Symfony\\Component\\Config\\Loader\\Loader' => __DIR__ . '/..' . '/symfony/config/Loader/Loader.php', + 'Symfony\\Component\\Config\\Loader\\LoaderInterface' => __DIR__ . '/..' . '/symfony/config/Loader/LoaderInterface.php', + 'Symfony\\Component\\Config\\Loader\\LoaderResolver' => __DIR__ . '/..' . '/symfony/config/Loader/LoaderResolver.php', + 'Symfony\\Component\\Config\\Loader\\LoaderResolverInterface' => __DIR__ . '/..' . '/symfony/config/Loader/LoaderResolverInterface.php', + 'Symfony\\Component\\Config\\ResourceCheckerConfigCache' => __DIR__ . '/..' . '/symfony/config/ResourceCheckerConfigCache.php', + 'Symfony\\Component\\Config\\ResourceCheckerConfigCacheFactory' => __DIR__ . '/..' . '/symfony/config/ResourceCheckerConfigCacheFactory.php', + 'Symfony\\Component\\Config\\ResourceCheckerInterface' => __DIR__ . '/..' . '/symfony/config/ResourceCheckerInterface.php', + 'Symfony\\Component\\Config\\Resource\\BCResourceInterfaceChecker' => __DIR__ . '/..' . '/symfony/config/Resource/BCResourceInterfaceChecker.php', + 'Symfony\\Component\\Config\\Resource\\DirectoryResource' => __DIR__ . '/..' . '/symfony/config/Resource/DirectoryResource.php', + 'Symfony\\Component\\Config\\Resource\\FileExistenceResource' => __DIR__ . '/..' . '/symfony/config/Resource/FileExistenceResource.php', + 'Symfony\\Component\\Config\\Resource\\FileResource' => __DIR__ . '/..' . '/symfony/config/Resource/FileResource.php', + 'Symfony\\Component\\Config\\Resource\\ResourceInterface' => __DIR__ . '/..' . '/symfony/config/Resource/ResourceInterface.php', + 'Symfony\\Component\\Config\\Resource\\SelfCheckingResourceChecker' => __DIR__ . '/..' . '/symfony/config/Resource/SelfCheckingResourceChecker.php', + 'Symfony\\Component\\Config\\Resource\\SelfCheckingResourceInterface' => __DIR__ . '/..' . '/symfony/config/Resource/SelfCheckingResourceInterface.php', + 'Symfony\\Component\\Config\\Util\\XmlUtils' => __DIR__ . '/..' . '/symfony/config/Util/XmlUtils.php', + 'Symfony\\Component\\Console\\Application' => __DIR__ . '/..' . '/symfony/console/Application.php', + 'Symfony\\Component\\Console\\Command\\Command' => __DIR__ . '/..' . '/symfony/console/Command/Command.php', + 'Symfony\\Component\\Console\\Command\\HelpCommand' => __DIR__ . '/..' . '/symfony/console/Command/HelpCommand.php', + 'Symfony\\Component\\Console\\Command\\ListCommand' => __DIR__ . '/..' . '/symfony/console/Command/ListCommand.php', + 'Symfony\\Component\\Console\\ConsoleEvents' => __DIR__ . '/..' . '/symfony/console/ConsoleEvents.php', + 'Symfony\\Component\\Console\\Descriptor\\ApplicationDescription' => __DIR__ . '/..' . '/symfony/console/Descriptor/ApplicationDescription.php', + 'Symfony\\Component\\Console\\Descriptor\\Descriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/Descriptor.php', + 'Symfony\\Component\\Console\\Descriptor\\DescriptorInterface' => __DIR__ . '/..' . '/symfony/console/Descriptor/DescriptorInterface.php', + 'Symfony\\Component\\Console\\Descriptor\\JsonDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/JsonDescriptor.php', + 'Symfony\\Component\\Console\\Descriptor\\MarkdownDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/MarkdownDescriptor.php', + 'Symfony\\Component\\Console\\Descriptor\\TextDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/TextDescriptor.php', + 'Symfony\\Component\\Console\\Descriptor\\XmlDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/XmlDescriptor.php', + 'Symfony\\Component\\Console\\Event\\ConsoleCommandEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleCommandEvent.php', + 'Symfony\\Component\\Console\\Event\\ConsoleEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleEvent.php', + 'Symfony\\Component\\Console\\Event\\ConsoleExceptionEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleExceptionEvent.php', + 'Symfony\\Component\\Console\\Event\\ConsoleTerminateEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleTerminateEvent.php', + 'Symfony\\Component\\Console\\Exception\\CommandNotFoundException' => __DIR__ . '/..' . '/symfony/console/Exception/CommandNotFoundException.php', + 'Symfony\\Component\\Console\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/console/Exception/ExceptionInterface.php', + 'Symfony\\Component\\Console\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/console/Exception/InvalidArgumentException.php', + 'Symfony\\Component\\Console\\Exception\\InvalidOptionException' => __DIR__ . '/..' . '/symfony/console/Exception/InvalidOptionException.php', + 'Symfony\\Component\\Console\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/console/Exception/LogicException.php', + 'Symfony\\Component\\Console\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/console/Exception/RuntimeException.php', + 'Symfony\\Component\\Console\\Formatter\\OutputFormatter' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatter.php', + 'Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterInterface.php', + '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\\Helper\\DebugFormatterHelper' => __DIR__ . '/..' . '/symfony/console/Helper/DebugFormatterHelper.php', + 'Symfony\\Component\\Console\\Helper\\DescriptorHelper' => __DIR__ . '/..' . '/symfony/console/Helper/DescriptorHelper.php', + 'Symfony\\Component\\Console\\Helper\\DialogHelper' => __DIR__ . '/..' . '/symfony/console/Helper/DialogHelper.php', + 'Symfony\\Component\\Console\\Helper\\FormatterHelper' => __DIR__ . '/..' . '/symfony/console/Helper/FormatterHelper.php', + 'Symfony\\Component\\Console\\Helper\\Helper' => __DIR__ . '/..' . '/symfony/console/Helper/Helper.php', + 'Symfony\\Component\\Console\\Helper\\HelperInterface' => __DIR__ . '/..' . '/symfony/console/Helper/HelperInterface.php', + 'Symfony\\Component\\Console\\Helper\\HelperSet' => __DIR__ . '/..' . '/symfony/console/Helper/HelperSet.php', + 'Symfony\\Component\\Console\\Helper\\InputAwareHelper' => __DIR__ . '/..' . '/symfony/console/Helper/InputAwareHelper.php', + 'Symfony\\Component\\Console\\Helper\\ProcessHelper' => __DIR__ . '/..' . '/symfony/console/Helper/ProcessHelper.php', + 'Symfony\\Component\\Console\\Helper\\ProgressBar' => __DIR__ . '/..' . '/symfony/console/Helper/ProgressBar.php', + 'Symfony\\Component\\Console\\Helper\\ProgressHelper' => __DIR__ . '/..' . '/symfony/console/Helper/ProgressHelper.php', + 'Symfony\\Component\\Console\\Helper\\ProgressIndicator' => __DIR__ . '/..' . '/symfony/console/Helper/ProgressIndicator.php', + 'Symfony\\Component\\Console\\Helper\\QuestionHelper' => __DIR__ . '/..' . '/symfony/console/Helper/QuestionHelper.php', + 'Symfony\\Component\\Console\\Helper\\SymfonyQuestionHelper' => __DIR__ . '/..' . '/symfony/console/Helper/SymfonyQuestionHelper.php', + 'Symfony\\Component\\Console\\Helper\\Table' => __DIR__ . '/..' . '/symfony/console/Helper/Table.php', + 'Symfony\\Component\\Console\\Helper\\TableCell' => __DIR__ . '/..' . '/symfony/console/Helper/TableCell.php', + 'Symfony\\Component\\Console\\Helper\\TableHelper' => __DIR__ . '/..' . '/symfony/console/Helper/TableHelper.php', + 'Symfony\\Component\\Console\\Helper\\TableSeparator' => __DIR__ . '/..' . '/symfony/console/Helper/TableSeparator.php', + 'Symfony\\Component\\Console\\Helper\\TableStyle' => __DIR__ . '/..' . '/symfony/console/Helper/TableStyle.php', + 'Symfony\\Component\\Console\\Input\\ArgvInput' => __DIR__ . '/..' . '/symfony/console/Input/ArgvInput.php', + 'Symfony\\Component\\Console\\Input\\ArrayInput' => __DIR__ . '/..' . '/symfony/console/Input/ArrayInput.php', + 'Symfony\\Component\\Console\\Input\\Input' => __DIR__ . '/..' . '/symfony/console/Input/Input.php', + 'Symfony\\Component\\Console\\Input\\InputArgument' => __DIR__ . '/..' . '/symfony/console/Input/InputArgument.php', + 'Symfony\\Component\\Console\\Input\\InputAwareInterface' => __DIR__ . '/..' . '/symfony/console/Input/InputAwareInterface.php', + 'Symfony\\Component\\Console\\Input\\InputDefinition' => __DIR__ . '/..' . '/symfony/console/Input/InputDefinition.php', + 'Symfony\\Component\\Console\\Input\\InputInterface' => __DIR__ . '/..' . '/symfony/console/Input/InputInterface.php', + 'Symfony\\Component\\Console\\Input\\InputOption' => __DIR__ . '/..' . '/symfony/console/Input/InputOption.php', + 'Symfony\\Component\\Console\\Input\\StringInput' => __DIR__ . '/..' . '/symfony/console/Input/StringInput.php', + 'Symfony\\Component\\Console\\Logger\\ConsoleLogger' => __DIR__ . '/..' . '/symfony/console/Logger/ConsoleLogger.php', + 'Symfony\\Component\\Console\\Output\\BufferedOutput' => __DIR__ . '/..' . '/symfony/console/Output/BufferedOutput.php', + 'Symfony\\Component\\Console\\Output\\ConsoleOutput' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleOutput.php', + 'Symfony\\Component\\Console\\Output\\ConsoleOutputInterface' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleOutputInterface.php', + 'Symfony\\Component\\Console\\Output\\NullOutput' => __DIR__ . '/..' . '/symfony/console/Output/NullOutput.php', + 'Symfony\\Component\\Console\\Output\\Output' => __DIR__ . '/..' . '/symfony/console/Output/Output.php', + 'Symfony\\Component\\Console\\Output\\OutputInterface' => __DIR__ . '/..' . '/symfony/console/Output/OutputInterface.php', + 'Symfony\\Component\\Console\\Output\\StreamOutput' => __DIR__ . '/..' . '/symfony/console/Output/StreamOutput.php', + 'Symfony\\Component\\Console\\Question\\ChoiceQuestion' => __DIR__ . '/..' . '/symfony/console/Question/ChoiceQuestion.php', + 'Symfony\\Component\\Console\\Question\\ConfirmationQuestion' => __DIR__ . '/..' . '/symfony/console/Question/ConfirmationQuestion.php', + 'Symfony\\Component\\Console\\Question\\Question' => __DIR__ . '/..' . '/symfony/console/Question/Question.php', + 'Symfony\\Component\\Console\\Shell' => __DIR__ . '/..' . '/symfony/console/Shell.php', + 'Symfony\\Component\\Console\\Style\\OutputStyle' => __DIR__ . '/..' . '/symfony/console/Style/OutputStyle.php', + 'Symfony\\Component\\Console\\Style\\StyleInterface' => __DIR__ . '/..' . '/symfony/console/Style/StyleInterface.php', + 'Symfony\\Component\\Console\\Style\\SymfonyStyle' => __DIR__ . '/..' . '/symfony/console/Style/SymfonyStyle.php', + 'Symfony\\Component\\Console\\Tester\\ApplicationTester' => __DIR__ . '/..' . '/symfony/console/Tester/ApplicationTester.php', + 'Symfony\\Component\\Console\\Tester\\CommandTester' => __DIR__ . '/..' . '/symfony/console/Tester/CommandTester.php', + 'Symfony\\Component\\Debug\\BufferingLogger' => __DIR__ . '/..' . '/symfony/debug/BufferingLogger.php', + 'Symfony\\Component\\Debug\\Debug' => __DIR__ . '/..' . '/symfony/debug/Debug.php', + 'Symfony\\Component\\Debug\\DebugClassLoader' => __DIR__ . '/..' . '/symfony/debug/DebugClassLoader.php', + 'Symfony\\Component\\Debug\\ErrorHandler' => __DIR__ . '/..' . '/symfony/debug/ErrorHandler.php', + 'Symfony\\Component\\Debug\\ExceptionHandler' => __DIR__ . '/..' . '/symfony/debug/ExceptionHandler.php', + 'Symfony\\Component\\Debug\\Exception\\ClassNotFoundException' => __DIR__ . '/..' . '/symfony/debug/Exception/ClassNotFoundException.php', + 'Symfony\\Component\\Debug\\Exception\\ContextErrorException' => __DIR__ . '/..' . '/symfony/debug/Exception/ContextErrorException.php', + 'Symfony\\Component\\Debug\\Exception\\FatalErrorException' => __DIR__ . '/..' . '/symfony/debug/Exception/FatalErrorException.php', + 'Symfony\\Component\\Debug\\Exception\\FatalThrowableError' => __DIR__ . '/..' . '/symfony/debug/Exception/FatalThrowableError.php', + 'Symfony\\Component\\Debug\\Exception\\FlattenException' => __DIR__ . '/..' . '/symfony/debug/Exception/FlattenException.php', + 'Symfony\\Component\\Debug\\Exception\\OutOfMemoryException' => __DIR__ . '/..' . '/symfony/debug/Exception/OutOfMemoryException.php', + 'Symfony\\Component\\Debug\\Exception\\UndefinedFunctionException' => __DIR__ . '/..' . '/symfony/debug/Exception/UndefinedFunctionException.php', + 'Symfony\\Component\\Debug\\Exception\\UndefinedMethodException' => __DIR__ . '/..' . '/symfony/debug/Exception/UndefinedMethodException.php', + 'Symfony\\Component\\Debug\\FatalErrorHandler\\ClassNotFoundFatalErrorHandler' => __DIR__ . '/..' . '/symfony/debug/FatalErrorHandler/ClassNotFoundFatalErrorHandler.php', + 'Symfony\\Component\\Debug\\FatalErrorHandler\\FatalErrorHandlerInterface' => __DIR__ . '/..' . '/symfony/debug/FatalErrorHandler/FatalErrorHandlerInterface.php', + 'Symfony\\Component\\Debug\\FatalErrorHandler\\UndefinedFunctionFatalErrorHandler' => __DIR__ . '/..' . '/symfony/debug/FatalErrorHandler/UndefinedFunctionFatalErrorHandler.php', + 'Symfony\\Component\\Debug\\FatalErrorHandler\\UndefinedMethodFatalErrorHandler' => __DIR__ . '/..' . '/symfony/debug/FatalErrorHandler/UndefinedMethodFatalErrorHandler.php', + 'Symfony\\Component\\EventDispatcher\\ContainerAwareEventDispatcher' => __DIR__ . '/..' . '/symfony/event-dispatcher/ContainerAwareEventDispatcher.php', + 'Symfony\\Component\\EventDispatcher\\Debug\\TraceableEventDispatcher' => __DIR__ . '/..' . '/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php', + 'Symfony\\Component\\EventDispatcher\\Debug\\TraceableEventDispatcherInterface' => __DIR__ . '/..' . '/symfony/event-dispatcher/Debug/TraceableEventDispatcherInterface.php', + 'Symfony\\Component\\EventDispatcher\\Debug\\WrappedListener' => __DIR__ . '/..' . '/symfony/event-dispatcher/Debug/WrappedListener.php', + 'Symfony\\Component\\EventDispatcher\\DependencyInjection\\RegisterListenersPass' => __DIR__ . '/..' . '/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php', + 'Symfony\\Component\\EventDispatcher\\Event' => __DIR__ . '/..' . '/symfony/event-dispatcher/Event.php', + 'Symfony\\Component\\EventDispatcher\\EventDispatcher' => __DIR__ . '/..' . '/symfony/event-dispatcher/EventDispatcher.php', + 'Symfony\\Component\\EventDispatcher\\EventDispatcherInterface' => __DIR__ . '/..' . '/symfony/event-dispatcher/EventDispatcherInterface.php', + 'Symfony\\Component\\EventDispatcher\\EventSubscriberInterface' => __DIR__ . '/..' . '/symfony/event-dispatcher/EventSubscriberInterface.php', + 'Symfony\\Component\\EventDispatcher\\GenericEvent' => __DIR__ . '/..' . '/symfony/event-dispatcher/GenericEvent.php', + 'Symfony\\Component\\EventDispatcher\\ImmutableEventDispatcher' => __DIR__ . '/..' . '/symfony/event-dispatcher/ImmutableEventDispatcher.php', + 'Symfony\\Component\\Filesystem\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/filesystem/Exception/ExceptionInterface.php', + 'Symfony\\Component\\Filesystem\\Exception\\FileNotFoundException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/FileNotFoundException.php', + 'Symfony\\Component\\Filesystem\\Exception\\IOException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/IOException.php', + 'Symfony\\Component\\Filesystem\\Exception\\IOExceptionInterface' => __DIR__ . '/..' . '/symfony/filesystem/Exception/IOExceptionInterface.php', + 'Symfony\\Component\\Filesystem\\Filesystem' => __DIR__ . '/..' . '/symfony/filesystem/Filesystem.php', + 'Symfony\\Component\\Filesystem\\LockHandler' => __DIR__ . '/..' . '/symfony/filesystem/LockHandler.php', + 'Symfony\\Component\\Finder\\Adapter\\AbstractAdapter' => __DIR__ . '/..' . '/symfony/finder/Adapter/AbstractAdapter.php', + 'Symfony\\Component\\Finder\\Adapter\\AbstractFindAdapter' => __DIR__ . '/..' . '/symfony/finder/Adapter/AbstractFindAdapter.php', + 'Symfony\\Component\\Finder\\Adapter\\AdapterInterface' => __DIR__ . '/..' . '/symfony/finder/Adapter/AdapterInterface.php', + 'Symfony\\Component\\Finder\\Adapter\\BsdFindAdapter' => __DIR__ . '/..' . '/symfony/finder/Adapter/BsdFindAdapter.php', + 'Symfony\\Component\\Finder\\Adapter\\GnuFindAdapter' => __DIR__ . '/..' . '/symfony/finder/Adapter/GnuFindAdapter.php', + 'Symfony\\Component\\Finder\\Adapter\\PhpAdapter' => __DIR__ . '/..' . '/symfony/finder/Adapter/PhpAdapter.php', + 'Symfony\\Component\\Finder\\Comparator\\Comparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/Comparator.php', + 'Symfony\\Component\\Finder\\Comparator\\DateComparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/DateComparator.php', + 'Symfony\\Component\\Finder\\Comparator\\NumberComparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/NumberComparator.php', + 'Symfony\\Component\\Finder\\Exception\\AccessDeniedException' => __DIR__ . '/..' . '/symfony/finder/Exception/AccessDeniedException.php', + 'Symfony\\Component\\Finder\\Exception\\AdapterFailureException' => __DIR__ . '/..' . '/symfony/finder/Exception/AdapterFailureException.php', + 'Symfony\\Component\\Finder\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/finder/Exception/ExceptionInterface.php', + 'Symfony\\Component\\Finder\\Exception\\OperationNotPermitedException' => __DIR__ . '/..' . '/symfony/finder/Exception/OperationNotPermitedException.php', + 'Symfony\\Component\\Finder\\Exception\\ShellCommandFailureException' => __DIR__ . '/..' . '/symfony/finder/Exception/ShellCommandFailureException.php', + 'Symfony\\Component\\Finder\\Expression\\Expression' => __DIR__ . '/..' . '/symfony/finder/Expression/Expression.php', + 'Symfony\\Component\\Finder\\Expression\\Glob' => __DIR__ . '/..' . '/symfony/finder/Expression/Glob.php', + 'Symfony\\Component\\Finder\\Expression\\Regex' => __DIR__ . '/..' . '/symfony/finder/Expression/Regex.php', + 'Symfony\\Component\\Finder\\Expression\\ValueInterface' => __DIR__ . '/..' . '/symfony/finder/Expression/ValueInterface.php', + 'Symfony\\Component\\Finder\\Finder' => __DIR__ . '/..' . '/symfony/finder/Finder.php', + 'Symfony\\Component\\Finder\\Glob' => __DIR__ . '/..' . '/symfony/finder/Glob.php', + 'Symfony\\Component\\Finder\\Iterator\\CustomFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/CustomFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\DateRangeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/DateRangeFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\DepthRangeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/DepthRangeFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\ExcludeDirectoryFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\FilePathsIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FilePathsIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\FileTypeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FileTypeFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\FilecontentFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FilecontentFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\FilenameFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FilenameFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\FilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\MultiplePcreFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/MultiplePcreFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\PathFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/PathFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\RecursiveDirectoryIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/RecursiveDirectoryIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\SizeRangeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/SizeRangeFilterIterator.php', + 'Symfony\\Component\\Finder\\Iterator\\SortableIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/SortableIterator.php', + 'Symfony\\Component\\Finder\\Shell\\Command' => __DIR__ . '/..' . '/symfony/finder/Shell/Command.php', + 'Symfony\\Component\\Finder\\Shell\\Shell' => __DIR__ . '/..' . '/symfony/finder/Shell/Shell.php', + 'Symfony\\Component\\Finder\\SplFileInfo' => __DIR__ . '/..' . '/symfony/finder/SplFileInfo.php', + 'Symfony\\Component\\Process\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/process/Exception/ExceptionInterface.php', + 'Symfony\\Component\\Process\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/process/Exception/InvalidArgumentException.php', + 'Symfony\\Component\\Process\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/process/Exception/LogicException.php', + 'Symfony\\Component\\Process\\Exception\\ProcessFailedException' => __DIR__ . '/..' . '/symfony/process/Exception/ProcessFailedException.php', + 'Symfony\\Component\\Process\\Exception\\ProcessTimedOutException' => __DIR__ . '/..' . '/symfony/process/Exception/ProcessTimedOutException.php', + 'Symfony\\Component\\Process\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/process/Exception/RuntimeException.php', + 'Symfony\\Component\\Process\\ExecutableFinder' => __DIR__ . '/..' . '/symfony/process/ExecutableFinder.php', + 'Symfony\\Component\\Process\\PhpExecutableFinder' => __DIR__ . '/..' . '/symfony/process/PhpExecutableFinder.php', + 'Symfony\\Component\\Process\\PhpProcess' => __DIR__ . '/..' . '/symfony/process/PhpProcess.php', + 'Symfony\\Component\\Process\\Pipes\\AbstractPipes' => __DIR__ . '/..' . '/symfony/process/Pipes/AbstractPipes.php', + 'Symfony\\Component\\Process\\Pipes\\PipesInterface' => __DIR__ . '/..' . '/symfony/process/Pipes/PipesInterface.php', + 'Symfony\\Component\\Process\\Pipes\\UnixPipes' => __DIR__ . '/..' . '/symfony/process/Pipes/UnixPipes.php', + 'Symfony\\Component\\Process\\Pipes\\WindowsPipes' => __DIR__ . '/..' . '/symfony/process/Pipes/WindowsPipes.php', + 'Symfony\\Component\\Process\\Process' => __DIR__ . '/..' . '/symfony/process/Process.php', + 'Symfony\\Component\\Process\\ProcessBuilder' => __DIR__ . '/..' . '/symfony/process/ProcessBuilder.php', + 'Symfony\\Component\\Process\\ProcessUtils' => __DIR__ . '/..' . '/symfony/process/ProcessUtils.php', + 'Symfony\\Component\\Stopwatch\\Section' => __DIR__ . '/..' . '/symfony/stopwatch/Section.php', + 'Symfony\\Component\\Stopwatch\\Stopwatch' => __DIR__ . '/..' . '/symfony/stopwatch/Stopwatch.php', + 'Symfony\\Component\\Stopwatch\\StopwatchEvent' => __DIR__ . '/..' . '/symfony/stopwatch/StopwatchEvent.php', + 'Symfony\\Component\\Stopwatch\\StopwatchPeriod' => __DIR__ . '/..' . '/symfony/stopwatch/StopwatchPeriod.php', + 'Symfony\\Component\\Translation\\Catalogue\\AbstractOperation' => __DIR__ . '/..' . '/symfony/translation/Catalogue/AbstractOperation.php', + 'Symfony\\Component\\Translation\\Catalogue\\MergeOperation' => __DIR__ . '/..' . '/symfony/translation/Catalogue/MergeOperation.php', + 'Symfony\\Component\\Translation\\Catalogue\\OperationInterface' => __DIR__ . '/..' . '/symfony/translation/Catalogue/OperationInterface.php', + 'Symfony\\Component\\Translation\\Catalogue\\TargetOperation' => __DIR__ . '/..' . '/symfony/translation/Catalogue/TargetOperation.php', + 'Symfony\\Component\\Translation\\DataCollectorTranslator' => __DIR__ . '/..' . '/symfony/translation/DataCollectorTranslator.php', + 'Symfony\\Component\\Translation\\DataCollector\\TranslationDataCollector' => __DIR__ . '/..' . '/symfony/translation/DataCollector/TranslationDataCollector.php', + 'Symfony\\Component\\Translation\\Dumper\\CsvFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/CsvFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\DumperInterface' => __DIR__ . '/..' . '/symfony/translation/Dumper/DumperInterface.php', + 'Symfony\\Component\\Translation\\Dumper\\FileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/FileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\IcuResFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/IcuResFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\IniFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/IniFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\JsonFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/JsonFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\MoFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/MoFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\PhpFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/PhpFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\PoFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/PoFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\QtFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/QtFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\XliffFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/XliffFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\YamlFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/YamlFileDumper.php', + 'Symfony\\Component\\Translation\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/translation/Exception/ExceptionInterface.php', + 'Symfony\\Component\\Translation\\Exception\\InvalidResourceException' => __DIR__ . '/..' . '/symfony/translation/Exception/InvalidResourceException.php', + 'Symfony\\Component\\Translation\\Exception\\NotFoundResourceException' => __DIR__ . '/..' . '/symfony/translation/Exception/NotFoundResourceException.php', + 'Symfony\\Component\\Translation\\Extractor\\AbstractFileExtractor' => __DIR__ . '/..' . '/symfony/translation/Extractor/AbstractFileExtractor.php', + 'Symfony\\Component\\Translation\\Extractor\\ChainExtractor' => __DIR__ . '/..' . '/symfony/translation/Extractor/ChainExtractor.php', + 'Symfony\\Component\\Translation\\Extractor\\ExtractorInterface' => __DIR__ . '/..' . '/symfony/translation/Extractor/ExtractorInterface.php', + 'Symfony\\Component\\Translation\\IdentityTranslator' => __DIR__ . '/..' . '/symfony/translation/IdentityTranslator.php', + 'Symfony\\Component\\Translation\\Interval' => __DIR__ . '/..' . '/symfony/translation/Interval.php', + 'Symfony\\Component\\Translation\\Loader\\ArrayLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/ArrayLoader.php', + 'Symfony\\Component\\Translation\\Loader\\CsvFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/CsvFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\FileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/FileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\IcuDatFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/IcuDatFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\IcuResFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/IcuResFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\IniFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/IniFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\JsonFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/JsonFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\LoaderInterface' => __DIR__ . '/..' . '/symfony/translation/Loader/LoaderInterface.php', + 'Symfony\\Component\\Translation\\Loader\\MoFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/MoFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\PhpFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/PhpFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\PoFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/PoFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\QtFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/QtFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\XliffFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/XliffFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\YamlFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/YamlFileLoader.php', + 'Symfony\\Component\\Translation\\LoggingTranslator' => __DIR__ . '/..' . '/symfony/translation/LoggingTranslator.php', + 'Symfony\\Component\\Translation\\MessageCatalogue' => __DIR__ . '/..' . '/symfony/translation/MessageCatalogue.php', + 'Symfony\\Component\\Translation\\MessageCatalogueInterface' => __DIR__ . '/..' . '/symfony/translation/MessageCatalogueInterface.php', + 'Symfony\\Component\\Translation\\MessageSelector' => __DIR__ . '/..' . '/symfony/translation/MessageSelector.php', + 'Symfony\\Component\\Translation\\MetadataAwareInterface' => __DIR__ . '/..' . '/symfony/translation/MetadataAwareInterface.php', + 'Symfony\\Component\\Translation\\PluralizationRules' => __DIR__ . '/..' . '/symfony/translation/PluralizationRules.php', + 'Symfony\\Component\\Translation\\Translator' => __DIR__ . '/..' . '/symfony/translation/Translator.php', + '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\\Writer\\TranslationWriter' => __DIR__ . '/..' . '/symfony/translation/Writer/TranslationWriter.php', + 'Symfony\\Component\\Validator\\ClassBasedInterface' => __DIR__ . '/..' . '/symfony/validator/ClassBasedInterface.php', + 'Symfony\\Component\\Validator\\Constraint' => __DIR__ . '/..' . '/symfony/validator/Constraint.php', + 'Symfony\\Component\\Validator\\ConstraintValidator' => __DIR__ . '/..' . '/symfony/validator/ConstraintValidator.php', + 'Symfony\\Component\\Validator\\ConstraintValidatorFactory' => __DIR__ . '/..' . '/symfony/validator/ConstraintValidatorFactory.php', + 'Symfony\\Component\\Validator\\ConstraintValidatorFactoryInterface' => __DIR__ . '/..' . '/symfony/validator/ConstraintValidatorFactoryInterface.php', + 'Symfony\\Component\\Validator\\ConstraintValidatorInterface' => __DIR__ . '/..' . '/symfony/validator/ConstraintValidatorInterface.php', + 'Symfony\\Component\\Validator\\ConstraintViolation' => __DIR__ . '/..' . '/symfony/validator/ConstraintViolation.php', + 'Symfony\\Component\\Validator\\ConstraintViolationInterface' => __DIR__ . '/..' . '/symfony/validator/ConstraintViolationInterface.php', + 'Symfony\\Component\\Validator\\ConstraintViolationList' => __DIR__ . '/..' . '/symfony/validator/ConstraintViolationList.php', + 'Symfony\\Component\\Validator\\ConstraintViolationListInterface' => __DIR__ . '/..' . '/symfony/validator/ConstraintViolationListInterface.php', + 'Symfony\\Component\\Validator\\Constraints\\AbstractComparison' => __DIR__ . '/..' . '/symfony/validator/Constraints/AbstractComparison.php', + 'Symfony\\Component\\Validator\\Constraints\\AbstractComparisonValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/AbstractComparisonValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\All' => __DIR__ . '/..' . '/symfony/validator/Constraints/All.php', + 'Symfony\\Component\\Validator\\Constraints\\AllValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/AllValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Bic' => __DIR__ . '/..' . '/symfony/validator/Constraints/Bic.php', + 'Symfony\\Component\\Validator\\Constraints\\BicValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/BicValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Blank' => __DIR__ . '/..' . '/symfony/validator/Constraints/Blank.php', + 'Symfony\\Component\\Validator\\Constraints\\BlankValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/BlankValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Callback' => __DIR__ . '/..' . '/symfony/validator/Constraints/Callback.php', + 'Symfony\\Component\\Validator\\Constraints\\CallbackValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/CallbackValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\CardScheme' => __DIR__ . '/..' . '/symfony/validator/Constraints/CardScheme.php', + 'Symfony\\Component\\Validator\\Constraints\\CardSchemeValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/CardSchemeValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Choice' => __DIR__ . '/..' . '/symfony/validator/Constraints/Choice.php', + 'Symfony\\Component\\Validator\\Constraints\\ChoiceValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/ChoiceValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Collection' => __DIR__ . '/..' . '/symfony/validator/Constraints/Collection.php', + 'Symfony\\Component\\Validator\\Constraints\\CollectionValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/CollectionValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Collection\\Optional' => __DIR__ . '/..' . '/symfony/validator/Constraints/Collection/Optional.php', + 'Symfony\\Component\\Validator\\Constraints\\Collection\\Required' => __DIR__ . '/..' . '/symfony/validator/Constraints/Collection/Required.php', + 'Symfony\\Component\\Validator\\Constraints\\Composite' => __DIR__ . '/..' . '/symfony/validator/Constraints/Composite.php', + 'Symfony\\Component\\Validator\\Constraints\\Count' => __DIR__ . '/..' . '/symfony/validator/Constraints/Count.php', + 'Symfony\\Component\\Validator\\Constraints\\CountValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/CountValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Country' => __DIR__ . '/..' . '/symfony/validator/Constraints/Country.php', + 'Symfony\\Component\\Validator\\Constraints\\CountryValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/CountryValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Currency' => __DIR__ . '/..' . '/symfony/validator/Constraints/Currency.php', + 'Symfony\\Component\\Validator\\Constraints\\CurrencyValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/CurrencyValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Date' => __DIR__ . '/..' . '/symfony/validator/Constraints/Date.php', + 'Symfony\\Component\\Validator\\Constraints\\DateTime' => __DIR__ . '/..' . '/symfony/validator/Constraints/DateTime.php', + 'Symfony\\Component\\Validator\\Constraints\\DateTimeValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/DateTimeValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\DateValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/DateValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Email' => __DIR__ . '/..' . '/symfony/validator/Constraints/Email.php', + 'Symfony\\Component\\Validator\\Constraints\\EmailValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/EmailValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\EqualTo' => __DIR__ . '/..' . '/symfony/validator/Constraints/EqualTo.php', + 'Symfony\\Component\\Validator\\Constraints\\EqualToValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/EqualToValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Existence' => __DIR__ . '/..' . '/symfony/validator/Constraints/Existence.php', + 'Symfony\\Component\\Validator\\Constraints\\Expression' => __DIR__ . '/..' . '/symfony/validator/Constraints/Expression.php', + 'Symfony\\Component\\Validator\\Constraints\\ExpressionValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/ExpressionValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\False' => __DIR__ . '/..' . '/symfony/validator/Constraints/False.php', + 'Symfony\\Component\\Validator\\Constraints\\FalseValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/FalseValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\File' => __DIR__ . '/..' . '/symfony/validator/Constraints/File.php', + 'Symfony\\Component\\Validator\\Constraints\\FileValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/FileValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\GreaterThan' => __DIR__ . '/..' . '/symfony/validator/Constraints/GreaterThan.php', + 'Symfony\\Component\\Validator\\Constraints\\GreaterThanOrEqual' => __DIR__ . '/..' . '/symfony/validator/Constraints/GreaterThanOrEqual.php', + 'Symfony\\Component\\Validator\\Constraints\\GreaterThanOrEqualValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/GreaterThanOrEqualValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\GreaterThanValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/GreaterThanValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\GroupSequence' => __DIR__ . '/..' . '/symfony/validator/Constraints/GroupSequence.php', + 'Symfony\\Component\\Validator\\Constraints\\GroupSequenceProvider' => __DIR__ . '/..' . '/symfony/validator/Constraints/GroupSequenceProvider.php', + 'Symfony\\Component\\Validator\\Constraints\\Iban' => __DIR__ . '/..' . '/symfony/validator/Constraints/Iban.php', + 'Symfony\\Component\\Validator\\Constraints\\IbanValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/IbanValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\IdenticalTo' => __DIR__ . '/..' . '/symfony/validator/Constraints/IdenticalTo.php', + 'Symfony\\Component\\Validator\\Constraints\\IdenticalToValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/IdenticalToValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Image' => __DIR__ . '/..' . '/symfony/validator/Constraints/Image.php', + 'Symfony\\Component\\Validator\\Constraints\\ImageValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/ImageValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Ip' => __DIR__ . '/..' . '/symfony/validator/Constraints/Ip.php', + 'Symfony\\Component\\Validator\\Constraints\\IpValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/IpValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\IsFalse' => __DIR__ . '/..' . '/symfony/validator/Constraints/IsFalse.php', + 'Symfony\\Component\\Validator\\Constraints\\IsFalseValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/IsFalseValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\IsNull' => __DIR__ . '/..' . '/symfony/validator/Constraints/IsNull.php', + 'Symfony\\Component\\Validator\\Constraints\\IsNullValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/IsNullValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\IsTrue' => __DIR__ . '/..' . '/symfony/validator/Constraints/IsTrue.php', + 'Symfony\\Component\\Validator\\Constraints\\IsTrueValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/IsTrueValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Isbn' => __DIR__ . '/..' . '/symfony/validator/Constraints/Isbn.php', + 'Symfony\\Component\\Validator\\Constraints\\IsbnValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/IsbnValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Issn' => __DIR__ . '/..' . '/symfony/validator/Constraints/Issn.php', + 'Symfony\\Component\\Validator\\Constraints\\IssnValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/IssnValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Language' => __DIR__ . '/..' . '/symfony/validator/Constraints/Language.php', + 'Symfony\\Component\\Validator\\Constraints\\LanguageValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/LanguageValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Length' => __DIR__ . '/..' . '/symfony/validator/Constraints/Length.php', + 'Symfony\\Component\\Validator\\Constraints\\LengthValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/LengthValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\LessThan' => __DIR__ . '/..' . '/symfony/validator/Constraints/LessThan.php', + 'Symfony\\Component\\Validator\\Constraints\\LessThanOrEqual' => __DIR__ . '/..' . '/symfony/validator/Constraints/LessThanOrEqual.php', + 'Symfony\\Component\\Validator\\Constraints\\LessThanOrEqualValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/LessThanOrEqualValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\LessThanValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/LessThanValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Locale' => __DIR__ . '/..' . '/symfony/validator/Constraints/Locale.php', + 'Symfony\\Component\\Validator\\Constraints\\LocaleValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/LocaleValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Luhn' => __DIR__ . '/..' . '/symfony/validator/Constraints/Luhn.php', + 'Symfony\\Component\\Validator\\Constraints\\LuhnValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/LuhnValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\NotBlank' => __DIR__ . '/..' . '/symfony/validator/Constraints/NotBlank.php', + 'Symfony\\Component\\Validator\\Constraints\\NotBlankValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/NotBlankValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\NotEqualTo' => __DIR__ . '/..' . '/symfony/validator/Constraints/NotEqualTo.php', + 'Symfony\\Component\\Validator\\Constraints\\NotEqualToValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/NotEqualToValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\NotIdenticalTo' => __DIR__ . '/..' . '/symfony/validator/Constraints/NotIdenticalTo.php', + 'Symfony\\Component\\Validator\\Constraints\\NotIdenticalToValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/NotIdenticalToValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\NotNull' => __DIR__ . '/..' . '/symfony/validator/Constraints/NotNull.php', + 'Symfony\\Component\\Validator\\Constraints\\NotNullValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/NotNullValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Null' => __DIR__ . '/..' . '/symfony/validator/Constraints/Null.php', + 'Symfony\\Component\\Validator\\Constraints\\NullValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/NullValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Optional' => __DIR__ . '/..' . '/symfony/validator/Constraints/Optional.php', + 'Symfony\\Component\\Validator\\Constraints\\Range' => __DIR__ . '/..' . '/symfony/validator/Constraints/Range.php', + 'Symfony\\Component\\Validator\\Constraints\\RangeValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/RangeValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Regex' => __DIR__ . '/..' . '/symfony/validator/Constraints/Regex.php', + 'Symfony\\Component\\Validator\\Constraints\\RegexValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/RegexValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Required' => __DIR__ . '/..' . '/symfony/validator/Constraints/Required.php', + 'Symfony\\Component\\Validator\\Constraints\\Time' => __DIR__ . '/..' . '/symfony/validator/Constraints/Time.php', + 'Symfony\\Component\\Validator\\Constraints\\TimeValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/TimeValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Traverse' => __DIR__ . '/..' . '/symfony/validator/Constraints/Traverse.php', + 'Symfony\\Component\\Validator\\Constraints\\True' => __DIR__ . '/..' . '/symfony/validator/Constraints/True.php', + 'Symfony\\Component\\Validator\\Constraints\\TrueValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/TrueValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Type' => __DIR__ . '/..' . '/symfony/validator/Constraints/Type.php', + 'Symfony\\Component\\Validator\\Constraints\\TypeValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/TypeValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Url' => __DIR__ . '/..' . '/symfony/validator/Constraints/Url.php', + 'Symfony\\Component\\Validator\\Constraints\\UrlValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/UrlValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Uuid' => __DIR__ . '/..' . '/symfony/validator/Constraints/Uuid.php', + 'Symfony\\Component\\Validator\\Constraints\\UuidValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/UuidValidator.php', + 'Symfony\\Component\\Validator\\Constraints\\Valid' => __DIR__ . '/..' . '/symfony/validator/Constraints/Valid.php', + 'Symfony\\Component\\Validator\\Context\\ExecutionContext' => __DIR__ . '/..' . '/symfony/validator/Context/ExecutionContext.php', + 'Symfony\\Component\\Validator\\Context\\ExecutionContextFactory' => __DIR__ . '/..' . '/symfony/validator/Context/ExecutionContextFactory.php', + 'Symfony\\Component\\Validator\\Context\\ExecutionContextFactoryInterface' => __DIR__ . '/..' . '/symfony/validator/Context/ExecutionContextFactoryInterface.php', + 'Symfony\\Component\\Validator\\Context\\ExecutionContextInterface' => __DIR__ . '/..' . '/symfony/validator/Context/ExecutionContextInterface.php', + 'Symfony\\Component\\Validator\\Context\\LegacyExecutionContext' => __DIR__ . '/..' . '/symfony/validator/Context/LegacyExecutionContext.php', + 'Symfony\\Component\\Validator\\Context\\LegacyExecutionContextFactory' => __DIR__ . '/..' . '/symfony/validator/Context/LegacyExecutionContextFactory.php', + 'Symfony\\Component\\Validator\\DefaultTranslator' => __DIR__ . '/..' . '/symfony/validator/DefaultTranslator.php', + 'Symfony\\Component\\Validator\\Exception\\BadMethodCallException' => __DIR__ . '/..' . '/symfony/validator/Exception/BadMethodCallException.php', + 'Symfony\\Component\\Validator\\Exception\\ConstraintDefinitionException' => __DIR__ . '/..' . '/symfony/validator/Exception/ConstraintDefinitionException.php', + 'Symfony\\Component\\Validator\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/validator/Exception/ExceptionInterface.php', + 'Symfony\\Component\\Validator\\Exception\\GroupDefinitionException' => __DIR__ . '/..' . '/symfony/validator/Exception/GroupDefinitionException.php', + 'Symfony\\Component\\Validator\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/validator/Exception/InvalidArgumentException.php', + 'Symfony\\Component\\Validator\\Exception\\InvalidOptionsException' => __DIR__ . '/..' . '/symfony/validator/Exception/InvalidOptionsException.php', + 'Symfony\\Component\\Validator\\Exception\\MappingException' => __DIR__ . '/..' . '/symfony/validator/Exception/MappingException.php', + 'Symfony\\Component\\Validator\\Exception\\MissingOptionsException' => __DIR__ . '/..' . '/symfony/validator/Exception/MissingOptionsException.php', + 'Symfony\\Component\\Validator\\Exception\\NoSuchMetadataException' => __DIR__ . '/..' . '/symfony/validator/Exception/NoSuchMetadataException.php', + 'Symfony\\Component\\Validator\\Exception\\OutOfBoundsException' => __DIR__ . '/..' . '/symfony/validator/Exception/OutOfBoundsException.php', + 'Symfony\\Component\\Validator\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/validator/Exception/RuntimeException.php', + 'Symfony\\Component\\Validator\\Exception\\UnexpectedTypeException' => __DIR__ . '/..' . '/symfony/validator/Exception/UnexpectedTypeException.php', + 'Symfony\\Component\\Validator\\Exception\\UnsupportedMetadataException' => __DIR__ . '/..' . '/symfony/validator/Exception/UnsupportedMetadataException.php', + 'Symfony\\Component\\Validator\\Exception\\ValidatorException' => __DIR__ . '/..' . '/symfony/validator/Exception/ValidatorException.php', + 'Symfony\\Component\\Validator\\ExecutionContext' => __DIR__ . '/..' . '/symfony/validator/ExecutionContext.php', + 'Symfony\\Component\\Validator\\ExecutionContextInterface' => __DIR__ . '/..' . '/symfony/validator/ExecutionContextInterface.php', + 'Symfony\\Component\\Validator\\GlobalExecutionContextInterface' => __DIR__ . '/..' . '/symfony/validator/GlobalExecutionContextInterface.php', + 'Symfony\\Component\\Validator\\GroupSequenceProviderInterface' => __DIR__ . '/..' . '/symfony/validator/GroupSequenceProviderInterface.php', + 'Symfony\\Component\\Validator\\Mapping\\BlackholeMetadataFactory' => __DIR__ . '/..' . '/symfony/validator/Mapping/BlackholeMetadataFactory.php', + 'Symfony\\Component\\Validator\\Mapping\\Cache\\ApcCache' => __DIR__ . '/..' . '/symfony/validator/Mapping/Cache/ApcCache.php', + 'Symfony\\Component\\Validator\\Mapping\\Cache\\CacheInterface' => __DIR__ . '/..' . '/symfony/validator/Mapping/Cache/CacheInterface.php', + 'Symfony\\Component\\Validator\\Mapping\\Cache\\DoctrineCache' => __DIR__ . '/..' . '/symfony/validator/Mapping/Cache/DoctrineCache.php', + 'Symfony\\Component\\Validator\\Mapping\\CascadingStrategy' => __DIR__ . '/..' . '/symfony/validator/Mapping/CascadingStrategy.php', + 'Symfony\\Component\\Validator\\Mapping\\ClassMetadata' => __DIR__ . '/..' . '/symfony/validator/Mapping/ClassMetadata.php', + 'Symfony\\Component\\Validator\\Mapping\\ClassMetadataFactory' => __DIR__ . '/..' . '/symfony/validator/Mapping/ClassMetadataFactory.php', + 'Symfony\\Component\\Validator\\Mapping\\ClassMetadataInterface' => __DIR__ . '/..' . '/symfony/validator/Mapping/ClassMetadataInterface.php', + 'Symfony\\Component\\Validator\\Mapping\\ElementMetadata' => __DIR__ . '/..' . '/symfony/validator/Mapping/ElementMetadata.php', + 'Symfony\\Component\\Validator\\Mapping\\Factory\\BlackHoleMetadataFactory' => __DIR__ . '/..' . '/symfony/validator/Mapping/Factory/BlackHoleMetadataFactory.php', + 'Symfony\\Component\\Validator\\Mapping\\Factory\\LazyLoadingMetadataFactory' => __DIR__ . '/..' . '/symfony/validator/Mapping/Factory/LazyLoadingMetadataFactory.php', + 'Symfony\\Component\\Validator\\Mapping\\Factory\\MetadataFactoryInterface' => __DIR__ . '/..' . '/symfony/validator/Mapping/Factory/MetadataFactoryInterface.php', + 'Symfony\\Component\\Validator\\Mapping\\GenericMetadata' => __DIR__ . '/..' . '/symfony/validator/Mapping/GenericMetadata.php', + 'Symfony\\Component\\Validator\\Mapping\\GetterMetadata' => __DIR__ . '/..' . '/symfony/validator/Mapping/GetterMetadata.php', + 'Symfony\\Component\\Validator\\Mapping\\Loader\\AbstractLoader' => __DIR__ . '/..' . '/symfony/validator/Mapping/Loader/AbstractLoader.php', + 'Symfony\\Component\\Validator\\Mapping\\Loader\\AnnotationLoader' => __DIR__ . '/..' . '/symfony/validator/Mapping/Loader/AnnotationLoader.php', + 'Symfony\\Component\\Validator\\Mapping\\Loader\\FileLoader' => __DIR__ . '/..' . '/symfony/validator/Mapping/Loader/FileLoader.php', + 'Symfony\\Component\\Validator\\Mapping\\Loader\\FilesLoader' => __DIR__ . '/..' . '/symfony/validator/Mapping/Loader/FilesLoader.php', + 'Symfony\\Component\\Validator\\Mapping\\Loader\\LoaderChain' => __DIR__ . '/..' . '/symfony/validator/Mapping/Loader/LoaderChain.php', + 'Symfony\\Component\\Validator\\Mapping\\Loader\\LoaderInterface' => __DIR__ . '/..' . '/symfony/validator/Mapping/Loader/LoaderInterface.php', + 'Symfony\\Component\\Validator\\Mapping\\Loader\\StaticMethodLoader' => __DIR__ . '/..' . '/symfony/validator/Mapping/Loader/StaticMethodLoader.php', + 'Symfony\\Component\\Validator\\Mapping\\Loader\\XmlFileLoader' => __DIR__ . '/..' . '/symfony/validator/Mapping/Loader/XmlFileLoader.php', + 'Symfony\\Component\\Validator\\Mapping\\Loader\\XmlFilesLoader' => __DIR__ . '/..' . '/symfony/validator/Mapping/Loader/XmlFilesLoader.php', + 'Symfony\\Component\\Validator\\Mapping\\Loader\\YamlFileLoader' => __DIR__ . '/..' . '/symfony/validator/Mapping/Loader/YamlFileLoader.php', + 'Symfony\\Component\\Validator\\Mapping\\Loader\\YamlFilesLoader' => __DIR__ . '/..' . '/symfony/validator/Mapping/Loader/YamlFilesLoader.php', + 'Symfony\\Component\\Validator\\Mapping\\MemberMetadata' => __DIR__ . '/..' . '/symfony/validator/Mapping/MemberMetadata.php', + 'Symfony\\Component\\Validator\\Mapping\\MetadataInterface' => __DIR__ . '/..' . '/symfony/validator/Mapping/MetadataInterface.php', + 'Symfony\\Component\\Validator\\Mapping\\PropertyMetadata' => __DIR__ . '/..' . '/symfony/validator/Mapping/PropertyMetadata.php', + 'Symfony\\Component\\Validator\\Mapping\\PropertyMetadataInterface' => __DIR__ . '/..' . '/symfony/validator/Mapping/PropertyMetadataInterface.php', + 'Symfony\\Component\\Validator\\Mapping\\TraversalStrategy' => __DIR__ . '/..' . '/symfony/validator/Mapping/TraversalStrategy.php', + 'Symfony\\Component\\Validator\\MetadataFactoryInterface' => __DIR__ . '/..' . '/symfony/validator/MetadataFactoryInterface.php', + 'Symfony\\Component\\Validator\\MetadataInterface' => __DIR__ . '/..' . '/symfony/validator/MetadataInterface.php', + 'Symfony\\Component\\Validator\\ObjectInitializerInterface' => __DIR__ . '/..' . '/symfony/validator/ObjectInitializerInterface.php', + 'Symfony\\Component\\Validator\\PropertyMetadataContainerInterface' => __DIR__ . '/..' . '/symfony/validator/PropertyMetadataContainerInterface.php', + 'Symfony\\Component\\Validator\\PropertyMetadataInterface' => __DIR__ . '/..' . '/symfony/validator/PropertyMetadataInterface.php', + 'Symfony\\Component\\Validator\\Util\\PropertyPath' => __DIR__ . '/..' . '/symfony/validator/Util/PropertyPath.php', + 'Symfony\\Component\\Validator\\Validation' => __DIR__ . '/..' . '/symfony/validator/Validation.php', + 'Symfony\\Component\\Validator\\ValidationVisitor' => __DIR__ . '/..' . '/symfony/validator/ValidationVisitor.php', + 'Symfony\\Component\\Validator\\ValidationVisitorInterface' => __DIR__ . '/..' . '/symfony/validator/ValidationVisitorInterface.php', + 'Symfony\\Component\\Validator\\Validator' => __DIR__ . '/..' . '/symfony/validator/Validator.php', + 'Symfony\\Component\\Validator\\ValidatorBuilder' => __DIR__ . '/..' . '/symfony/validator/ValidatorBuilder.php', + 'Symfony\\Component\\Validator\\ValidatorBuilderInterface' => __DIR__ . '/..' . '/symfony/validator/ValidatorBuilderInterface.php', + 'Symfony\\Component\\Validator\\ValidatorInterface' => __DIR__ . '/..' . '/symfony/validator/ValidatorInterface.php', + 'Symfony\\Component\\Validator\\Validator\\ContextualValidatorInterface' => __DIR__ . '/..' . '/symfony/validator/Validator/ContextualValidatorInterface.php', + 'Symfony\\Component\\Validator\\Validator\\LegacyValidator' => __DIR__ . '/..' . '/symfony/validator/Validator/LegacyValidator.php', + 'Symfony\\Component\\Validator\\Validator\\RecursiveContextualValidator' => __DIR__ . '/..' . '/symfony/validator/Validator/RecursiveContextualValidator.php', + 'Symfony\\Component\\Validator\\Validator\\RecursiveValidator' => __DIR__ . '/..' . '/symfony/validator/Validator/RecursiveValidator.php', + 'Symfony\\Component\\Validator\\Validator\\ValidatorInterface' => __DIR__ . '/..' . '/symfony/validator/Validator/ValidatorInterface.php', + 'Symfony\\Component\\Validator\\Violation\\ConstraintViolationBuilder' => __DIR__ . '/..' . '/symfony/validator/Violation/ConstraintViolationBuilder.php', + 'Symfony\\Component\\Validator\\Violation\\ConstraintViolationBuilderInterface' => __DIR__ . '/..' . '/symfony/validator/Violation/ConstraintViolationBuilderInterface.php', + 'Symfony\\Component\\Validator\\Violation\\LegacyConstraintViolationBuilder' => __DIR__ . '/..' . '/symfony/validator/Violation/LegacyConstraintViolationBuilder.php', + 'Symfony\\Component\\VarDumper\\Caster\\AmqpCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/AmqpCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\ArgsStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ArgsStub.php', + 'Symfony\\Component\\VarDumper\\Caster\\Caster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/Caster.php', + 'Symfony\\Component\\VarDumper\\Caster\\ClassStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ClassStub.php', + 'Symfony\\Component\\VarDumper\\Caster\\ConstStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ConstStub.php', + 'Symfony\\Component\\VarDumper\\Caster\\CutArrayStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/CutArrayStub.php', + 'Symfony\\Component\\VarDumper\\Caster\\CutStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/CutStub.php', + 'Symfony\\Component\\VarDumper\\Caster\\DOMCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/DOMCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\DateCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/DateCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\DoctrineCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/DoctrineCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\EnumStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/EnumStub.php', + '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\\LinkStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/LinkStub.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\\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', + 'Symfony\\Component\\VarDumper\\Caster\\SplCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/SplCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\StubCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/StubCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\SymfonyCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/SymfonyCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\TraceStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/TraceStub.php', + 'Symfony\\Component\\VarDumper\\Caster\\XmlReaderCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/XmlReaderCaster.php', + 'Symfony\\Component\\VarDumper\\Caster\\XmlResourceCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/XmlResourceCaster.php', + 'Symfony\\Component\\VarDumper\\Cloner\\AbstractCloner' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/AbstractCloner.php', + 'Symfony\\Component\\VarDumper\\Cloner\\ClonerInterface' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/ClonerInterface.php', + 'Symfony\\Component\\VarDumper\\Cloner\\Cursor' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/Cursor.php', + 'Symfony\\Component\\VarDumper\\Cloner\\Data' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/Data.php', + 'Symfony\\Component\\VarDumper\\Cloner\\DumperInterface' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/DumperInterface.php', + 'Symfony\\Component\\VarDumper\\Cloner\\Stub' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/Stub.php', + 'Symfony\\Component\\VarDumper\\Cloner\\VarCloner' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/VarCloner.php', + 'Symfony\\Component\\VarDumper\\Dumper\\AbstractDumper' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/AbstractDumper.php', + 'Symfony\\Component\\VarDumper\\Dumper\\CliDumper' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/CliDumper.php', + 'Symfony\\Component\\VarDumper\\Dumper\\DataDumperInterface' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/DataDumperInterface.php', + 'Symfony\\Component\\VarDumper\\Dumper\\HtmlDumper' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/HtmlDumper.php', + 'Symfony\\Component\\VarDumper\\Exception\\ThrowingCasterException' => __DIR__ . '/..' . '/symfony/var-dumper/Exception/ThrowingCasterException.php', + 'Symfony\\Component\\VarDumper\\Test\\VarDumperTestTrait' => __DIR__ . '/..' . '/symfony/var-dumper/Test/VarDumperTestTrait.php', + 'Symfony\\Component\\VarDumper\\VarDumper' => __DIR__ . '/..' . '/symfony/var-dumper/VarDumper.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', + 'Text_Template' => __DIR__ . '/..' . '/phpunit/php-text-template/src/Template.php', + 'TheSeer\\Tokenizer\\Exception' => __DIR__ . '/..' . '/theseer/tokenizer/src/Exception.php', + 'TheSeer\\Tokenizer\\NamespaceUri' => __DIR__ . '/..' . '/theseer/tokenizer/src/NamespaceUri.php', + 'TheSeer\\Tokenizer\\NamespaceUriException' => __DIR__ . '/..' . '/theseer/tokenizer/src/NamespaceUriException.php', + 'TheSeer\\Tokenizer\\Token' => __DIR__ . '/..' . '/theseer/tokenizer/src/Token.php', + 'TheSeer\\Tokenizer\\TokenCollection' => __DIR__ . '/..' . '/theseer/tokenizer/src/TokenCollection.php', + 'TheSeer\\Tokenizer\\TokenCollectionException' => __DIR__ . '/..' . '/theseer/tokenizer/src/TokenCollectionException.php', + 'TheSeer\\Tokenizer\\Tokenizer' => __DIR__ . '/..' . '/theseer/tokenizer/src/Tokenizer.php', + 'TheSeer\\Tokenizer\\XMLSerializer' => __DIR__ . '/..' . '/theseer/tokenizer/src/XMLSerializer.php', + 'Twig\\Cache\\CacheInterface' => __DIR__ . '/..' . '/twig/twig/src/Cache/CacheInterface.php', + 'Twig\\Cache\\FilesystemCache' => __DIR__ . '/..' . '/twig/twig/src/Cache/FilesystemCache.php', + 'Twig\\Cache\\NullCache' => __DIR__ . '/..' . '/twig/twig/src/Cache/NullCache.php', + 'Twig\\Compiler' => __DIR__ . '/..' . '/twig/twig/src/Compiler.php', + 'Twig\\Environment' => __DIR__ . '/..' . '/twig/twig/src/Environment.php', + 'Twig\\Error\\Error' => __DIR__ . '/..' . '/twig/twig/src/Error/Error.php', + 'Twig\\Error\\LoaderError' => __DIR__ . '/..' . '/twig/twig/src/Error/LoaderError.php', + 'Twig\\Error\\RuntimeError' => __DIR__ . '/..' . '/twig/twig/src/Error/RuntimeError.php', + 'Twig\\Error\\SyntaxError' => __DIR__ . '/..' . '/twig/twig/src/Error/SyntaxError.php', + 'Twig\\ExpressionParser' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser.php', + 'Twig\\Extension\\AbstractExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/AbstractExtension.php', + 'Twig\\Extension\\CoreExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/CoreExtension.php', + 'Twig\\Extension\\DebugExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/DebugExtension.php', + 'Twig\\Extension\\EscaperExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/EscaperExtension.php', + 'Twig\\Extension\\ExtensionInterface' => __DIR__ . '/..' . '/twig/twig/src/Extension/ExtensionInterface.php', + 'Twig\\Extension\\GlobalsInterface' => __DIR__ . '/..' . '/twig/twig/src/Extension/GlobalsInterface.php', + 'Twig\\Extension\\InitRuntimeInterface' => __DIR__ . '/..' . '/twig/twig/src/Extension/InitRuntimeInterface.php', + 'Twig\\Extension\\OptimizerExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/OptimizerExtension.php', + 'Twig\\Extension\\ProfilerExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/ProfilerExtension.php', + 'Twig\\Extension\\RuntimeExtensionInterface' => __DIR__ . '/..' . '/twig/twig/src/Extension/RuntimeExtensionInterface.php', + 'Twig\\Extension\\SandboxExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/SandboxExtension.php', + 'Twig\\Extension\\StagingExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/StagingExtension.php', + 'Twig\\Extension\\StringLoaderExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/StringLoaderExtension.php', + 'Twig\\FileExtensionEscapingStrategy' => __DIR__ . '/..' . '/twig/twig/src/FileExtensionEscapingStrategy.php', + 'Twig\\Lexer' => __DIR__ . '/..' . '/twig/twig/src/Lexer.php', + 'Twig\\Loader\\ArrayLoader' => __DIR__ . '/..' . '/twig/twig/src/Loader/ArrayLoader.php', + 'Twig\\Loader\\ChainLoader' => __DIR__ . '/..' . '/twig/twig/src/Loader/ChainLoader.php', + 'Twig\\Loader\\ExistsLoaderInterface' => __DIR__ . '/..' . '/twig/twig/src/Loader/ExistsLoaderInterface.php', + 'Twig\\Loader\\FilesystemLoader' => __DIR__ . '/..' . '/twig/twig/src/Loader/FilesystemLoader.php', + 'Twig\\Loader\\LoaderInterface' => __DIR__ . '/..' . '/twig/twig/src/Loader/LoaderInterface.php', + 'Twig\\Loader\\SourceContextLoaderInterface' => __DIR__ . '/..' . '/twig/twig/src/Loader/SourceContextLoaderInterface.php', + 'Twig\\Markup' => __DIR__ . '/..' . '/twig/twig/src/Markup.php', + 'Twig\\NodeTraverser' => __DIR__ . '/..' . '/twig/twig/src/NodeTraverser.php', + 'Twig\\NodeVisitor\\AbstractNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/AbstractNodeVisitor.php', + 'Twig\\NodeVisitor\\EscaperNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/EscaperNodeVisitor.php', + 'Twig\\NodeVisitor\\NodeVisitorInterface' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/NodeVisitorInterface.php', + 'Twig\\NodeVisitor\\OptimizerNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/OptimizerNodeVisitor.php', + 'Twig\\NodeVisitor\\SafeAnalysisNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.php', + 'Twig\\NodeVisitor\\SandboxNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/SandboxNodeVisitor.php', + 'Twig\\Node\\AutoEscapeNode' => __DIR__ . '/..' . '/twig/twig/src/Node/AutoEscapeNode.php', + 'Twig\\Node\\BlockNode' => __DIR__ . '/..' . '/twig/twig/src/Node/BlockNode.php', + 'Twig\\Node\\BlockReferenceNode' => __DIR__ . '/..' . '/twig/twig/src/Node/BlockReferenceNode.php', + 'Twig\\Node\\BodyNode' => __DIR__ . '/..' . '/twig/twig/src/Node/BodyNode.php', + 'Twig\\Node\\CheckSecurityNode' => __DIR__ . '/..' . '/twig/twig/src/Node/CheckSecurityNode.php', + 'Twig\\Node\\CheckToStringNode' => __DIR__ . '/..' . '/twig/twig/src/Node/CheckToStringNode.php', + 'Twig\\Node\\DeprecatedNode' => __DIR__ . '/..' . '/twig/twig/src/Node/DeprecatedNode.php', + 'Twig\\Node\\DoNode' => __DIR__ . '/..' . '/twig/twig/src/Node/DoNode.php', + 'Twig\\Node\\EmbedNode' => __DIR__ . '/..' . '/twig/twig/src/Node/EmbedNode.php', + 'Twig\\Node\\Expression\\AbstractExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/AbstractExpression.php', + 'Twig\\Node\\Expression\\ArrayExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ArrayExpression.php', + 'Twig\\Node\\Expression\\ArrowFunctionExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ArrowFunctionExpression.php', + 'Twig\\Node\\Expression\\AssignNameExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/AssignNameExpression.php', + 'Twig\\Node\\Expression\\Binary\\AbstractBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/AbstractBinary.php', + 'Twig\\Node\\Expression\\Binary\\AddBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/AddBinary.php', + 'Twig\\Node\\Expression\\Binary\\AndBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/AndBinary.php', + 'Twig\\Node\\Expression\\Binary\\BitwiseAndBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/BitwiseAndBinary.php', + 'Twig\\Node\\Expression\\Binary\\BitwiseOrBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/BitwiseOrBinary.php', + 'Twig\\Node\\Expression\\Binary\\BitwiseXorBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/BitwiseXorBinary.php', + 'Twig\\Node\\Expression\\Binary\\ConcatBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/ConcatBinary.php', + 'Twig\\Node\\Expression\\Binary\\DivBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/DivBinary.php', + 'Twig\\Node\\Expression\\Binary\\EndsWithBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/EndsWithBinary.php', + 'Twig\\Node\\Expression\\Binary\\EqualBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/EqualBinary.php', + 'Twig\\Node\\Expression\\Binary\\FloorDivBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/FloorDivBinary.php', + 'Twig\\Node\\Expression\\Binary\\GreaterBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/GreaterBinary.php', + 'Twig\\Node\\Expression\\Binary\\GreaterEqualBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/GreaterEqualBinary.php', + 'Twig\\Node\\Expression\\Binary\\InBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/InBinary.php', + 'Twig\\Node\\Expression\\Binary\\LessBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/LessBinary.php', + 'Twig\\Node\\Expression\\Binary\\LessEqualBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/LessEqualBinary.php', + 'Twig\\Node\\Expression\\Binary\\MatchesBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/MatchesBinary.php', + 'Twig\\Node\\Expression\\Binary\\ModBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/ModBinary.php', + 'Twig\\Node\\Expression\\Binary\\MulBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/MulBinary.php', + 'Twig\\Node\\Expression\\Binary\\NotEqualBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/NotEqualBinary.php', + 'Twig\\Node\\Expression\\Binary\\NotInBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/NotInBinary.php', + 'Twig\\Node\\Expression\\Binary\\OrBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/OrBinary.php', + 'Twig\\Node\\Expression\\Binary\\PowerBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/PowerBinary.php', + 'Twig\\Node\\Expression\\Binary\\RangeBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/RangeBinary.php', + 'Twig\\Node\\Expression\\Binary\\StartsWithBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/StartsWithBinary.php', + 'Twig\\Node\\Expression\\Binary\\SubBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/SubBinary.php', + 'Twig\\Node\\Expression\\BlockReferenceExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/BlockReferenceExpression.php', + 'Twig\\Node\\Expression\\CallExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/CallExpression.php', + 'Twig\\Node\\Expression\\ConditionalExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ConditionalExpression.php', + 'Twig\\Node\\Expression\\ConstantExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ConstantExpression.php', + 'Twig\\Node\\Expression\\FilterExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/FilterExpression.php', + 'Twig\\Node\\Expression\\Filter\\DefaultFilter' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Filter/DefaultFilter.php', + 'Twig\\Node\\Expression\\FunctionExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/FunctionExpression.php', + 'Twig\\Node\\Expression\\GetAttrExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/GetAttrExpression.php', + 'Twig\\Node\\Expression\\InlinePrint' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/InlinePrint.php', + 'Twig\\Node\\Expression\\MethodCallExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/MethodCallExpression.php', + 'Twig\\Node\\Expression\\NameExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/NameExpression.php', + 'Twig\\Node\\Expression\\NullCoalesceExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/NullCoalesceExpression.php', + 'Twig\\Node\\Expression\\ParentExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ParentExpression.php', + 'Twig\\Node\\Expression\\TempNameExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/TempNameExpression.php', + 'Twig\\Node\\Expression\\TestExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/TestExpression.php', + 'Twig\\Node\\Expression\\Test\\ConstantTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/ConstantTest.php', + 'Twig\\Node\\Expression\\Test\\DefinedTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/DefinedTest.php', + 'Twig\\Node\\Expression\\Test\\DivisiblebyTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/DivisiblebyTest.php', + 'Twig\\Node\\Expression\\Test\\EvenTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/EvenTest.php', + 'Twig\\Node\\Expression\\Test\\NullTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/NullTest.php', + 'Twig\\Node\\Expression\\Test\\OddTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/OddTest.php', + 'Twig\\Node\\Expression\\Test\\SameasTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/SameasTest.php', + 'Twig\\Node\\Expression\\Unary\\AbstractUnary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Unary/AbstractUnary.php', + 'Twig\\Node\\Expression\\Unary\\NegUnary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Unary/NegUnary.php', + 'Twig\\Node\\Expression\\Unary\\NotUnary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Unary/NotUnary.php', + 'Twig\\Node\\Expression\\Unary\\PosUnary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Unary/PosUnary.php', + 'Twig\\Node\\FlushNode' => __DIR__ . '/..' . '/twig/twig/src/Node/FlushNode.php', + 'Twig\\Node\\ForLoopNode' => __DIR__ . '/..' . '/twig/twig/src/Node/ForLoopNode.php', + 'Twig\\Node\\ForNode' => __DIR__ . '/..' . '/twig/twig/src/Node/ForNode.php', + 'Twig\\Node\\IfNode' => __DIR__ . '/..' . '/twig/twig/src/Node/IfNode.php', + 'Twig\\Node\\ImportNode' => __DIR__ . '/..' . '/twig/twig/src/Node/ImportNode.php', + 'Twig\\Node\\IncludeNode' => __DIR__ . '/..' . '/twig/twig/src/Node/IncludeNode.php', + 'Twig\\Node\\MacroNode' => __DIR__ . '/..' . '/twig/twig/src/Node/MacroNode.php', + 'Twig\\Node\\ModuleNode' => __DIR__ . '/..' . '/twig/twig/src/Node/ModuleNode.php', + 'Twig\\Node\\Node' => __DIR__ . '/..' . '/twig/twig/src/Node/Node.php', + 'Twig\\Node\\NodeCaptureInterface' => __DIR__ . '/..' . '/twig/twig/src/Node/NodeCaptureInterface.php', + 'Twig\\Node\\NodeOutputInterface' => __DIR__ . '/..' . '/twig/twig/src/Node/NodeOutputInterface.php', + 'Twig\\Node\\PrintNode' => __DIR__ . '/..' . '/twig/twig/src/Node/PrintNode.php', + 'Twig\\Node\\SandboxNode' => __DIR__ . '/..' . '/twig/twig/src/Node/SandboxNode.php', + 'Twig\\Node\\SandboxedPrintNode' => __DIR__ . '/..' . '/twig/twig/src/Node/SandboxedPrintNode.php', + 'Twig\\Node\\SetNode' => __DIR__ . '/..' . '/twig/twig/src/Node/SetNode.php', + 'Twig\\Node\\SetTempNode' => __DIR__ . '/..' . '/twig/twig/src/Node/SetTempNode.php', + 'Twig\\Node\\SpacelessNode' => __DIR__ . '/..' . '/twig/twig/src/Node/SpacelessNode.php', + 'Twig\\Node\\TextNode' => __DIR__ . '/..' . '/twig/twig/src/Node/TextNode.php', + 'Twig\\Node\\WithNode' => __DIR__ . '/..' . '/twig/twig/src/Node/WithNode.php', + 'Twig\\Parser' => __DIR__ . '/..' . '/twig/twig/src/Parser.php', + 'Twig\\Profiler\\Dumper\\BaseDumper' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Dumper/BaseDumper.php', + 'Twig\\Profiler\\Dumper\\BlackfireDumper' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Dumper/BlackfireDumper.php', + 'Twig\\Profiler\\Dumper\\HtmlDumper' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Dumper/HtmlDumper.php', + 'Twig\\Profiler\\Dumper\\TextDumper' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Dumper/TextDumper.php', + 'Twig\\Profiler\\NodeVisitor\\ProfilerNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/Profiler/NodeVisitor/ProfilerNodeVisitor.php', + 'Twig\\Profiler\\Node\\EnterProfileNode' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Node/EnterProfileNode.php', + 'Twig\\Profiler\\Node\\LeaveProfileNode' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Node/LeaveProfileNode.php', + 'Twig\\Profiler\\Profile' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Profile.php', + 'Twig\\RuntimeLoader\\ContainerRuntimeLoader' => __DIR__ . '/..' . '/twig/twig/src/RuntimeLoader/ContainerRuntimeLoader.php', + 'Twig\\RuntimeLoader\\FactoryRuntimeLoader' => __DIR__ . '/..' . '/twig/twig/src/RuntimeLoader/FactoryRuntimeLoader.php', + 'Twig\\RuntimeLoader\\RuntimeLoaderInterface' => __DIR__ . '/..' . '/twig/twig/src/RuntimeLoader/RuntimeLoaderInterface.php', + 'Twig\\Sandbox\\SecurityError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityError.php', + 'Twig\\Sandbox\\SecurityNotAllowedFilterError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityNotAllowedFilterError.php', + 'Twig\\Sandbox\\SecurityNotAllowedFunctionError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityNotAllowedFunctionError.php', + 'Twig\\Sandbox\\SecurityNotAllowedMethodError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityNotAllowedMethodError.php', + 'Twig\\Sandbox\\SecurityNotAllowedPropertyError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityNotAllowedPropertyError.php', + 'Twig\\Sandbox\\SecurityNotAllowedTagError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityNotAllowedTagError.php', + 'Twig\\Sandbox\\SecurityPolicy' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityPolicy.php', + 'Twig\\Sandbox\\SecurityPolicyInterface' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityPolicyInterface.php', + 'Twig\\Source' => __DIR__ . '/..' . '/twig/twig/src/Source.php', + 'Twig\\Template' => __DIR__ . '/..' . '/twig/twig/src/Template.php', + 'Twig\\TemplateWrapper' => __DIR__ . '/..' . '/twig/twig/src/TemplateWrapper.php', + 'Twig\\Test\\IntegrationTestCase' => __DIR__ . '/..' . '/twig/twig/src/Test/IntegrationTestCase.php', + 'Twig\\Test\\NodeTestCase' => __DIR__ . '/..' . '/twig/twig/src/Test/NodeTestCase.php', + 'Twig\\Token' => __DIR__ . '/..' . '/twig/twig/src/Token.php', + 'Twig\\TokenParser\\AbstractTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/AbstractTokenParser.php', + 'Twig\\TokenParser\\ApplyTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/ApplyTokenParser.php', + 'Twig\\TokenParser\\AutoEscapeTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/AutoEscapeTokenParser.php', + 'Twig\\TokenParser\\BlockTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/BlockTokenParser.php', + 'Twig\\TokenParser\\DeprecatedTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/DeprecatedTokenParser.php', + 'Twig\\TokenParser\\DoTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/DoTokenParser.php', + 'Twig\\TokenParser\\EmbedTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/EmbedTokenParser.php', + 'Twig\\TokenParser\\ExtendsTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/ExtendsTokenParser.php', + 'Twig\\TokenParser\\FilterTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/FilterTokenParser.php', + 'Twig\\TokenParser\\FlushTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/FlushTokenParser.php', + 'Twig\\TokenParser\\ForTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/ForTokenParser.php', + 'Twig\\TokenParser\\FromTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/FromTokenParser.php', + 'Twig\\TokenParser\\IfTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/IfTokenParser.php', + 'Twig\\TokenParser\\ImportTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/ImportTokenParser.php', + 'Twig\\TokenParser\\IncludeTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/IncludeTokenParser.php', + 'Twig\\TokenParser\\MacroTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/MacroTokenParser.php', + 'Twig\\TokenParser\\SandboxTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/SandboxTokenParser.php', + 'Twig\\TokenParser\\SetTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/SetTokenParser.php', + 'Twig\\TokenParser\\SpacelessTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/SpacelessTokenParser.php', + 'Twig\\TokenParser\\TokenParserInterface' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/TokenParserInterface.php', + 'Twig\\TokenParser\\UseTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/UseTokenParser.php', + 'Twig\\TokenParser\\WithTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/WithTokenParser.php', + 'Twig\\TokenStream' => __DIR__ . '/..' . '/twig/twig/src/TokenStream.php', + 'Twig\\TwigFilter' => __DIR__ . '/..' . '/twig/twig/src/TwigFilter.php', + 'Twig\\TwigFunction' => __DIR__ . '/..' . '/twig/twig/src/TwigFunction.php', + 'Twig\\TwigTest' => __DIR__ . '/..' . '/twig/twig/src/TwigTest.php', + 'Twig\\Util\\DeprecationCollector' => __DIR__ . '/..' . '/twig/twig/src/Util/DeprecationCollector.php', + 'Twig\\Util\\TemplateDirIterator' => __DIR__ . '/..' . '/twig/twig/src/Util/TemplateDirIterator.php', + 'Twig_Autoloader' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Autoloader.php', + 'Twig_BaseNodeVisitor' => __DIR__ . '/..' . '/twig/twig/lib/Twig/BaseNodeVisitor.php', + 'Twig_CacheInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/CacheInterface.php', + 'Twig_Cache_Filesystem' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Cache/Filesystem.php', + 'Twig_Cache_Null' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Cache/Null.php', + 'Twig_Compiler' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Compiler.php', + 'Twig_CompilerInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/CompilerInterface.php', + 'Twig_ContainerRuntimeLoader' => __DIR__ . '/..' . '/twig/twig/lib/Twig/ContainerRuntimeLoader.php', + 'Twig_Environment' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Environment.php', + 'Twig_Error' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Error.php', + 'Twig_Error_Loader' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Error/Loader.php', + 'Twig_Error_Runtime' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Error/Runtime.php', + 'Twig_Error_Syntax' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Error/Syntax.php', + 'Twig_ExistsLoaderInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/ExistsLoaderInterface.php', + 'Twig_ExpressionParser' => __DIR__ . '/..' . '/twig/twig/lib/Twig/ExpressionParser.php', + 'Twig_Extension' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension.php', + 'Twig_ExtensionInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/ExtensionInterface.php', + 'Twig_Extension_Core' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/Core.php', + 'Twig_Extension_Debug' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/Debug.php', + 'Twig_Extension_Escaper' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/Escaper.php', + 'Twig_Extension_GlobalsInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/GlobalsInterface.php', + 'Twig_Extension_InitRuntimeInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/InitRuntimeInterface.php', + 'Twig_Extension_Optimizer' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/Optimizer.php', + 'Twig_Extension_Profiler' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/Profiler.php', + 'Twig_Extension_Sandbox' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/Sandbox.php', + 'Twig_Extension_Staging' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/Staging.php', + 'Twig_Extension_StringLoader' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/StringLoader.php', + 'Twig_FactoryRuntimeLoader' => __DIR__ . '/..' . '/twig/twig/lib/Twig/FactoryRuntimeLoader.php', + 'Twig_FileExtensionEscapingStrategy' => __DIR__ . '/..' . '/twig/twig/lib/Twig/FileExtensionEscapingStrategy.php', + 'Twig_Filter' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Filter.php', + 'Twig_FilterCallableInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/FilterCallableInterface.php', + 'Twig_FilterInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/FilterInterface.php', + 'Twig_Filter_Function' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Filter/Function.php', + 'Twig_Filter_Method' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Filter/Method.php', + 'Twig_Filter_Node' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Filter/Node.php', + 'Twig_Function' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Function.php', + 'Twig_FunctionCallableInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/FunctionCallableInterface.php', + 'Twig_FunctionInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/FunctionInterface.php', + 'Twig_Function_Function' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Function/Function.php', + 'Twig_Function_Method' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Function/Method.php', + 'Twig_Function_Node' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Function/Node.php', + 'Twig_Lexer' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Lexer.php', + 'Twig_LexerInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/LexerInterface.php', + 'Twig_LoaderInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/LoaderInterface.php', + 'Twig_Loader_Array' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Loader/Array.php', + 'Twig_Loader_Chain' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Loader/Chain.php', + 'Twig_Loader_Filesystem' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Loader/Filesystem.php', + 'Twig_Loader_String' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Loader/String.php', + 'Twig_Markup' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Markup.php', + 'Twig_Node' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node.php', + 'Twig_NodeCaptureInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/NodeCaptureInterface.php', + 'Twig_NodeInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/NodeInterface.php', + 'Twig_NodeOutputInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/NodeOutputInterface.php', + 'Twig_NodeTraverser' => __DIR__ . '/..' . '/twig/twig/lib/Twig/NodeTraverser.php', + 'Twig_NodeVisitorInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/NodeVisitorInterface.php', + 'Twig_NodeVisitor_Escaper' => __DIR__ . '/..' . '/twig/twig/lib/Twig/NodeVisitor/Escaper.php', + 'Twig_NodeVisitor_Optimizer' => __DIR__ . '/..' . '/twig/twig/lib/Twig/NodeVisitor/Optimizer.php', + 'Twig_NodeVisitor_SafeAnalysis' => __DIR__ . '/..' . '/twig/twig/lib/Twig/NodeVisitor/SafeAnalysis.php', + 'Twig_NodeVisitor_Sandbox' => __DIR__ . '/..' . '/twig/twig/lib/Twig/NodeVisitor/Sandbox.php', + 'Twig_Node_AutoEscape' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/AutoEscape.php', + 'Twig_Node_Block' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Block.php', + 'Twig_Node_BlockReference' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/BlockReference.php', + 'Twig_Node_Body' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Body.php', + 'Twig_Node_CheckSecurity' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/CheckSecurity.php', + 'Twig_Node_Deprecated' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Deprecated.php', + 'Twig_Node_Do' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Do.php', + 'Twig_Node_Embed' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Embed.php', + 'Twig_Node_Expression' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression.php', + 'Twig_Node_Expression_Array' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Array.php', + 'Twig_Node_Expression_AssignName' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/AssignName.php', + 'Twig_Node_Expression_Binary' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary.php', + 'Twig_Node_Expression_Binary_Add' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Add.php', + 'Twig_Node_Expression_Binary_And' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/And.php', + 'Twig_Node_Expression_Binary_BitwiseAnd' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseAnd.php', + 'Twig_Node_Expression_Binary_BitwiseOr' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseOr.php', + 'Twig_Node_Expression_Binary_BitwiseXor' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseXor.php', + 'Twig_Node_Expression_Binary_Concat' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Concat.php', + 'Twig_Node_Expression_Binary_Div' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Div.php', + 'Twig_Node_Expression_Binary_EndsWith' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/EndsWith.php', + 'Twig_Node_Expression_Binary_Equal' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Equal.php', + 'Twig_Node_Expression_Binary_FloorDiv' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/FloorDiv.php', + 'Twig_Node_Expression_Binary_Greater' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Greater.php', + 'Twig_Node_Expression_Binary_GreaterEqual' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/GreaterEqual.php', + 'Twig_Node_Expression_Binary_In' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/In.php', + 'Twig_Node_Expression_Binary_Less' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Less.php', + 'Twig_Node_Expression_Binary_LessEqual' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/LessEqual.php', + 'Twig_Node_Expression_Binary_Matches' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Matches.php', + 'Twig_Node_Expression_Binary_Mod' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Mod.php', + 'Twig_Node_Expression_Binary_Mul' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Mul.php', + 'Twig_Node_Expression_Binary_NotEqual' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/NotEqual.php', + 'Twig_Node_Expression_Binary_NotIn' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/NotIn.php', + 'Twig_Node_Expression_Binary_Or' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Or.php', + 'Twig_Node_Expression_Binary_Power' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Power.php', + 'Twig_Node_Expression_Binary_Range' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Range.php', + 'Twig_Node_Expression_Binary_StartsWith' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/StartsWith.php', + 'Twig_Node_Expression_Binary_Sub' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Sub.php', + 'Twig_Node_Expression_BlockReference' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/BlockReference.php', + 'Twig_Node_Expression_Call' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Call.php', + 'Twig_Node_Expression_Conditional' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Conditional.php', + 'Twig_Node_Expression_Constant' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Constant.php', + 'Twig_Node_Expression_ExtensionReference' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/ExtensionReference.php', + 'Twig_Node_Expression_Filter' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Filter.php', + 'Twig_Node_Expression_Filter_Default' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Filter/Default.php', + 'Twig_Node_Expression_Function' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Function.php', + 'Twig_Node_Expression_GetAttr' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/GetAttr.php', + 'Twig_Node_Expression_MethodCall' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/MethodCall.php', + 'Twig_Node_Expression_Name' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Name.php', + 'Twig_Node_Expression_NullCoalesce' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/NullCoalesce.php', + 'Twig_Node_Expression_Parent' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Parent.php', + 'Twig_Node_Expression_TempName' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/TempName.php', + 'Twig_Node_Expression_Test' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Test.php', + 'Twig_Node_Expression_Test_Constant' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Test/Constant.php', + 'Twig_Node_Expression_Test_Defined' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Test/Defined.php', + 'Twig_Node_Expression_Test_Divisibleby' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Test/Divisibleby.php', + 'Twig_Node_Expression_Test_Even' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Test/Even.php', + 'Twig_Node_Expression_Test_Null' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Test/Null.php', + 'Twig_Node_Expression_Test_Odd' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Test/Odd.php', + 'Twig_Node_Expression_Test_Sameas' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Test/Sameas.php', + 'Twig_Node_Expression_Unary' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Unary.php', + 'Twig_Node_Expression_Unary_Neg' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Unary/Neg.php', + 'Twig_Node_Expression_Unary_Not' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Unary/Not.php', + 'Twig_Node_Expression_Unary_Pos' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Unary/Pos.php', + 'Twig_Node_Flush' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Flush.php', + 'Twig_Node_For' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/For.php', + 'Twig_Node_ForLoop' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/ForLoop.php', + 'Twig_Node_If' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/If.php', + 'Twig_Node_Import' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Import.php', + 'Twig_Node_Include' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Include.php', + 'Twig_Node_Macro' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Macro.php', + 'Twig_Node_Module' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Module.php', + 'Twig_Node_Print' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Print.php', + 'Twig_Node_Sandbox' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Sandbox.php', + 'Twig_Node_SandboxedPrint' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/SandboxedPrint.php', + 'Twig_Node_Set' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Set.php', + 'Twig_Node_SetTemp' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/SetTemp.php', + 'Twig_Node_Spaceless' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Spaceless.php', + 'Twig_Node_Text' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Text.php', + 'Twig_Node_With' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/With.php', + 'Twig_Parser' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Parser.php', + 'Twig_ParserInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/ParserInterface.php', + 'Twig_Profiler_Dumper_Base' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Profiler/Dumper/Base.php', + 'Twig_Profiler_Dumper_Blackfire' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Profiler/Dumper/Blackfire.php', + 'Twig_Profiler_Dumper_Html' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Profiler/Dumper/Html.php', + 'Twig_Profiler_Dumper_Text' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Profiler/Dumper/Text.php', + 'Twig_Profiler_NodeVisitor_Profiler' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Profiler/NodeVisitor/Profiler.php', + 'Twig_Profiler_Node_EnterProfile' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Profiler/Node/EnterProfile.php', + 'Twig_Profiler_Node_LeaveProfile' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Profiler/Node/LeaveProfile.php', + 'Twig_Profiler_Profile' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Profiler/Profile.php', + 'Twig_RuntimeLoaderInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/RuntimeLoaderInterface.php', + 'Twig_Sandbox_SecurityError' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Sandbox/SecurityError.php', + 'Twig_Sandbox_SecurityNotAllowedFilterError' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFilterError.php', + 'Twig_Sandbox_SecurityNotAllowedFunctionError' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFunctionError.php', + 'Twig_Sandbox_SecurityNotAllowedMethodError' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedMethodError.php', + 'Twig_Sandbox_SecurityNotAllowedPropertyError' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedPropertyError.php', + 'Twig_Sandbox_SecurityNotAllowedTagError' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedTagError.php', + 'Twig_Sandbox_SecurityPolicy' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Sandbox/SecurityPolicy.php', + 'Twig_Sandbox_SecurityPolicyInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Sandbox/SecurityPolicyInterface.php', + 'Twig_SimpleFilter' => __DIR__ . '/..' . '/twig/twig/lib/Twig/SimpleFilter.php', + 'Twig_SimpleFunction' => __DIR__ . '/..' . '/twig/twig/lib/Twig/SimpleFunction.php', + 'Twig_SimpleTest' => __DIR__ . '/..' . '/twig/twig/lib/Twig/SimpleTest.php', + 'Twig_Source' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Source.php', + 'Twig_SourceContextLoaderInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/SourceContextLoaderInterface.php', + 'Twig_Template' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Template.php', + 'Twig_TemplateInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TemplateInterface.php', + 'Twig_TemplateWrapper' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TemplateWrapper.php', + 'Twig_Test' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Test.php', + 'Twig_TestCallableInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TestCallableInterface.php', + 'Twig_TestInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TestInterface.php', + 'Twig_Test_Function' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Test/Function.php', + 'Twig_Test_IntegrationTestCase' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Test/IntegrationTestCase.php', + 'Twig_Test_Method' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Test/Method.php', + 'Twig_Test_Node' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Test/Node.php', + 'Twig_Test_NodeTestCase' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Test/NodeTestCase.php', + 'Twig_Token' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Token.php', + 'Twig_TokenParser' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser.php', + 'Twig_TokenParserBroker' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParserBroker.php', + 'Twig_TokenParserBrokerInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParserBrokerInterface.php', + 'Twig_TokenParserInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParserInterface.php', + 'Twig_TokenParser_AutoEscape' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/AutoEscape.php', + 'Twig_TokenParser_Block' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Block.php', + 'Twig_TokenParser_Deprecated' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Deprecated.php', + 'Twig_TokenParser_Do' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Do.php', + 'Twig_TokenParser_Embed' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Embed.php', + 'Twig_TokenParser_Extends' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Extends.php', + 'Twig_TokenParser_Filter' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Filter.php', + 'Twig_TokenParser_Flush' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Flush.php', + 'Twig_TokenParser_For' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/For.php', + 'Twig_TokenParser_From' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/From.php', + 'Twig_TokenParser_If' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/If.php', + 'Twig_TokenParser_Import' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Import.php', + 'Twig_TokenParser_Include' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Include.php', + 'Twig_TokenParser_Macro' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Macro.php', + 'Twig_TokenParser_Sandbox' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Sandbox.php', + 'Twig_TokenParser_Set' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Set.php', + 'Twig_TokenParser_Spaceless' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Spaceless.php', + 'Twig_TokenParser_Use' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Use.php', + 'Twig_TokenParser_With' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/With.php', + 'Twig_TokenStream' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenStream.php', + 'Twig_Util_DeprecationCollector' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Util/DeprecationCollector.php', + 'Twig_Util_TemplateDirIterator' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Util/TemplateDirIterator.php', + 'Webmozart\\Assert\\Assert' => __DIR__ . '/..' . '/webmozart/assert/src/Assert.php', + 'Webmozart\\Assert\\Mixin' => __DIR__ . '/..' . '/webmozart/assert/src/Mixin.php', 'XMPPHP\\BOSH' => __DIR__ . '/..' . '/diogocomposer/xmpphp/XMPPHP/BOSH.php', 'XMPPHP\\Exception' => __DIR__ . '/..' . '/diogocomposer/xmpphp/XMPPHP/Exception.php', 'XMPPHP\\Log' => __DIR__ . '/..' . '/diogocomposer/xmpphp/XMPPHP/Log.php', @@ -1157,7 +3732,1442 @@ class ComposerStaticInit444c3f31864f68a3f466e2c19837e185 'XMPPHP\\XMLObj' => __DIR__ . '/..' . '/diogocomposer/xmpphp/XMPPHP/XMLObj.php', 'XMPPHP\\XMLStream' => __DIR__ . '/..' . '/diogocomposer/xmpphp/XMPPHP/XMLStream.php', 'XMPPHP\\XMPP' => __DIR__ . '/..' . '/diogocomposer/xmpphp/XMPPHP/XMPP.php', + 'XdgBaseDir\\Xdg' => __DIR__ . '/..' . '/dnoegel/php-xdg-base-dir/src/Xdg.php', + 'Zend\\Cache\\ConfigProvider' => __DIR__ . '/..' . '/zendframework/zend-cache/src/ConfigProvider.php', + 'Zend\\Cache\\Exception\\BadMethodCallException' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Exception/BadMethodCallException.php', + 'Zend\\Cache\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Exception/ExceptionInterface.php', + 'Zend\\Cache\\Exception\\ExtensionNotLoadedException' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Exception/ExtensionNotLoadedException.php', + 'Zend\\Cache\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Exception/InvalidArgumentException.php', + 'Zend\\Cache\\Exception\\LogicException' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Exception/LogicException.php', + 'Zend\\Cache\\Exception\\MissingDependencyException' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Exception/MissingDependencyException.php', + 'Zend\\Cache\\Exception\\MissingKeyException' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Exception/MissingKeyException.php', + 'Zend\\Cache\\Exception\\OutOfSpaceException' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Exception/OutOfSpaceException.php', + 'Zend\\Cache\\Exception\\RuntimeException' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Exception/RuntimeException.php', + 'Zend\\Cache\\Exception\\UnexpectedValueException' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Exception/UnexpectedValueException.php', + 'Zend\\Cache\\Exception\\UnsupportedMethodCallException' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Exception/UnsupportedMethodCallException.php', + 'Zend\\Cache\\Module' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Module.php', + 'Zend\\Cache\\PatternFactory' => __DIR__ . '/..' . '/zendframework/zend-cache/src/PatternFactory.php', + 'Zend\\Cache\\PatternPluginManager\\PatternPluginManagerTrait' => __DIR__ . '/..' . '/zendframework/zend-cache/src/PatternPluginManager/PatternPluginManagerTrait.php', + 'Zend\\Cache\\PatternPluginManager\\PatternPluginManagerV2Polyfill' => __DIR__ . '/..' . '/zendframework/zend-cache/src/PatternPluginManager/PatternPluginManagerV2Polyfill.php', + 'Zend\\Cache\\PatternPluginManager\\PatternPluginManagerV3Polyfill' => __DIR__ . '/..' . '/zendframework/zend-cache/src/PatternPluginManager/PatternPluginManagerV3Polyfill.php', + 'Zend\\Cache\\Pattern\\AbstractPattern' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Pattern/AbstractPattern.php', + 'Zend\\Cache\\Pattern\\CallbackCache' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Pattern/CallbackCache.php', + 'Zend\\Cache\\Pattern\\CaptureCache' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Pattern/CaptureCache.php', + 'Zend\\Cache\\Pattern\\ClassCache' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Pattern/ClassCache.php', + 'Zend\\Cache\\Pattern\\ObjectCache' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Pattern/ObjectCache.php', + 'Zend\\Cache\\Pattern\\OutputCache' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Pattern/OutputCache.php', + 'Zend\\Cache\\Pattern\\PatternInterface' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Pattern/PatternInterface.php', + 'Zend\\Cache\\Pattern\\PatternOptions' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Pattern/PatternOptions.php', + 'Zend\\Cache\\Psr\\CacheItemPool\\CacheException' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Psr/CacheItemPool/CacheException.php', + 'Zend\\Cache\\Psr\\CacheItemPool\\CacheItem' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Psr/CacheItemPool/CacheItem.php', + 'Zend\\Cache\\Psr\\CacheItemPool\\CacheItemPoolDecorator' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Psr/CacheItemPool/CacheItemPoolDecorator.php', + 'Zend\\Cache\\Psr\\CacheItemPool\\InvalidArgumentException' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Psr/CacheItemPool/InvalidArgumentException.php', + 'Zend\\Cache\\Psr\\SerializationTrait' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Psr/SerializationTrait.php', + 'Zend\\Cache\\Psr\\SimpleCache\\SimpleCacheDecorator' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Psr/SimpleCache/SimpleCacheDecorator.php', + 'Zend\\Cache\\Psr\\SimpleCache\\SimpleCacheException' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Psr/SimpleCache/SimpleCacheException.php', + 'Zend\\Cache\\Psr\\SimpleCache\\SimpleCacheInvalidArgumentException' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Psr/SimpleCache/SimpleCacheInvalidArgumentException.php', + 'Zend\\Cache\\Service\\PatternPluginManagerFactory' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Service/PatternPluginManagerFactory.php', + 'Zend\\Cache\\Service\\PluginManagerLookupTrait' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Service/PluginManagerLookupTrait.php', + 'Zend\\Cache\\Service\\StorageAdapterPluginManagerFactory' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Service/StorageAdapterPluginManagerFactory.php', + 'Zend\\Cache\\Service\\StorageCacheAbstractServiceFactory' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Service/StorageCacheAbstractServiceFactory.php', + 'Zend\\Cache\\Service\\StorageCacheFactory' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Service/StorageCacheFactory.php', + 'Zend\\Cache\\Service\\StoragePluginManagerFactory' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Service/StoragePluginManagerFactory.php', + 'Zend\\Cache\\StorageFactory' => __DIR__ . '/..' . '/zendframework/zend-cache/src/StorageFactory.php', + 'Zend\\Cache\\Storage\\AdapterPluginManager' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/AdapterPluginManager.php', + 'Zend\\Cache\\Storage\\Adapter\\AbstractAdapter' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/AbstractAdapter.php', + 'Zend\\Cache\\Storage\\Adapter\\AbstractZendServer' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/AbstractZendServer.php', + 'Zend\\Cache\\Storage\\Adapter\\AdapterOptions' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/AdapterOptions.php', + 'Zend\\Cache\\Storage\\Adapter\\Apc' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/Apc.php', + 'Zend\\Cache\\Storage\\Adapter\\ApcIterator' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/ApcIterator.php', + 'Zend\\Cache\\Storage\\Adapter\\ApcOptions' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/ApcOptions.php', + 'Zend\\Cache\\Storage\\Adapter\\Apcu' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/Apcu.php', + 'Zend\\Cache\\Storage\\Adapter\\ApcuIterator' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/ApcuIterator.php', + 'Zend\\Cache\\Storage\\Adapter\\ApcuOptions' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/ApcuOptions.php', + 'Zend\\Cache\\Storage\\Adapter\\BlackHole' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/BlackHole.php', + 'Zend\\Cache\\Storage\\Adapter\\Dba' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/Dba.php', + 'Zend\\Cache\\Storage\\Adapter\\DbaIterator' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/DbaIterator.php', + 'Zend\\Cache\\Storage\\Adapter\\DbaOptions' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/DbaOptions.php', + 'Zend\\Cache\\Storage\\Adapter\\ExtMongoDb' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/ExtMongoDb.php', + 'Zend\\Cache\\Storage\\Adapter\\ExtMongoDbOptions' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/ExtMongoDbOptions.php', + 'Zend\\Cache\\Storage\\Adapter\\ExtMongoDbResourceManager' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/ExtMongoDbResourceManager.php', + 'Zend\\Cache\\Storage\\Adapter\\Filesystem' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/Filesystem.php', + 'Zend\\Cache\\Storage\\Adapter\\FilesystemIterator' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/FilesystemIterator.php', + 'Zend\\Cache\\Storage\\Adapter\\FilesystemOptions' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/FilesystemOptions.php', + 'Zend\\Cache\\Storage\\Adapter\\KeyListIterator' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/KeyListIterator.php', + 'Zend\\Cache\\Storage\\Adapter\\Memcache' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/Memcache.php', + 'Zend\\Cache\\Storage\\Adapter\\MemcacheOptions' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/MemcacheOptions.php', + 'Zend\\Cache\\Storage\\Adapter\\MemcacheResourceManager' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/MemcacheResourceManager.php', + 'Zend\\Cache\\Storage\\Adapter\\Memcached' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/Memcached.php', + 'Zend\\Cache\\Storage\\Adapter\\MemcachedOptions' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/MemcachedOptions.php', + 'Zend\\Cache\\Storage\\Adapter\\MemcachedResourceManager' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/MemcachedResourceManager.php', + 'Zend\\Cache\\Storage\\Adapter\\Memory' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/Memory.php', + 'Zend\\Cache\\Storage\\Adapter\\MemoryOptions' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/MemoryOptions.php', + 'Zend\\Cache\\Storage\\Adapter\\MongoDb' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/MongoDb.php', + 'Zend\\Cache\\Storage\\Adapter\\MongoDbOptions' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/MongoDbOptions.php', + 'Zend\\Cache\\Storage\\Adapter\\MongoDbResourceManager' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/MongoDbResourceManager.php', + 'Zend\\Cache\\Storage\\Adapter\\Redis' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/Redis.php', + 'Zend\\Cache\\Storage\\Adapter\\RedisOptions' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/RedisOptions.php', + 'Zend\\Cache\\Storage\\Adapter\\RedisResourceManager' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/RedisResourceManager.php', + 'Zend\\Cache\\Storage\\Adapter\\Session' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/Session.php', + 'Zend\\Cache\\Storage\\Adapter\\SessionOptions' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/SessionOptions.php', + 'Zend\\Cache\\Storage\\Adapter\\WinCache' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/WinCache.php', + 'Zend\\Cache\\Storage\\Adapter\\WinCacheOptions' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/WinCacheOptions.php', + 'Zend\\Cache\\Storage\\Adapter\\XCache' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/XCache.php', + 'Zend\\Cache\\Storage\\Adapter\\XCacheOptions' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/XCacheOptions.php', + 'Zend\\Cache\\Storage\\Adapter\\ZendServerDisk' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/ZendServerDisk.php', + 'Zend\\Cache\\Storage\\Adapter\\ZendServerShm' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Adapter/ZendServerShm.php', + 'Zend\\Cache\\Storage\\AvailableSpaceCapableInterface' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/AvailableSpaceCapableInterface.php', + 'Zend\\Cache\\Storage\\Capabilities' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Capabilities.php', + 'Zend\\Cache\\Storage\\ClearByNamespaceInterface' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/ClearByNamespaceInterface.php', + 'Zend\\Cache\\Storage\\ClearByPrefixInterface' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/ClearByPrefixInterface.php', + 'Zend\\Cache\\Storage\\ClearExpiredInterface' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/ClearExpiredInterface.php', + 'Zend\\Cache\\Storage\\Event' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Event.php', + 'Zend\\Cache\\Storage\\ExceptionEvent' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/ExceptionEvent.php', + 'Zend\\Cache\\Storage\\FlushableInterface' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/FlushableInterface.php', + 'Zend\\Cache\\Storage\\IterableInterface' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/IterableInterface.php', + 'Zend\\Cache\\Storage\\IteratorInterface' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/IteratorInterface.php', + 'Zend\\Cache\\Storage\\OptimizableInterface' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/OptimizableInterface.php', + 'Zend\\Cache\\Storage\\PluginManager' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/PluginManager.php', + 'Zend\\Cache\\Storage\\Plugin\\AbstractPlugin' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Plugin/AbstractPlugin.php', + 'Zend\\Cache\\Storage\\Plugin\\ClearExpiredByFactor' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Plugin/ClearExpiredByFactor.php', + 'Zend\\Cache\\Storage\\Plugin\\ExceptionHandler' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Plugin/ExceptionHandler.php', + 'Zend\\Cache\\Storage\\Plugin\\IgnoreUserAbort' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Plugin/IgnoreUserAbort.php', + 'Zend\\Cache\\Storage\\Plugin\\OptimizeByFactor' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Plugin/OptimizeByFactor.php', + 'Zend\\Cache\\Storage\\Plugin\\PluginInterface' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Plugin/PluginInterface.php', + 'Zend\\Cache\\Storage\\Plugin\\PluginOptions' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Plugin/PluginOptions.php', + 'Zend\\Cache\\Storage\\Plugin\\Serializer' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/Plugin/Serializer.php', + 'Zend\\Cache\\Storage\\PostEvent' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/PostEvent.php', + 'Zend\\Cache\\Storage\\StorageInterface' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/StorageInterface.php', + 'Zend\\Cache\\Storage\\TaggableInterface' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/TaggableInterface.php', + 'Zend\\Cache\\Storage\\TotalSpaceCapableInterface' => __DIR__ . '/..' . '/zendframework/zend-cache/src/Storage/TotalSpaceCapableInterface.php', + 'Zend\\Config\\AbstractConfigFactory' => __DIR__ . '/..' . '/zendframework/zend-config/src/AbstractConfigFactory.php', + 'Zend\\Config\\Config' => __DIR__ . '/..' . '/zendframework/zend-config/src/Config.php', + 'Zend\\Config\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/zendframework/zend-config/src/Exception/ExceptionInterface.php', + 'Zend\\Config\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/zendframework/zend-config/src/Exception/InvalidArgumentException.php', + 'Zend\\Config\\Exception\\RuntimeException' => __DIR__ . '/..' . '/zendframework/zend-config/src/Exception/RuntimeException.php', + 'Zend\\Config\\Factory' => __DIR__ . '/..' . '/zendframework/zend-config/src/Factory.php', + 'Zend\\Config\\Processor\\Constant' => __DIR__ . '/..' . '/zendframework/zend-config/src/Processor/Constant.php', + 'Zend\\Config\\Processor\\Filter' => __DIR__ . '/..' . '/zendframework/zend-config/src/Processor/Filter.php', + 'Zend\\Config\\Processor\\ProcessorInterface' => __DIR__ . '/..' . '/zendframework/zend-config/src/Processor/ProcessorInterface.php', + 'Zend\\Config\\Processor\\Queue' => __DIR__ . '/..' . '/zendframework/zend-config/src/Processor/Queue.php', + 'Zend\\Config\\Processor\\Token' => __DIR__ . '/..' . '/zendframework/zend-config/src/Processor/Token.php', + 'Zend\\Config\\Processor\\Translator' => __DIR__ . '/..' . '/zendframework/zend-config/src/Processor/Translator.php', + 'Zend\\Config\\ReaderPluginManager' => __DIR__ . '/..' . '/zendframework/zend-config/src/ReaderPluginManager.php', + 'Zend\\Config\\Reader\\Ini' => __DIR__ . '/..' . '/zendframework/zend-config/src/Reader/Ini.php', + 'Zend\\Config\\Reader\\JavaProperties' => __DIR__ . '/..' . '/zendframework/zend-config/src/Reader/JavaProperties.php', + 'Zend\\Config\\Reader\\Json' => __DIR__ . '/..' . '/zendframework/zend-config/src/Reader/Json.php', + 'Zend\\Config\\Reader\\ReaderInterface' => __DIR__ . '/..' . '/zendframework/zend-config/src/Reader/ReaderInterface.php', + 'Zend\\Config\\Reader\\Xml' => __DIR__ . '/..' . '/zendframework/zend-config/src/Reader/Xml.php', + 'Zend\\Config\\Reader\\Yaml' => __DIR__ . '/..' . '/zendframework/zend-config/src/Reader/Yaml.php', + 'Zend\\Config\\WriterPluginManager' => __DIR__ . '/..' . '/zendframework/zend-config/src/WriterPluginManager.php', + 'Zend\\Config\\Writer\\AbstractWriter' => __DIR__ . '/..' . '/zendframework/zend-config/src/Writer/AbstractWriter.php', + 'Zend\\Config\\Writer\\Ini' => __DIR__ . '/..' . '/zendframework/zend-config/src/Writer/Ini.php', + 'Zend\\Config\\Writer\\Json' => __DIR__ . '/..' . '/zendframework/zend-config/src/Writer/Json.php', + 'Zend\\Config\\Writer\\PhpArray' => __DIR__ . '/..' . '/zendframework/zend-config/src/Writer/PhpArray.php', + 'Zend\\Config\\Writer\\WriterInterface' => __DIR__ . '/..' . '/zendframework/zend-config/src/Writer/WriterInterface.php', + 'Zend\\Config\\Writer\\Xml' => __DIR__ . '/..' . '/zendframework/zend-config/src/Writer/Xml.php', + 'Zend\\Config\\Writer\\Yaml' => __DIR__ . '/..' . '/zendframework/zend-config/src/Writer/Yaml.php', + 'Zend\\EventManager\\AbstractListenerAggregate' => __DIR__ . '/..' . '/zendframework/zend-eventmanager/src/AbstractListenerAggregate.php', + 'Zend\\EventManager\\Event' => __DIR__ . '/..' . '/zendframework/zend-eventmanager/src/Event.php', + 'Zend\\EventManager\\EventInterface' => __DIR__ . '/..' . '/zendframework/zend-eventmanager/src/EventInterface.php', + 'Zend\\EventManager\\EventManager' => __DIR__ . '/..' . '/zendframework/zend-eventmanager/src/EventManager.php', + 'Zend\\EventManager\\EventManagerAwareInterface' => __DIR__ . '/..' . '/zendframework/zend-eventmanager/src/EventManagerAwareInterface.php', + 'Zend\\EventManager\\EventManagerAwareTrait' => __DIR__ . '/..' . '/zendframework/zend-eventmanager/src/EventManagerAwareTrait.php', + 'Zend\\EventManager\\EventManagerInterface' => __DIR__ . '/..' . '/zendframework/zend-eventmanager/src/EventManagerInterface.php', + 'Zend\\EventManager\\EventsCapableInterface' => __DIR__ . '/..' . '/zendframework/zend-eventmanager/src/EventsCapableInterface.php', + 'Zend\\EventManager\\Exception\\DomainException' => __DIR__ . '/..' . '/zendframework/zend-eventmanager/src/Exception/DomainException.php', + 'Zend\\EventManager\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/zendframework/zend-eventmanager/src/Exception/ExceptionInterface.php', + 'Zend\\EventManager\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/zendframework/zend-eventmanager/src/Exception/InvalidArgumentException.php', + 'Zend\\EventManager\\Exception\\InvalidCallbackException' => __DIR__ . '/..' . '/zendframework/zend-eventmanager/src/Exception/InvalidCallbackException.php', + 'Zend\\EventManager\\Exception\\RuntimeException' => __DIR__ . '/..' . '/zendframework/zend-eventmanager/src/Exception/RuntimeException.php', + 'Zend\\EventManager\\FilterChain' => __DIR__ . '/..' . '/zendframework/zend-eventmanager/src/FilterChain.php', + 'Zend\\EventManager\\Filter\\FilterInterface' => __DIR__ . '/..' . '/zendframework/zend-eventmanager/src/Filter/FilterInterface.php', + 'Zend\\EventManager\\Filter\\FilterIterator' => __DIR__ . '/..' . '/zendframework/zend-eventmanager/src/Filter/FilterIterator.php', + 'Zend\\EventManager\\LazyEventListener' => __DIR__ . '/..' . '/zendframework/zend-eventmanager/src/LazyEventListener.php', + 'Zend\\EventManager\\LazyListener' => __DIR__ . '/..' . '/zendframework/zend-eventmanager/src/LazyListener.php', + 'Zend\\EventManager\\LazyListenerAggregate' => __DIR__ . '/..' . '/zendframework/zend-eventmanager/src/LazyListenerAggregate.php', + 'Zend\\EventManager\\ListenerAggregateInterface' => __DIR__ . '/..' . '/zendframework/zend-eventmanager/src/ListenerAggregateInterface.php', + 'Zend\\EventManager\\ListenerAggregateTrait' => __DIR__ . '/..' . '/zendframework/zend-eventmanager/src/ListenerAggregateTrait.php', + 'Zend\\EventManager\\ResponseCollection' => __DIR__ . '/..' . '/zendframework/zend-eventmanager/src/ResponseCollection.php', + 'Zend\\EventManager\\SharedEventManager' => __DIR__ . '/..' . '/zendframework/zend-eventmanager/src/SharedEventManager.php', + 'Zend\\EventManager\\SharedEventManagerInterface' => __DIR__ . '/..' . '/zendframework/zend-eventmanager/src/SharedEventManagerInterface.php', + 'Zend\\EventManager\\SharedEventsCapableInterface' => __DIR__ . '/..' . '/zendframework/zend-eventmanager/src/SharedEventsCapableInterface.php', + 'Zend\\EventManager\\Test\\EventListenerIntrospectionTrait' => __DIR__ . '/..' . '/zendframework/zend-eventmanager/src/Test/EventListenerIntrospectionTrait.php', + 'Zend\\Filter\\AbstractDateDropdown' => __DIR__ . '/..' . '/zendframework/zend-filter/src/AbstractDateDropdown.php', + 'Zend\\Filter\\AbstractFilter' => __DIR__ . '/..' . '/zendframework/zend-filter/src/AbstractFilter.php', + 'Zend\\Filter\\AbstractUnicode' => __DIR__ . '/..' . '/zendframework/zend-filter/src/AbstractUnicode.php', + 'Zend\\Filter\\BaseName' => __DIR__ . '/..' . '/zendframework/zend-filter/src/BaseName.php', + 'Zend\\Filter\\Blacklist' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Blacklist.php', + 'Zend\\Filter\\Boolean' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Boolean.php', + 'Zend\\Filter\\Callback' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Callback.php', + 'Zend\\Filter\\Compress' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Compress.php', + 'Zend\\Filter\\Compress\\AbstractCompressionAlgorithm' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Compress/AbstractCompressionAlgorithm.php', + 'Zend\\Filter\\Compress\\Bz2' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Compress/Bz2.php', + 'Zend\\Filter\\Compress\\CompressionAlgorithmInterface' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Compress/CompressionAlgorithmInterface.php', + 'Zend\\Filter\\Compress\\Gz' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Compress/Gz.php', + 'Zend\\Filter\\Compress\\Lzf' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Compress/Lzf.php', + 'Zend\\Filter\\Compress\\Rar' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Compress/Rar.php', + 'Zend\\Filter\\Compress\\Snappy' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Compress/Snappy.php', + 'Zend\\Filter\\Compress\\Tar' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Compress/Tar.php', + 'Zend\\Filter\\Compress\\Zip' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Compress/Zip.php', + 'Zend\\Filter\\ConfigProvider' => __DIR__ . '/..' . '/zendframework/zend-filter/src/ConfigProvider.php', + 'Zend\\Filter\\DataUnitFormatter' => __DIR__ . '/..' . '/zendframework/zend-filter/src/DataUnitFormatter.php', + 'Zend\\Filter\\DateSelect' => __DIR__ . '/..' . '/zendframework/zend-filter/src/DateSelect.php', + 'Zend\\Filter\\DateTimeFormatter' => __DIR__ . '/..' . '/zendframework/zend-filter/src/DateTimeFormatter.php', + 'Zend\\Filter\\DateTimeSelect' => __DIR__ . '/..' . '/zendframework/zend-filter/src/DateTimeSelect.php', + 'Zend\\Filter\\Decompress' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Decompress.php', + 'Zend\\Filter\\Decrypt' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Decrypt.php', + 'Zend\\Filter\\Digits' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Digits.php', + 'Zend\\Filter\\Dir' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Dir.php', + 'Zend\\Filter\\Encrypt' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Encrypt.php', + 'Zend\\Filter\\Encrypt\\BlockCipher' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Encrypt/BlockCipher.php', + 'Zend\\Filter\\Encrypt\\EncryptionAlgorithmInterface' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Encrypt/EncryptionAlgorithmInterface.php', + 'Zend\\Filter\\Encrypt\\Openssl' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Encrypt/Openssl.php', + 'Zend\\Filter\\Exception\\BadMethodCallException' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Exception/BadMethodCallException.php', + 'Zend\\Filter\\Exception\\DomainException' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Exception/DomainException.php', + 'Zend\\Filter\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Exception/ExceptionInterface.php', + 'Zend\\Filter\\Exception\\ExtensionNotLoadedException' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Exception/ExtensionNotLoadedException.php', + 'Zend\\Filter\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Exception/InvalidArgumentException.php', + 'Zend\\Filter\\Exception\\RuntimeException' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Exception/RuntimeException.php', + 'Zend\\Filter\\File\\Decrypt' => __DIR__ . '/..' . '/zendframework/zend-filter/src/File/Decrypt.php', + 'Zend\\Filter\\File\\Encrypt' => __DIR__ . '/..' . '/zendframework/zend-filter/src/File/Encrypt.php', + 'Zend\\Filter\\File\\LowerCase' => __DIR__ . '/..' . '/zendframework/zend-filter/src/File/LowerCase.php', + 'Zend\\Filter\\File\\Rename' => __DIR__ . '/..' . '/zendframework/zend-filter/src/File/Rename.php', + 'Zend\\Filter\\File\\RenameUpload' => __DIR__ . '/..' . '/zendframework/zend-filter/src/File/RenameUpload.php', + 'Zend\\Filter\\File\\UpperCase' => __DIR__ . '/..' . '/zendframework/zend-filter/src/File/UpperCase.php', + 'Zend\\Filter\\FilterChain' => __DIR__ . '/..' . '/zendframework/zend-filter/src/FilterChain.php', + 'Zend\\Filter\\FilterInterface' => __DIR__ . '/..' . '/zendframework/zend-filter/src/FilterInterface.php', + 'Zend\\Filter\\FilterPluginManager' => __DIR__ . '/..' . '/zendframework/zend-filter/src/FilterPluginManager.php', + 'Zend\\Filter\\FilterPluginManagerFactory' => __DIR__ . '/..' . '/zendframework/zend-filter/src/FilterPluginManagerFactory.php', + 'Zend\\Filter\\FilterProviderInterface' => __DIR__ . '/..' . '/zendframework/zend-filter/src/FilterProviderInterface.php', + 'Zend\\Filter\\HtmlEntities' => __DIR__ . '/..' . '/zendframework/zend-filter/src/HtmlEntities.php', + 'Zend\\Filter\\Inflector' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Inflector.php', + 'Zend\\Filter\\Int' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Int.php', + 'Zend\\Filter\\Module' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Module.php', + 'Zend\\Filter\\MonthSelect' => __DIR__ . '/..' . '/zendframework/zend-filter/src/MonthSelect.php', + 'Zend\\Filter\\Null' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Null.php', + 'Zend\\Filter\\PregReplace' => __DIR__ . '/..' . '/zendframework/zend-filter/src/PregReplace.php', + 'Zend\\Filter\\RealPath' => __DIR__ . '/..' . '/zendframework/zend-filter/src/RealPath.php', + 'Zend\\Filter\\StaticFilter' => __DIR__ . '/..' . '/zendframework/zend-filter/src/StaticFilter.php', + 'Zend\\Filter\\StringPrefix' => __DIR__ . '/..' . '/zendframework/zend-filter/src/StringPrefix.php', + 'Zend\\Filter\\StringSuffix' => __DIR__ . '/..' . '/zendframework/zend-filter/src/StringSuffix.php', + 'Zend\\Filter\\StringToLower' => __DIR__ . '/..' . '/zendframework/zend-filter/src/StringToLower.php', + 'Zend\\Filter\\StringToUpper' => __DIR__ . '/..' . '/zendframework/zend-filter/src/StringToUpper.php', + 'Zend\\Filter\\StringTrim' => __DIR__ . '/..' . '/zendframework/zend-filter/src/StringTrim.php', + 'Zend\\Filter\\StripNewlines' => __DIR__ . '/..' . '/zendframework/zend-filter/src/StripNewlines.php', + 'Zend\\Filter\\StripTags' => __DIR__ . '/..' . '/zendframework/zend-filter/src/StripTags.php', + 'Zend\\Filter\\ToFloat' => __DIR__ . '/..' . '/zendframework/zend-filter/src/ToFloat.php', + 'Zend\\Filter\\ToInt' => __DIR__ . '/..' . '/zendframework/zend-filter/src/ToInt.php', + 'Zend\\Filter\\ToNull' => __DIR__ . '/..' . '/zendframework/zend-filter/src/ToNull.php', + 'Zend\\Filter\\UpperCaseWords' => __DIR__ . '/..' . '/zendframework/zend-filter/src/UpperCaseWords.php', + 'Zend\\Filter\\UriNormalize' => __DIR__ . '/..' . '/zendframework/zend-filter/src/UriNormalize.php', + 'Zend\\Filter\\Whitelist' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Whitelist.php', + 'Zend\\Filter\\Word\\AbstractSeparator' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Word/AbstractSeparator.php', + 'Zend\\Filter\\Word\\CamelCaseToDash' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Word/CamelCaseToDash.php', + 'Zend\\Filter\\Word\\CamelCaseToSeparator' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Word/CamelCaseToSeparator.php', + 'Zend\\Filter\\Word\\CamelCaseToUnderscore' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Word/CamelCaseToUnderscore.php', + 'Zend\\Filter\\Word\\DashToCamelCase' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Word/DashToCamelCase.php', + 'Zend\\Filter\\Word\\DashToSeparator' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Word/DashToSeparator.php', + 'Zend\\Filter\\Word\\DashToUnderscore' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Word/DashToUnderscore.php', + 'Zend\\Filter\\Word\\SeparatorToCamelCase' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Word/SeparatorToCamelCase.php', + 'Zend\\Filter\\Word\\SeparatorToDash' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Word/SeparatorToDash.php', + 'Zend\\Filter\\Word\\SeparatorToSeparator' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Word/SeparatorToSeparator.php', + 'Zend\\Filter\\Word\\Service\\SeparatorToSeparatorFactory' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Word/Service/SeparatorToSeparatorFactory.php', + 'Zend\\Filter\\Word\\UnderscoreToCamelCase' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Word/UnderscoreToCamelCase.php', + 'Zend\\Filter\\Word\\UnderscoreToDash' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Word/UnderscoreToDash.php', + 'Zend\\Filter\\Word\\UnderscoreToSeparator' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Word/UnderscoreToSeparator.php', + 'Zend\\Filter\\Word\\UnderscoreToStudlyCase' => __DIR__ . '/..' . '/zendframework/zend-filter/src/Word/UnderscoreToStudlyCase.php', + 'Zend\\Hydrator\\AbstractHydrator' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/AbstractHydrator.php', + 'Zend\\Hydrator\\Aggregate\\AggregateHydrator' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/Aggregate/AggregateHydrator.php', + 'Zend\\Hydrator\\Aggregate\\ExtractEvent' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/Aggregate/ExtractEvent.php', + 'Zend\\Hydrator\\Aggregate\\HydrateEvent' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/Aggregate/HydrateEvent.php', + 'Zend\\Hydrator\\Aggregate\\HydratorListener' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/Aggregate/HydratorListener.php', + 'Zend\\Hydrator\\ArraySerializable' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/ArraySerializable.php', + 'Zend\\Hydrator\\ClassMethods' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/ClassMethods.php', + 'Zend\\Hydrator\\DelegatingHydrator' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/DelegatingHydrator.php', + 'Zend\\Hydrator\\DelegatingHydratorFactory' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/DelegatingHydratorFactory.php', + 'Zend\\Hydrator\\Exception\\BadMethodCallException' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/Exception/BadMethodCallException.php', + 'Zend\\Hydrator\\Exception\\DomainException' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/Exception/DomainException.php', + 'Zend\\Hydrator\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/Exception/ExceptionInterface.php', + 'Zend\\Hydrator\\Exception\\ExtensionNotLoadedException' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/Exception/ExtensionNotLoadedException.php', + 'Zend\\Hydrator\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/Exception/InvalidArgumentException.php', + 'Zend\\Hydrator\\Exception\\InvalidCallbackException' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/Exception/InvalidCallbackException.php', + 'Zend\\Hydrator\\Exception\\LogicException' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/Exception/LogicException.php', + 'Zend\\Hydrator\\Exception\\RuntimeException' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/Exception/RuntimeException.php', + 'Zend\\Hydrator\\ExtractionInterface' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/ExtractionInterface.php', + 'Zend\\Hydrator\\FilterEnabledInterface' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/FilterEnabledInterface.php', + 'Zend\\Hydrator\\Filter\\FilterComposite' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/Filter/FilterComposite.php', + 'Zend\\Hydrator\\Filter\\FilterInterface' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/Filter/FilterInterface.php', + 'Zend\\Hydrator\\Filter\\FilterProviderInterface' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/Filter/FilterProviderInterface.php', + 'Zend\\Hydrator\\Filter\\GetFilter' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/Filter/GetFilter.php', + 'Zend\\Hydrator\\Filter\\HasFilter' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/Filter/HasFilter.php', + 'Zend\\Hydrator\\Filter\\IsFilter' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/Filter/IsFilter.php', + 'Zend\\Hydrator\\Filter\\MethodMatchFilter' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/Filter/MethodMatchFilter.php', + 'Zend\\Hydrator\\Filter\\NumberOfParameterFilter' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/Filter/NumberOfParameterFilter.php', + 'Zend\\Hydrator\\Filter\\OptionalParametersFilter' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/Filter/OptionalParametersFilter.php', + 'Zend\\Hydrator\\HydrationInterface' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/HydrationInterface.php', + 'Zend\\Hydrator\\HydratorAwareInterface' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/HydratorAwareInterface.php', + 'Zend\\Hydrator\\HydratorAwareTrait' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/HydratorAwareTrait.php', + 'Zend\\Hydrator\\HydratorInterface' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/HydratorInterface.php', + 'Zend\\Hydrator\\HydratorOptionsInterface' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/HydratorOptionsInterface.php', + 'Zend\\Hydrator\\HydratorPluginManager' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/HydratorPluginManager.php', + 'Zend\\Hydrator\\Iterator\\HydratingArrayIterator' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/Iterator/HydratingArrayIterator.php', + 'Zend\\Hydrator\\Iterator\\HydratingIteratorInterface' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/Iterator/HydratingIteratorInterface.php', + 'Zend\\Hydrator\\Iterator\\HydratingIteratorIterator' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/Iterator/HydratingIteratorIterator.php', + 'Zend\\Hydrator\\NamingStrategyEnabledInterface' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/NamingStrategyEnabledInterface.php', + 'Zend\\Hydrator\\NamingStrategy\\ArrayMapNamingStrategy' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/NamingStrategy/ArrayMapNamingStrategy.php', + 'Zend\\Hydrator\\NamingStrategy\\CompositeNamingStrategy' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/NamingStrategy/CompositeNamingStrategy.php', + 'Zend\\Hydrator\\NamingStrategy\\IdentityNamingStrategy' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/NamingStrategy/IdentityNamingStrategy.php', + 'Zend\\Hydrator\\NamingStrategy\\MapNamingStrategy' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/NamingStrategy/MapNamingStrategy.php', + 'Zend\\Hydrator\\NamingStrategy\\NamingStrategyInterface' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/NamingStrategy/NamingStrategyInterface.php', + 'Zend\\Hydrator\\NamingStrategy\\UnderscoreNamingStrategy' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/NamingStrategy/UnderscoreNamingStrategy.php', + 'Zend\\Hydrator\\ObjectProperty' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/ObjectProperty.php', + 'Zend\\Hydrator\\Reflection' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/Reflection.php', + 'Zend\\Hydrator\\StrategyEnabledInterface' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/StrategyEnabledInterface.php', + 'Zend\\Hydrator\\Strategy\\BooleanStrategy' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/Strategy/BooleanStrategy.php', + 'Zend\\Hydrator\\Strategy\\ClosureStrategy' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/Strategy/ClosureStrategy.php', + 'Zend\\Hydrator\\Strategy\\DateTimeFormatterStrategy' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/Strategy/DateTimeFormatterStrategy.php', + 'Zend\\Hydrator\\Strategy\\DefaultStrategy' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/Strategy/DefaultStrategy.php', + 'Zend\\Hydrator\\Strategy\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/Strategy/Exception/ExceptionInterface.php', + 'Zend\\Hydrator\\Strategy\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/Strategy/Exception/InvalidArgumentException.php', + 'Zend\\Hydrator\\Strategy\\ExplodeStrategy' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/Strategy/ExplodeStrategy.php', + 'Zend\\Hydrator\\Strategy\\SerializableStrategy' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/Strategy/SerializableStrategy.php', + 'Zend\\Hydrator\\Strategy\\StrategyChain' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/Strategy/StrategyChain.php', + 'Zend\\Hydrator\\Strategy\\StrategyInterface' => __DIR__ . '/..' . '/zendframework/zend-hydrator/src/Strategy/StrategyInterface.php', + 'Zend\\I18n\\ConfigProvider' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/ConfigProvider.php', + 'Zend\\I18n\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Exception/ExceptionInterface.php', + 'Zend\\I18n\\Exception\\ExtensionNotLoadedException' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Exception/ExtensionNotLoadedException.php', + 'Zend\\I18n\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Exception/InvalidArgumentException.php', + 'Zend\\I18n\\Exception\\OutOfBoundsException' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Exception/OutOfBoundsException.php', + 'Zend\\I18n\\Exception\\ParseException' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Exception/ParseException.php', + 'Zend\\I18n\\Exception\\RangeException' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Exception/RangeException.php', + 'Zend\\I18n\\Exception\\RuntimeException' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Exception/RuntimeException.php', + 'Zend\\I18n\\Filter\\AbstractLocale' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Filter/AbstractLocale.php', + 'Zend\\I18n\\Filter\\Alnum' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Filter/Alnum.php', + 'Zend\\I18n\\Filter\\Alpha' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Filter/Alpha.php', + 'Zend\\I18n\\Filter\\NumberFormat' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Filter/NumberFormat.php', + 'Zend\\I18n\\Filter\\NumberParse' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Filter/NumberParse.php', + 'Zend\\I18n\\Module' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Module.php', + 'Zend\\I18n\\Translator\\LoaderPluginManager' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Translator/LoaderPluginManager.php', + 'Zend\\I18n\\Translator\\LoaderPluginManagerFactory' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Translator/LoaderPluginManagerFactory.php', + 'Zend\\I18n\\Translator\\Loader\\AbstractFileLoader' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Translator/Loader/AbstractFileLoader.php', + 'Zend\\I18n\\Translator\\Loader\\FileLoaderInterface' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Translator/Loader/FileLoaderInterface.php', + 'Zend\\I18n\\Translator\\Loader\\Gettext' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Translator/Loader/Gettext.php', + 'Zend\\I18n\\Translator\\Loader\\Ini' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Translator/Loader/Ini.php', + 'Zend\\I18n\\Translator\\Loader\\PhpArray' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Translator/Loader/PhpArray.php', + 'Zend\\I18n\\Translator\\Loader\\PhpMemoryArray' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Translator/Loader/PhpMemoryArray.php', + 'Zend\\I18n\\Translator\\Loader\\RemoteLoaderInterface' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Translator/Loader/RemoteLoaderInterface.php', + 'Zend\\I18n\\Translator\\Plural\\Parser' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Translator/Plural/Parser.php', + 'Zend\\I18n\\Translator\\Plural\\Rule' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Translator/Plural/Rule.php', + 'Zend\\I18n\\Translator\\Plural\\Symbol' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Translator/Plural/Symbol.php', + 'Zend\\I18n\\Translator\\TextDomain' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Translator/TextDomain.php', + 'Zend\\I18n\\Translator\\Translator' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Translator/Translator.php', + 'Zend\\I18n\\Translator\\TranslatorAwareInterface' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Translator/TranslatorAwareInterface.php', + 'Zend\\I18n\\Translator\\TranslatorAwareTrait' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Translator/TranslatorAwareTrait.php', + 'Zend\\I18n\\Translator\\TranslatorInterface' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Translator/TranslatorInterface.php', + 'Zend\\I18n\\Translator\\TranslatorServiceFactory' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Translator/TranslatorServiceFactory.php', + 'Zend\\I18n\\Validator\\Alnum' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Validator/Alnum.php', + 'Zend\\I18n\\Validator\\Alpha' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Validator/Alpha.php', + 'Zend\\I18n\\Validator\\DateTime' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Validator/DateTime.php', + 'Zend\\I18n\\Validator\\Float' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Validator/Float.php', + 'Zend\\I18n\\Validator\\Int' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Validator/Int.php', + 'Zend\\I18n\\Validator\\IsFloat' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Validator/IsFloat.php', + 'Zend\\I18n\\Validator\\IsInt' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Validator/IsInt.php', + 'Zend\\I18n\\Validator\\PhoneNumber' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Validator/PhoneNumber.php', + 'Zend\\I18n\\Validator\\PostCode' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/Validator/PostCode.php', + 'Zend\\I18n\\View\\HelperConfig' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/View/HelperConfig.php', + 'Zend\\I18n\\View\\HelperTrait' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/View/HelperTrait.php', + 'Zend\\I18n\\View\\Helper\\AbstractTranslatorHelper' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/View/Helper/AbstractTranslatorHelper.php', + 'Zend\\I18n\\View\\Helper\\CurrencyFormat' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/View/Helper/CurrencyFormat.php', + 'Zend\\I18n\\View\\Helper\\DateFormat' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/View/Helper/DateFormat.php', + 'Zend\\I18n\\View\\Helper\\NumberFormat' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/View/Helper/NumberFormat.php', + 'Zend\\I18n\\View\\Helper\\Plural' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/View/Helper/Plural.php', + 'Zend\\I18n\\View\\Helper\\Translate' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/View/Helper/Translate.php', + 'Zend\\I18n\\View\\Helper\\TranslatePlural' => __DIR__ . '/..' . '/zendframework/zend-i18n/src/View/Helper/TranslatePlural.php', + 'Zend\\Json\\Decoder' => __DIR__ . '/..' . '/zendframework/zend-json/src/Decoder.php', + 'Zend\\Json\\Encoder' => __DIR__ . '/..' . '/zendframework/zend-json/src/Encoder.php', + 'Zend\\Json\\Exception\\BadMethodCallException' => __DIR__ . '/..' . '/zendframework/zend-json/src/Exception/BadMethodCallException.php', + 'Zend\\Json\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/zendframework/zend-json/src/Exception/ExceptionInterface.php', + 'Zend\\Json\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/zendframework/zend-json/src/Exception/InvalidArgumentException.php', + 'Zend\\Json\\Exception\\RecursionException' => __DIR__ . '/..' . '/zendframework/zend-json/src/Exception/RecursionException.php', + 'Zend\\Json\\Exception\\RuntimeException' => __DIR__ . '/..' . '/zendframework/zend-json/src/Exception/RuntimeException.php', + 'Zend\\Json\\Expr' => __DIR__ . '/..' . '/zendframework/zend-json/src/Expr.php', + 'Zend\\Json\\Json' => __DIR__ . '/..' . '/zendframework/zend-json/src/Json.php', + 'Zend\\Serializer\\AdapterPluginManager' => __DIR__ . '/..' . '/zendframework/zend-serializer/src/AdapterPluginManager.php', + 'Zend\\Serializer\\AdapterPluginManagerFactory' => __DIR__ . '/..' . '/zendframework/zend-serializer/src/AdapterPluginManagerFactory.php', + 'Zend\\Serializer\\Adapter\\AbstractAdapter' => __DIR__ . '/..' . '/zendframework/zend-serializer/src/Adapter/AbstractAdapter.php', + 'Zend\\Serializer\\Adapter\\AdapterInterface' => __DIR__ . '/..' . '/zendframework/zend-serializer/src/Adapter/AdapterInterface.php', + 'Zend\\Serializer\\Adapter\\AdapterOptions' => __DIR__ . '/..' . '/zendframework/zend-serializer/src/Adapter/AdapterOptions.php', + 'Zend\\Serializer\\Adapter\\IgBinary' => __DIR__ . '/..' . '/zendframework/zend-serializer/src/Adapter/IgBinary.php', + 'Zend\\Serializer\\Adapter\\Json' => __DIR__ . '/..' . '/zendframework/zend-serializer/src/Adapter/Json.php', + 'Zend\\Serializer\\Adapter\\JsonOptions' => __DIR__ . '/..' . '/zendframework/zend-serializer/src/Adapter/JsonOptions.php', + 'Zend\\Serializer\\Adapter\\MsgPack' => __DIR__ . '/..' . '/zendframework/zend-serializer/src/Adapter/MsgPack.php', + 'Zend\\Serializer\\Adapter\\PhpCode' => __DIR__ . '/..' . '/zendframework/zend-serializer/src/Adapter/PhpCode.php', + 'Zend\\Serializer\\Adapter\\PhpSerialize' => __DIR__ . '/..' . '/zendframework/zend-serializer/src/Adapter/PhpSerialize.php', + 'Zend\\Serializer\\Adapter\\PhpSerializeOptions' => __DIR__ . '/..' . '/zendframework/zend-serializer/src/Adapter/PhpSerializeOptions.php', + 'Zend\\Serializer\\Adapter\\PythonPickle' => __DIR__ . '/..' . '/zendframework/zend-serializer/src/Adapter/PythonPickle.php', + 'Zend\\Serializer\\Adapter\\PythonPickleOptions' => __DIR__ . '/..' . '/zendframework/zend-serializer/src/Adapter/PythonPickleOptions.php', + 'Zend\\Serializer\\Adapter\\Wddx' => __DIR__ . '/..' . '/zendframework/zend-serializer/src/Adapter/Wddx.php', + 'Zend\\Serializer\\Adapter\\WddxOptions' => __DIR__ . '/..' . '/zendframework/zend-serializer/src/Adapter/WddxOptions.php', + 'Zend\\Serializer\\ConfigProvider' => __DIR__ . '/..' . '/zendframework/zend-serializer/src/ConfigProvider.php', + 'Zend\\Serializer\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/zendframework/zend-serializer/src/Exception/ExceptionInterface.php', + 'Zend\\Serializer\\Exception\\ExtensionNotLoadedException' => __DIR__ . '/..' . '/zendframework/zend-serializer/src/Exception/ExtensionNotLoadedException.php', + 'Zend\\Serializer\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/zendframework/zend-serializer/src/Exception/InvalidArgumentException.php', + 'Zend\\Serializer\\Exception\\RuntimeException' => __DIR__ . '/..' . '/zendframework/zend-serializer/src/Exception/RuntimeException.php', + 'Zend\\Serializer\\Module' => __DIR__ . '/..' . '/zendframework/zend-serializer/src/Module.php', + 'Zend\\Serializer\\Serializer' => __DIR__ . '/..' . '/zendframework/zend-serializer/src/Serializer.php', + 'Zend\\ServiceManager\\AbstractFactoryInterface' => __DIR__ . '/..' . '/zendframework/zend-servicemanager/src/AbstractFactoryInterface.php', + 'Zend\\ServiceManager\\AbstractPluginManager' => __DIR__ . '/..' . '/zendframework/zend-servicemanager/src/AbstractPluginManager.php', + 'Zend\\ServiceManager\\Config' => __DIR__ . '/..' . '/zendframework/zend-servicemanager/src/Config.php', + 'Zend\\ServiceManager\\ConfigInterface' => __DIR__ . '/..' . '/zendframework/zend-servicemanager/src/ConfigInterface.php', + 'Zend\\ServiceManager\\DelegatorFactoryInterface' => __DIR__ . '/..' . '/zendframework/zend-servicemanager/src/DelegatorFactoryInterface.php', + 'Zend\\ServiceManager\\Di\\DiAbstractServiceFactory' => __DIR__ . '/..' . '/zendframework/zend-servicemanager/src/Di/DiAbstractServiceFactory.php', + 'Zend\\ServiceManager\\Di\\DiInstanceManagerProxy' => __DIR__ . '/..' . '/zendframework/zend-servicemanager/src/Di/DiInstanceManagerProxy.php', + 'Zend\\ServiceManager\\Di\\DiServiceFactory' => __DIR__ . '/..' . '/zendframework/zend-servicemanager/src/Di/DiServiceFactory.php', + 'Zend\\ServiceManager\\Di\\DiServiceInitializer' => __DIR__ . '/..' . '/zendframework/zend-servicemanager/src/Di/DiServiceInitializer.php', + 'Zend\\ServiceManager\\Exception\\CircularDependencyFoundException' => __DIR__ . '/..' . '/zendframework/zend-servicemanager/src/Exception/CircularDependencyFoundException.php', + 'Zend\\ServiceManager\\Exception\\CircularReferenceException' => __DIR__ . '/..' . '/zendframework/zend-servicemanager/src/Exception/CircularReferenceException.php', + 'Zend\\ServiceManager\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/zendframework/zend-servicemanager/src/Exception/ExceptionInterface.php', + 'Zend\\ServiceManager\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/zendframework/zend-servicemanager/src/Exception/InvalidArgumentException.php', + 'Zend\\ServiceManager\\Exception\\InvalidServiceException' => __DIR__ . '/..' . '/zendframework/zend-servicemanager/src/Exception/InvalidServiceException.php', + 'Zend\\ServiceManager\\Exception\\InvalidServiceNameException' => __DIR__ . '/..' . '/zendframework/zend-servicemanager/src/Exception/InvalidServiceNameException.php', + 'Zend\\ServiceManager\\Exception\\RuntimeException' => __DIR__ . '/..' . '/zendframework/zend-servicemanager/src/Exception/RuntimeException.php', + 'Zend\\ServiceManager\\Exception\\ServiceLocatorUsageException' => __DIR__ . '/..' . '/zendframework/zend-servicemanager/src/Exception/ServiceLocatorUsageException.php', + 'Zend\\ServiceManager\\Exception\\ServiceNotCreatedException' => __DIR__ . '/..' . '/zendframework/zend-servicemanager/src/Exception/ServiceNotCreatedException.php', + 'Zend\\ServiceManager\\Exception\\ServiceNotFoundException' => __DIR__ . '/..' . '/zendframework/zend-servicemanager/src/Exception/ServiceNotFoundException.php', + 'Zend\\ServiceManager\\FactoryInterface' => __DIR__ . '/..' . '/zendframework/zend-servicemanager/src/FactoryInterface.php', + 'Zend\\ServiceManager\\Factory\\InvokableFactory' => __DIR__ . '/..' . '/zendframework/zend-servicemanager/src/Factory/InvokableFactory.php', + 'Zend\\ServiceManager\\InitializerInterface' => __DIR__ . '/..' . '/zendframework/zend-servicemanager/src/InitializerInterface.php', + 'Zend\\ServiceManager\\MutableCreationOptionsInterface' => __DIR__ . '/..' . '/zendframework/zend-servicemanager/src/MutableCreationOptionsInterface.php', + 'Zend\\ServiceManager\\MutableCreationOptionsTrait' => __DIR__ . '/..' . '/zendframework/zend-servicemanager/src/MutableCreationOptionsTrait.php', + 'Zend\\ServiceManager\\Proxy\\LazyServiceFactory' => __DIR__ . '/..' . '/zendframework/zend-servicemanager/src/Proxy/LazyServiceFactory.php', + 'Zend\\ServiceManager\\Proxy\\LazyServiceFactoryFactory' => __DIR__ . '/..' . '/zendframework/zend-servicemanager/src/Proxy/LazyServiceFactoryFactory.php', + 'Zend\\ServiceManager\\ServiceLocatorAwareInterface' => __DIR__ . '/..' . '/zendframework/zend-servicemanager/src/ServiceLocatorAwareInterface.php', + 'Zend\\ServiceManager\\ServiceLocatorAwareTrait' => __DIR__ . '/..' . '/zendframework/zend-servicemanager/src/ServiceLocatorAwareTrait.php', + 'Zend\\ServiceManager\\ServiceLocatorInterface' => __DIR__ . '/..' . '/zendframework/zend-servicemanager/src/ServiceLocatorInterface.php', + 'Zend\\ServiceManager\\ServiceManager' => __DIR__ . '/..' . '/zendframework/zend-servicemanager/src/ServiceManager.php', + 'Zend\\ServiceManager\\ServiceManagerAwareInterface' => __DIR__ . '/..' . '/zendframework/zend-servicemanager/src/ServiceManagerAwareInterface.php', + 'Zend\\ServiceManager\\Test\\CommonPluginManagerTrait' => __DIR__ . '/..' . '/zendframework/zend-servicemanager/src/Test/CommonPluginManagerTrait.php', + 'Zend\\Stdlib\\AbstractOptions' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/AbstractOptions.php', + 'Zend\\Stdlib\\ArrayObject' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/ArrayObject.php', + 'Zend\\Stdlib\\ArraySerializableInterface' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/ArraySerializableInterface.php', + 'Zend\\Stdlib\\ArrayStack' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/ArrayStack.php', + 'Zend\\Stdlib\\ArrayUtils' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/ArrayUtils.php', + 'Zend\\Stdlib\\ArrayUtils\\MergeRemoveKey' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/ArrayUtils/MergeRemoveKey.php', + 'Zend\\Stdlib\\ArrayUtils\\MergeReplaceKey' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/ArrayUtils/MergeReplaceKey.php', + 'Zend\\Stdlib\\ArrayUtils\\MergeReplaceKeyInterface' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/ArrayUtils/MergeReplaceKeyInterface.php', + 'Zend\\Stdlib\\CallbackHandler' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/CallbackHandler.php', + 'Zend\\Stdlib\\DateTime' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/DateTime.php', + 'Zend\\Stdlib\\DispatchableInterface' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/DispatchableInterface.php', + 'Zend\\Stdlib\\ErrorHandler' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/ErrorHandler.php', + 'Zend\\Stdlib\\Exception\\BadMethodCallException' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Exception/BadMethodCallException.php', + 'Zend\\Stdlib\\Exception\\DomainException' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Exception/DomainException.php', + 'Zend\\Stdlib\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Exception/ExceptionInterface.php', + 'Zend\\Stdlib\\Exception\\ExtensionNotLoadedException' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Exception/ExtensionNotLoadedException.php', + 'Zend\\Stdlib\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Exception/InvalidArgumentException.php', + 'Zend\\Stdlib\\Exception\\InvalidCallbackException' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Exception/InvalidCallbackException.php', + 'Zend\\Stdlib\\Exception\\LogicException' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Exception/LogicException.php', + 'Zend\\Stdlib\\Exception\\RuntimeException' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Exception/RuntimeException.php', + 'Zend\\Stdlib\\Extractor\\ExtractionInterface' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Extractor/ExtractionInterface.php', + 'Zend\\Stdlib\\FastPriorityQueue' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/FastPriorityQueue.php', + 'Zend\\Stdlib\\Glob' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Glob.php', + 'Zend\\Stdlib\\Guard\\AllGuardsTrait' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Guard/AllGuardsTrait.php', + 'Zend\\Stdlib\\Guard\\ArrayOrTraversableGuardTrait' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Guard/ArrayOrTraversableGuardTrait.php', + 'Zend\\Stdlib\\Guard\\EmptyGuardTrait' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Guard/EmptyGuardTrait.php', + 'Zend\\Stdlib\\Guard\\GuardUtils' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Guard/GuardUtils.php', + 'Zend\\Stdlib\\Guard\\NullGuardTrait' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Guard/NullGuardTrait.php', + 'Zend\\Stdlib\\Hydrator\\AbstractHydrator' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/AbstractHydrator.php', + 'Zend\\Stdlib\\Hydrator\\Aggregate\\AggregateHydrator' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/Aggregate/AggregateHydrator.php', + 'Zend\\Stdlib\\Hydrator\\Aggregate\\ExtractEvent' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/Aggregate/ExtractEvent.php', + 'Zend\\Stdlib\\Hydrator\\Aggregate\\HydrateEvent' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/Aggregate/HydrateEvent.php', + 'Zend\\Stdlib\\Hydrator\\Aggregate\\HydratorListener' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/Aggregate/HydratorListener.php', + 'Zend\\Stdlib\\Hydrator\\ArraySerializable' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/ArraySerializable.php', + 'Zend\\Stdlib\\Hydrator\\ClassMethods' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/ClassMethods.php', + 'Zend\\Stdlib\\Hydrator\\DelegatingHydrator' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/DelegatingHydrator.php', + 'Zend\\Stdlib\\Hydrator\\DelegatingHydratorFactory' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/DelegatingHydratorFactory.php', + 'Zend\\Stdlib\\Hydrator\\FilterEnabledInterface' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/FilterEnabledInterface.php', + 'Zend\\Stdlib\\Hydrator\\Filter\\FilterComposite' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/Filter/FilterComposite.php', + 'Zend\\Stdlib\\Hydrator\\Filter\\FilterInterface' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/Filter/FilterInterface.php', + 'Zend\\Stdlib\\Hydrator\\Filter\\FilterProviderInterface' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/Filter/FilterProviderInterface.php', + 'Zend\\Stdlib\\Hydrator\\Filter\\GetFilter' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/Filter/GetFilter.php', + 'Zend\\Stdlib\\Hydrator\\Filter\\HasFilter' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/Filter/HasFilter.php', + 'Zend\\Stdlib\\Hydrator\\Filter\\IsFilter' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/Filter/IsFilter.php', + 'Zend\\Stdlib\\Hydrator\\Filter\\MethodMatchFilter' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/Filter/MethodMatchFilter.php', + 'Zend\\Stdlib\\Hydrator\\Filter\\NumberOfParameterFilter' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/Filter/NumberOfParameterFilter.php', + 'Zend\\Stdlib\\Hydrator\\Filter\\OptionalParametersFilter' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/Filter/OptionalParametersFilter.php', + 'Zend\\Stdlib\\Hydrator\\HydrationInterface' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/HydrationInterface.php', + 'Zend\\Stdlib\\Hydrator\\HydratorAwareInterface' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/HydratorAwareInterface.php', + 'Zend\\Stdlib\\Hydrator\\HydratorAwareTrait' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/HydratorAwareTrait.php', + 'Zend\\Stdlib\\Hydrator\\HydratorInterface' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/HydratorInterface.php', + 'Zend\\Stdlib\\Hydrator\\HydratorOptionsInterface' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/HydratorOptionsInterface.php', + 'Zend\\Stdlib\\Hydrator\\HydratorPluginManager' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/HydratorPluginManager.php', + 'Zend\\Stdlib\\Hydrator\\Iterator\\HydratingArrayIterator' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/Iterator/HydratingArrayIterator.php', + 'Zend\\Stdlib\\Hydrator\\Iterator\\HydratingIteratorInterface' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/Iterator/HydratingIteratorInterface.php', + 'Zend\\Stdlib\\Hydrator\\Iterator\\HydratingIteratorIterator' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/Iterator/HydratingIteratorIterator.php', + 'Zend\\Stdlib\\Hydrator\\NamingStrategyEnabledInterface' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/NamingStrategyEnabledInterface.php', + 'Zend\\Stdlib\\Hydrator\\NamingStrategy\\ArrayMapNamingStrategy' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/NamingStrategy/ArrayMapNamingStrategy.php', + 'Zend\\Stdlib\\Hydrator\\NamingStrategy\\CompositeNamingStrategy' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/NamingStrategy/CompositeNamingStrategy.php', + 'Zend\\Stdlib\\Hydrator\\NamingStrategy\\IdentityNamingStrategy' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/NamingStrategy/IdentityNamingStrategy.php', + 'Zend\\Stdlib\\Hydrator\\NamingStrategy\\MapNamingStrategy' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/NamingStrategy/MapNamingStrategy.php', + 'Zend\\Stdlib\\Hydrator\\NamingStrategy\\NamingStrategyInterface' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/NamingStrategy/NamingStrategyInterface.php', + 'Zend\\Stdlib\\Hydrator\\NamingStrategy\\UnderscoreNamingStrategy' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/NamingStrategy/UnderscoreNamingStrategy.php', + 'Zend\\Stdlib\\Hydrator\\ObjectProperty' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/ObjectProperty.php', + 'Zend\\Stdlib\\Hydrator\\Reflection' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/Reflection.php', + 'Zend\\Stdlib\\Hydrator\\StrategyEnabledInterface' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/StrategyEnabledInterface.php', + 'Zend\\Stdlib\\Hydrator\\Strategy\\BooleanStrategy' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/Strategy/BooleanStrategy.php', + 'Zend\\Stdlib\\Hydrator\\Strategy\\ClosureStrategy' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/Strategy/ClosureStrategy.php', + 'Zend\\Stdlib\\Hydrator\\Strategy\\DateTimeFormatterStrategy' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/Strategy/DateTimeFormatterStrategy.php', + 'Zend\\Stdlib\\Hydrator\\Strategy\\DefaultStrategy' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/Strategy/DefaultStrategy.php', + 'Zend\\Stdlib\\Hydrator\\Strategy\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/Strategy/Exception/ExceptionInterface.php', + 'Zend\\Stdlib\\Hydrator\\Strategy\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/Strategy/Exception/InvalidArgumentException.php', + 'Zend\\Stdlib\\Hydrator\\Strategy\\ExplodeStrategy' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/Strategy/ExplodeStrategy.php', + 'Zend\\Stdlib\\Hydrator\\Strategy\\SerializableStrategy' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/Strategy/SerializableStrategy.php', + 'Zend\\Stdlib\\Hydrator\\Strategy\\StrategyChain' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/Strategy/StrategyChain.php', + 'Zend\\Stdlib\\Hydrator\\Strategy\\StrategyInterface' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Hydrator/Strategy/StrategyInterface.php', + 'Zend\\Stdlib\\InitializableInterface' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/InitializableInterface.php', + 'Zend\\Stdlib\\JsonSerializable' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/JsonSerializable.php', + 'Zend\\Stdlib\\Message' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Message.php', + 'Zend\\Stdlib\\MessageInterface' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/MessageInterface.php', + 'Zend\\Stdlib\\ParameterObjectInterface' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/ParameterObjectInterface.php', + 'Zend\\Stdlib\\Parameters' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Parameters.php', + 'Zend\\Stdlib\\ParametersInterface' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/ParametersInterface.php', + 'Zend\\Stdlib\\PriorityList' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/PriorityList.php', + 'Zend\\Stdlib\\PriorityQueue' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/PriorityQueue.php', + 'Zend\\Stdlib\\Request' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Request.php', + 'Zend\\Stdlib\\RequestInterface' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/RequestInterface.php', + 'Zend\\Stdlib\\Response' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Response.php', + 'Zend\\Stdlib\\ResponseInterface' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/ResponseInterface.php', + 'Zend\\Stdlib\\SplPriorityQueue' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/SplPriorityQueue.php', + 'Zend\\Stdlib\\SplQueue' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/SplQueue.php', + 'Zend\\Stdlib\\SplStack' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/SplStack.php', + 'Zend\\Stdlib\\StringUtils' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/StringUtils.php', + 'Zend\\Stdlib\\StringWrapper\\AbstractStringWrapper' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/StringWrapper/AbstractStringWrapper.php', + 'Zend\\Stdlib\\StringWrapper\\Iconv' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/StringWrapper/Iconv.php', + 'Zend\\Stdlib\\StringWrapper\\Intl' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/StringWrapper/Intl.php', + 'Zend\\Stdlib\\StringWrapper\\MbString' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/StringWrapper/MbString.php', + 'Zend\\Stdlib\\StringWrapper\\Native' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/StringWrapper/Native.php', + 'Zend\\Stdlib\\StringWrapper\\StringWrapperInterface' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/StringWrapper/StringWrapperInterface.php', + 'ezcBase' => __DIR__ . '/..' . '/zetacomponents/base/src/base.php', + 'ezcBaseAutoloadException' => __DIR__ . '/..' . '/zetacomponents/base/src/exceptions/autoload.php', + 'ezcBaseAutoloadOptions' => __DIR__ . '/..' . '/zetacomponents/base/src/options/autoload.php', + 'ezcBaseConfigurationInitializer' => __DIR__ . '/..' . '/zetacomponents/base/src/interfaces/configuration_initializer.php', + 'ezcBaseDoubleClassRepositoryPrefixException' => __DIR__ . '/..' . '/zetacomponents/base/src/exceptions/double_class_repository_prefix.php', + 'ezcBaseException' => __DIR__ . '/..' . '/zetacomponents/base/src/exceptions/exception.php', + 'ezcBaseExportable' => __DIR__ . '/..' . '/zetacomponents/base/src/interfaces/exportable.php', + 'ezcBaseExtensionNotFoundException' => __DIR__ . '/..' . '/zetacomponents/base/src/exceptions/extension_not_found.php', + 'ezcBaseFeatures' => __DIR__ . '/..' . '/zetacomponents/base/src/features.php', + 'ezcBaseFile' => __DIR__ . '/..' . '/zetacomponents/base/src/file.php', + 'ezcBaseFileException' => __DIR__ . '/..' . '/zetacomponents/base/src/exceptions/file_exception.php', + 'ezcBaseFileFindContext' => __DIR__ . '/..' . '/zetacomponents/base/src/structs/file_find_context.php', + 'ezcBaseFileIoException' => __DIR__ . '/..' . '/zetacomponents/base/src/exceptions/file_io.php', + 'ezcBaseFileNotFoundException' => __DIR__ . '/..' . '/zetacomponents/base/src/exceptions/file_not_found.php', + 'ezcBaseFilePermissionException' => __DIR__ . '/..' . '/zetacomponents/base/src/exceptions/file_permission.php', + 'ezcBaseFunctionalityNotSupportedException' => __DIR__ . '/..' . '/zetacomponents/base/src/exceptions/functionality_not_supported.php', + 'ezcBaseInit' => __DIR__ . '/..' . '/zetacomponents/base/src/init.php', + 'ezcBaseInitCallbackConfiguredException' => __DIR__ . '/..' . '/zetacomponents/base/src/exceptions/init_callback_configured.php', + 'ezcBaseInitInvalidCallbackClassException' => __DIR__ . '/..' . '/zetacomponents/base/src/exceptions/invalid_callback_class.php', + 'ezcBaseInvalidParentClassException' => __DIR__ . '/..' . '/zetacomponents/base/src/exceptions/invalid_parent_class.php', + 'ezcBaseMetaData' => __DIR__ . '/..' . '/zetacomponents/base/src/metadata.php', + 'ezcBaseMetaDataPearReader' => __DIR__ . '/..' . '/zetacomponents/base/src/metadata/pear.php', + 'ezcBaseMetaDataTarballReader' => __DIR__ . '/..' . '/zetacomponents/base/src/metadata/tarball.php', + 'ezcBaseOptions' => __DIR__ . '/..' . '/zetacomponents/base/src/options.php', + 'ezcBasePersistable' => __DIR__ . '/..' . '/zetacomponents/base/src/interfaces/persistable.php', + 'ezcBasePropertyNotFoundException' => __DIR__ . '/..' . '/zetacomponents/base/src/exceptions/property_not_found.php', + 'ezcBasePropertyPermissionException' => __DIR__ . '/..' . '/zetacomponents/base/src/exceptions/property_permission.php', + 'ezcBaseRepositoryDirectory' => __DIR__ . '/..' . '/zetacomponents/base/src/structs/repository_directory.php', + 'ezcBaseSettingNotFoundException' => __DIR__ . '/..' . '/zetacomponents/base/src/exceptions/setting_not_found.php', + 'ezcBaseSettingValueException' => __DIR__ . '/..' . '/zetacomponents/base/src/exceptions/setting_value.php', + 'ezcBaseStruct' => __DIR__ . '/..' . '/zetacomponents/base/src/struct.php', + 'ezcBaseValueException' => __DIR__ . '/..' . '/zetacomponents/base/src/exceptions/value.php', + 'ezcBaseWhateverException' => __DIR__ . '/..' . '/zetacomponents/base/src/exceptions/whatever.php', + 'ezcDocument' => __DIR__ . '/..' . '/zetacomponents/document/src/interfaces/document.php', + 'ezcDocumentAlnumListItemGenerator' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/item_generator/alnum.php', + 'ezcDocumentAlphaListItemGenerator' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/item_generator/alpha.php', + 'ezcDocumentBBCode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode.php', + 'ezcDocumentBBCodeBlockLevelNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode/nodes/block.php', + 'ezcDocumentBBCodeBulletListNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode/nodes/bullet_list.php', + 'ezcDocumentBBCodeClosingTagNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode/nodes/tag_close.php', + 'ezcDocumentBBCodeDocbookVisitor' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode/visitor/docbook.php', + 'ezcDocumentBBCodeDocumentNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode/nodes/document.php', + 'ezcDocumentBBCodeEmailPlugin' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode/plugins/email.php', + 'ezcDocumentBBCodeEmphasisPlugin' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode/plugins/emphasis.php', + 'ezcDocumentBBCodeEndOfFileToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode/token/end_of_file.php', + 'ezcDocumentBBCodeEnumeratedListNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode/nodes/enumerated_list.php', + 'ezcDocumentBBCodeImagePlugin' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode/plugins/image.php', + 'ezcDocumentBBCodeInlineLiteralNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode/nodes/inline_literal.php', + 'ezcDocumentBBCodeLineBreakToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode/token/line_break.php', + 'ezcDocumentBBCodeListEndNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode/nodes/list_end.php', + 'ezcDocumentBBCodeListItemNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode/nodes/list_item.php', + 'ezcDocumentBBCodeListItemToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode/token/list_item.php', + 'ezcDocumentBBCodeListNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode/nodes/list.php', + 'ezcDocumentBBCodeLiteralBlockNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode/nodes/literal_block.php', + 'ezcDocumentBBCodeLiteralBlockToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode/token/literal_block.php', + 'ezcDocumentBBCodeNewLineToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode/token/new_line.php', + 'ezcDocumentBBCodeNoMarkupPlugin' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode/plugins/no.php', + 'ezcDocumentBBCodeNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode/node.php', + 'ezcDocumentBBCodeOptions' => __DIR__ . '/..' . '/zetacomponents/document/src/options/document_bbcode.php', + 'ezcDocumentBBCodeParagraphNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode/nodes/paragraph.php', + 'ezcDocumentBBCodeParser' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode/parser.php', + 'ezcDocumentBBCodePlugin' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode/plugin.php', + 'ezcDocumentBBCodeQuotePlugin' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode/plugins/quote.php', + 'ezcDocumentBBCodeSpecialCharsToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode/token/special_chars.php', + 'ezcDocumentBBCodeTagCloseToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode/token/tag_clsoe.php', + 'ezcDocumentBBCodeTagNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode/nodes/tag.php', + 'ezcDocumentBBCodeTagOpenToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode/token/tag_open.php', + 'ezcDocumentBBCodeTextLineToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode/token/text_line.php', + 'ezcDocumentBBCodeTextNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode/nodes/text.php', + 'ezcDocumentBBCodeToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode/token.php', + 'ezcDocumentBBCodeTokenizer' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode/tokenizer.php', + 'ezcDocumentBBCodeUrlPlugin' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode/plugins/url.php', + 'ezcDocumentBBCodeVisitor' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode/visitor.php', + 'ezcDocumentBBCodeWhitespaceToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/bbcode/token/whitespace.php', + 'ezcDocumentBulletListItemGenerator' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/item_generator/bullet.php', + 'ezcDocumentConfluenceWiki' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/confluence.php', + 'ezcDocumentConversionException' => __DIR__ . '/..' . '/zetacomponents/document/src/exceptions/conversion.php', + 'ezcDocumentConverter' => __DIR__ . '/..' . '/zetacomponents/document/src/interfaces/converter.php', + 'ezcDocumentConverterOptions' => __DIR__ . '/..' . '/zetacomponents/document/src/options/converter.php', + 'ezcDocumentCreoleWiki' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/creole.php', + 'ezcDocumentDocbook' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/docbook.php', + 'ezcDocumentDocbookOptions' => __DIR__ . '/..' . '/zetacomponents/document/src/options/document_docbook.php', + 'ezcDocumentDocbookToEzXmlAnchorHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/ezxml/anchor.php', + 'ezcDocumentDocbookToEzXmlCommentHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/ezxml/comment.php', + 'ezcDocumentDocbookToEzXmlConverter' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook_ezxml.php', + 'ezcDocumentDocbookToEzXmlConverterOptions' => __DIR__ . '/..' . '/zetacomponents/document/src/options/converter_docbook_ezxml.php', + 'ezcDocumentDocbookToEzXmlEmphasisHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/ezxml/emphasis.php', + 'ezcDocumentDocbookToEzXmlExternalLinkHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/ezxml/external_link.php', + 'ezcDocumentDocbookToEzXmlFootnoteHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/ezxml/footnote.php', + 'ezcDocumentDocbookToEzXmlIgnoreHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/ezxml/ignore.php', + 'ezcDocumentDocbookToEzXmlInternalLinkHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/ezxml/internal_link.php', + 'ezcDocumentDocbookToEzXmlItemizedListHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/ezxml/itemized_list.php', + 'ezcDocumentDocbookToEzXmlLiteralLayoutHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/ezxml/literal_layout.php', + 'ezcDocumentDocbookToEzXmlMappingHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/ezxml/mapper.php', + 'ezcDocumentDocbookToEzXmlOrderedListHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/ezxml/ordered_list.php', + 'ezcDocumentDocbookToEzXmlParagraphHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/ezxml/paragraph.php', + 'ezcDocumentDocbookToEzXmlRecurseHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/ezxml/recurse.php', + 'ezcDocumentDocbookToEzXmlSectionHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/ezxml/section.php', + 'ezcDocumentDocbookToEzXmlTableCellHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/ezxml/table_cell.php', + 'ezcDocumentDocbookToEzXmlTableHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/ezxml/table.php', + 'ezcDocumentDocbookToEzXmlTitleHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/ezxml/title.php', + 'ezcDocumentDocbookToHtmlAnchorHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/xhtml/anchor.php', + 'ezcDocumentDocbookToHtmlBaseHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/xhtml/handler.php', + 'ezcDocumentDocbookToHtmlBlockquoteHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/xhtml/blockquote.php', + 'ezcDocumentDocbookToHtmlCommentHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/xhtml/comment.php', + 'ezcDocumentDocbookToHtmlConverter' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook_html.php', + 'ezcDocumentDocbookToHtmlConverterOptions' => __DIR__ . '/..' . '/zetacomponents/document/src/options/converter_docbook_html.php', + 'ezcDocumentDocbookToHtmlDefinitionListEntryHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/xhtml/definition_list_entry.php', + 'ezcDocumentDocbookToHtmlEmphasisHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/xhtml/emphasis.php', + 'ezcDocumentDocbookToHtmlExternalLinkHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/xhtml/external_link.php', + 'ezcDocumentDocbookToHtmlFootnoteHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/xhtml/footnote.php', + 'ezcDocumentDocbookToHtmlHeadHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/xhtml/head.php', + 'ezcDocumentDocbookToHtmlIgnoreHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/xhtml/ignore.php', + 'ezcDocumentDocbookToHtmlInternalLinkHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/xhtml/internal_link.php', + 'ezcDocumentDocbookToHtmlLiteralLayoutHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/xhtml/literal_layout.php', + 'ezcDocumentDocbookToHtmlMappingHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/xhtml/mapper.php', + 'ezcDocumentDocbookToHtmlMediaObjectHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/xhtml/mediaobject.php', + 'ezcDocumentDocbookToHtmlParagraphHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/xhtml/paragraph.php', + 'ezcDocumentDocbookToHtmlSectionHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/xhtml/section.php', + 'ezcDocumentDocbookToHtmlSpecialParagraphHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/xhtml/special_paragraph.php', + 'ezcDocumentDocbookToHtmlTableCellHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/xhtml/table_cell.php', + 'ezcDocumentDocbookToHtmlXsltConverter' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/xslt/docbook_html.php', + 'ezcDocumentDocbookToHtmlXsltConverterOptions' => __DIR__ . '/..' . '/zetacomponents/document/src/options/converter_docbook_html_xslt.php', + 'ezcDocumentDocbookToOdtAnchorHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/element_handlers/anchor.php', + 'ezcDocumentDocbookToOdtBaseHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/element_handlers/handler.php', + 'ezcDocumentDocbookToOdtCommentHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/element_handlers/comment.php', + 'ezcDocumentDocbookToOdtConverter' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook_odt.php', + 'ezcDocumentDocbookToOdtConverterOptions' => __DIR__ . '/..' . '/zetacomponents/document/src/options/converter_docbook_odt.php', + 'ezcDocumentDocbookToOdtFootnoteHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/element_handlers/footnote.php', + 'ezcDocumentDocbookToOdtIgnoreHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/element_handlers/ignore.php', + 'ezcDocumentDocbookToOdtInlineHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/element_handlers/inline.php', + 'ezcDocumentDocbookToOdtLinkHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/element_handlers/link.php', + 'ezcDocumentDocbookToOdtListHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/element_handlers/list.php', + 'ezcDocumentDocbookToOdtLiteralLayoutHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/element_handlers/literal_layout.php', + 'ezcDocumentDocbookToOdtMappingHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/element_handlers/mapper.php', + 'ezcDocumentDocbookToOdtMediaObjectHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/element_handlers/media_object.php', + 'ezcDocumentDocbookToOdtPageBreakHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/element_handlers/page_break.php', + 'ezcDocumentDocbookToOdtParagraphHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/element_handlers/paragraph.php', + 'ezcDocumentDocbookToOdtSectionHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/element_handlers/section.php', + 'ezcDocumentDocbookToOdtTableHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/element_handlers/table.php', + 'ezcDocumentDocbookToOdtUlinkHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/element_handlers/ulink.php', + 'ezcDocumentDocbookToRstBaseHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/handler.php', + 'ezcDocumentDocbookToRstBeginPageHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/begin_page.php', + 'ezcDocumentDocbookToRstBlockquoteHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/blockquote.php', + 'ezcDocumentDocbookToRstCitationHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/citation.php', + 'ezcDocumentDocbookToRstCommentHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/comment.php', + 'ezcDocumentDocbookToRstConverter' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook_rst.php', + 'ezcDocumentDocbookToRstConverterOptions' => __DIR__ . '/..' . '/zetacomponents/document/src/options/converter_docbook_rst.php', + 'ezcDocumentDocbookToRstEmphasisHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/emphasis.php', + 'ezcDocumentDocbookToRstExternalLinkHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/external_link.php', + 'ezcDocumentDocbookToRstFootnoteHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/footnote.php', + 'ezcDocumentDocbookToRstHeadHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/head.php', + 'ezcDocumentDocbookToRstIgnoreHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/ignore.php', + 'ezcDocumentDocbookToRstInlineMediaObjectHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/inlinemediaobject.php', + 'ezcDocumentDocbookToRstInternalLinkHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/internal_link.php', + 'ezcDocumentDocbookToRstItemizedListHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/itemized_list.php', + 'ezcDocumentDocbookToRstLiteralHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/literal.php', + 'ezcDocumentDocbookToRstLiteralLayoutHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/literal_layout.php', + 'ezcDocumentDocbookToRstMediaObjectHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/mediaobject.php', + 'ezcDocumentDocbookToRstOrderedListHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/ordered_list.php', + 'ezcDocumentDocbookToRstParagraphHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/paragraph.php', + 'ezcDocumentDocbookToRstRecurseHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/recurse.php', + 'ezcDocumentDocbookToRstSectionHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/section.php', + 'ezcDocumentDocbookToRstSpecialParagraphHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/special_paragraph.php', + 'ezcDocumentDocbookToRstTableHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/table.php', + 'ezcDocumentDocbookToRstVariableListHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/rst/variable_list.php', + 'ezcDocumentDocbookToWikiBaseHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/wiki/handler.php', + 'ezcDocumentDocbookToWikiBeginPageHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/wiki/begin_page.php', + 'ezcDocumentDocbookToWikiConverter' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook_wiki.php', + 'ezcDocumentDocbookToWikiConverterOptions' => __DIR__ . '/..' . '/zetacomponents/document/src/options/converter_docbook_wiki.php', + 'ezcDocumentDocbookToWikiEmphasisHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/wiki/emphasis.php', + 'ezcDocumentDocbookToWikiExternalLinkHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/wiki/external_link.php', + 'ezcDocumentDocbookToWikiIgnoreHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/wiki/ignore.php', + 'ezcDocumentDocbookToWikiInlineMediaObjectHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/wiki/inlinemediaobject.php', + 'ezcDocumentDocbookToWikiInternalLinkHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/wiki/internal_link.php', + 'ezcDocumentDocbookToWikiItemizedListHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/wiki/itemized_list.php', + 'ezcDocumentDocbookToWikiLiteralHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/wiki/literal.php', + 'ezcDocumentDocbookToWikiLiteralLayoutHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/wiki/literal_layout.php', + 'ezcDocumentDocbookToWikiMediaObjectHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/wiki/mediaobject.php', + 'ezcDocumentDocbookToWikiOrderedListHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/wiki/ordered_list.php', + 'ezcDocumentDocbookToWikiParagraphHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/wiki/paragraph.php', + 'ezcDocumentDocbookToWikiRecurseHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/wiki/recurse.php', + 'ezcDocumentDocbookToWikiSectionHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/wiki/section.php', + 'ezcDocumentDocbookToWikiTableHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/wiki/table.php', + 'ezcDocumentDokuwikiWiki' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/dokuwiki.php', + 'ezcDocumentElementVisitorConverter' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor.php', + 'ezcDocumentElementVisitorHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor_handler.php', + 'ezcDocumentErroneousXmlException' => __DIR__ . '/..' . '/zetacomponents/document/src/exceptions/erroneous_xml.php', + 'ezcDocumentErrorReporting' => __DIR__ . '/..' . '/zetacomponents/document/src/interfaces/error_reporting.php', + 'ezcDocumentException' => __DIR__ . '/..' . '/zetacomponents/document/src/exceptions/exception.php', + 'ezcDocumentEzXml' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/ezxml.php', + 'ezcDocumentEzXmlDummyLinkConverter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/ezxml/dummy_link_converter.php', + 'ezcDocumentEzXmlDummyLinkProvider' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/ezxml/dummy_link_provider.php', + 'ezcDocumentEzXmlLinkConverter' => __DIR__ . '/..' . '/zetacomponents/document/src/interfaces/ezxml_link_converter.php', + 'ezcDocumentEzXmlLinkProvider' => __DIR__ . '/..' . '/zetacomponents/document/src/interfaces/ezxml_link_provider.php', + 'ezcDocumentEzXmlOptions' => __DIR__ . '/..' . '/zetacomponents/document/src/options/document_ezxml.php', + 'ezcDocumentEzXmlToDocbookAnchorHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/ezxml/docbook/anchor.php', + 'ezcDocumentEzXmlToDocbookConverter' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/ezxml_docbook.php', + 'ezcDocumentEzXmlToDocbookConverterOptions' => __DIR__ . '/..' . '/zetacomponents/document/src/options/converter_ezxml_docbook.php', + 'ezcDocumentEzXmlToDocbookEmphasisHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/ezxml/docbook/emphasis.php', + 'ezcDocumentEzXmlToDocbookHeaderHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/ezxml/docbook/header.php', + 'ezcDocumentEzXmlToDocbookLineHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/ezxml/docbook/line.php', + 'ezcDocumentEzXmlToDocbookLinkHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/ezxml/docbook/link.php', + 'ezcDocumentEzXmlToDocbookListHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/ezxml/docbook/list.php', + 'ezcDocumentEzXmlToDocbookLiteralHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/ezxml/docbook/literal.php', + 'ezcDocumentEzXmlToDocbookMappingHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/ezxml/docbook/mapper.php', + 'ezcDocumentEzXmlToDocbookTableCellHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/ezxml/docbook/table_cell.php', + 'ezcDocumentEzXmlToDocbookTableHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/ezxml/docbook/table.php', + 'ezcDocumentEzXmlToDocbookTableRowHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/ezxml/docbook/table_row.php', + 'ezcDocumentHtmlConverterOptions' => __DIR__ . '/..' . '/zetacomponents/document/src/options/html_rendering.php', + 'ezcDocumentInvalidDocbookException' => __DIR__ . '/..' . '/zetacomponents/document/src/exceptions/invalid_docbook.php', + 'ezcDocumentInvalidFontException' => __DIR__ . '/..' . '/zetacomponents/document/src/exceptions/unknown_font.php', + 'ezcDocumentInvalidOdtException' => __DIR__ . '/..' . '/zetacomponents/document/src/exceptions/invalid_odt.php', + 'ezcDocumentListBulletGuesser' => __DIR__ . '/..' . '/zetacomponents/document/src/tools/list_bullet_guesser.php', + 'ezcDocumentListItemGenerator' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/item_generator.php', + 'ezcDocumentLocateable' => __DIR__ . '/..' . '/zetacomponents/document/src/interfaces/locateable.php', + 'ezcDocumentLocateableDomElement' => __DIR__ . '/..' . '/zetacomponents/document/src/dom_elements/locateable.php', + 'ezcDocumentMissingVisitorException' => __DIR__ . '/..' . '/zetacomponents/document/src/exceptions/missing_visitor.php', + 'ezcDocumentNoListItemGenerator' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/item_generator/no.php', + 'ezcDocumentNumberedListItemGenerator' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/item_generator/number.php', + 'ezcDocumentOdt' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/odt.php', + 'ezcDocumentOdtBaseFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/odt/filter/base.php', + 'ezcDocumentOdtDefaultPcssConverter' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/converter/default.php', + 'ezcDocumentOdtElementBaseFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/odt/filter/element/base.php', + 'ezcDocumentOdtElementFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/odt/filter/element.php', + 'ezcDocumentOdtElementFootnoteFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/odt/filter/element/footnote.php', + 'ezcDocumentOdtElementFrameFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/odt/filter/element/frame.php', + 'ezcDocumentOdtElementHeaderFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/odt/filter/element/header.php', + 'ezcDocumentOdtElementHtmlTableFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/odt/filter/element/html_table.php', + 'ezcDocumentOdtElementImageFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/odt/filter/element/image.php', + 'ezcDocumentOdtElementLinkFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/odt/filter/element/link.php', + 'ezcDocumentOdtElementListFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/odt/filter/element/list.php', + 'ezcDocumentOdtElementParagraphFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/odt/filter/element/paragraph.php', + 'ezcDocumentOdtElementTableFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/odt/filter/element/table.php', + 'ezcDocumentOdtElementWhitespaceFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/odt/filter/element/whitespace.php', + 'ezcDocumentOdtEmphasisStyleFilterRule' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/odt/filter/style/rule/emphasis.php', + 'ezcDocumentOdtFormattingProperties' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/odt/formatting/properties.php', + 'ezcDocumentOdtFormattingPropertiesExistException' => __DIR__ . '/..' . '/zetacomponents/document/src/exceptions/odt/formatting_properties_exist.php', + 'ezcDocumentOdtFormattingPropertyCollection' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/odt/formatting/property_collection.php', + 'ezcDocumentOdtImageFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/odt/filter/image.php', + 'ezcDocumentOdtImageLocator' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/image_locator.php', + 'ezcDocumentOdtListLevelStyle' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/odt/list_level_style.php', + 'ezcDocumentOdtListLevelStyleBullet' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/odt/list_level_style/bullet.php', + 'ezcDocumentOdtListLevelStyleFilterRule' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/odt/filter/style/rule/list_level.php', + 'ezcDocumentOdtListLevelStyleNumber' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/odt/list_level_style/number.php', + 'ezcDocumentOdtListStyle' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/odt/list_style.php', + 'ezcDocumentOdtListStyleGenerator' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/generator/list.php', + 'ezcDocumentOdtMetaGenerator' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/meta_generator.php', + 'ezcDocumentOdtOptions' => __DIR__ . '/..' . '/zetacomponents/document/src/options/document_odt.php', + 'ezcDocumentOdtParagraphStyleGenerator' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/generator/paragraph.php', + 'ezcDocumentOdtPcssBorderConverter' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/converter/border.php', + 'ezcDocumentOdtPcssColorConverter' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/converter/color.php', + 'ezcDocumentOdtPcssConverter' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/converter.php', + 'ezcDocumentOdtPcssConverterManager' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/converter_manager.php', + 'ezcDocumentOdtPcssConverterTools' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/converter_tools.php', + 'ezcDocumentOdtPcssFontConverter' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/converter/font.php', + 'ezcDocumentOdtPcssFontNameConverter' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/converter/font_name.php', + 'ezcDocumentOdtPcssFontSizeConverter' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/converter/font_size.php', + 'ezcDocumentOdtPcssFontStylePreprocessor' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/preprocessor/font.php', + 'ezcDocumentOdtPcssListStylePreprocessor' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/preprocessor/list.php', + 'ezcDocumentOdtPcssMarginConverter' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/converter/margin.php', + 'ezcDocumentOdtPcssParagraphStylePreprocessor' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/preprocessor/paragraph.php', + 'ezcDocumentOdtPcssPreprocessor' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/preprocessor.php', + 'ezcDocumentOdtPcssStyler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss.php', + 'ezcDocumentOdtPcssTextDecorationConverter' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/converter/text_decoration.php', + 'ezcDocumentOdtStyle' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/odt/style.php', + 'ezcDocumentOdtStyleExtractor' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/odt/style/extractor.php', + 'ezcDocumentOdtStyleFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/odt/filter/style.php', + 'ezcDocumentOdtStyleFilterRule' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/odt/filter/style/rule.php', + 'ezcDocumentOdtStyleGenerator' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/generator.php', + 'ezcDocumentOdtStyleInferencer' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/odt/style/inferencer.php', + 'ezcDocumentOdtStyleInformation' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/style_information.php', + 'ezcDocumentOdtStyleListPropertyGenerator' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/property_generator/list.php', + 'ezcDocumentOdtStyleParagraphPropertyGenerator' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/property_generator/paragraph.php', + 'ezcDocumentOdtStyleParser' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/odt/style/parser.php', + 'ezcDocumentOdtStylePropertyGenerator' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/property_generator.php', + 'ezcDocumentOdtStyleTableCellPropertyGenerator' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/property_generator/table_cell.php', + 'ezcDocumentOdtStyleTablePropertyGenerator' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/property_generator/table.php', + 'ezcDocumentOdtStyleTableRowPropertyGenerator' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/property_generator/table_row.php', + 'ezcDocumentOdtStyleTextPropertyGenerator' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/property_generator/text.php', + 'ezcDocumentOdtStyler' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler.php', + 'ezcDocumentOdtTableCellStyleGenerator' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/generator/table_cell.php', + 'ezcDocumentOdtTableRowStyleGenerator' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/generator/table_row.php', + 'ezcDocumentOdtTableStyleGenerator' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/generator/table.php', + 'ezcDocumentOdtTextProcessor' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/text_processor.php', + 'ezcDocumentOdtTextStyleGenerator' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/element_visitor/docbook/odt/styler/pcss/generator/text.php', + 'ezcDocumentOptions' => __DIR__ . '/..' . '/zetacomponents/document/src/options/document.php', + 'ezcDocumentParser' => __DIR__ . '/..' . '/zetacomponents/document/src/interfaces/parser.php', + 'ezcDocumentParserException' => __DIR__ . '/..' . '/zetacomponents/document/src/exceptions/parser.php', + 'ezcDocumentParserOptions' => __DIR__ . '/..' . '/zetacomponents/document/src/options/document_parser.php', + 'ezcDocumentPcssDeclarationDirective' => __DIR__ . '/..' . '/zetacomponents/document/src/pcss/declaration_directive.php', + 'ezcDocumentPcssDirective' => __DIR__ . '/..' . '/zetacomponents/document/src/pcss/directive.php', + 'ezcDocumentPcssLayoutDirective' => __DIR__ . '/..' . '/zetacomponents/document/src/pcss/layout_directive.php', + 'ezcDocumentPcssMeasure' => __DIR__ . '/..' . '/zetacomponents/document/src/pcss/measure.php', + 'ezcDocumentPcssParser' => __DIR__ . '/..' . '/zetacomponents/document/src/pcss/parser.php', + 'ezcDocumentPcssStyleBorderBoxValue' => __DIR__ . '/..' . '/zetacomponents/document/src/pcss/style/border_box_value.php', + 'ezcDocumentPcssStyleBorderValue' => __DIR__ . '/..' . '/zetacomponents/document/src/pcss/style/border_value.php', + 'ezcDocumentPcssStyleBoxValue' => __DIR__ . '/..' . '/zetacomponents/document/src/pcss/style/box_value.php', + 'ezcDocumentPcssStyleColorBoxValue' => __DIR__ . '/..' . '/zetacomponents/document/src/pcss/style/color_box_value.php', + 'ezcDocumentPcssStyleColorValue' => __DIR__ . '/..' . '/zetacomponents/document/src/pcss/style/color_value.php', + 'ezcDocumentPcssStyleInferencer' => __DIR__ . '/..' . '/zetacomponents/document/src/pcss/style_inferencer.php', + 'ezcDocumentPcssStyleIntValue' => __DIR__ . '/..' . '/zetacomponents/document/src/pcss/style/int_value.php', + 'ezcDocumentPcssStyleLineBoxValue' => __DIR__ . '/..' . '/zetacomponents/document/src/pcss/style/line_box_value.php', + 'ezcDocumentPcssStyleLineValue' => __DIR__ . '/..' . '/zetacomponents/document/src/pcss/style/line_value.php', + 'ezcDocumentPcssStyleListValue' => __DIR__ . '/..' . '/zetacomponents/document/src/pcss/style/list_value.php', + 'ezcDocumentPcssStyleMeasureBoxValue' => __DIR__ . '/..' . '/zetacomponents/document/src/pcss/style/measure_box_value.php', + 'ezcDocumentPcssStyleMeasureValue' => __DIR__ . '/..' . '/zetacomponents/document/src/pcss/style/measure_value.php', + 'ezcDocumentPcssStyleSrcValue' => __DIR__ . '/..' . '/zetacomponents/document/src/pcss/style/src_value.php', + 'ezcDocumentPcssStyleStringValue' => __DIR__ . '/..' . '/zetacomponents/document/src/pcss/style/string_value.php', + 'ezcDocumentPcssStyleValue' => __DIR__ . '/..' . '/zetacomponents/document/src/pcss/style/value.php', + 'ezcDocumentPdf' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf.php', + 'ezcDocumentPdfBlockRenderer' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/renderer/block.php', + 'ezcDocumentPdfBlockquoteRenderer' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/renderer/blockquote.php', + 'ezcDocumentPdfBoundingBox' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/box.php', + 'ezcDocumentPdfDefaultHyphenator' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/hyphenator/default.php', + 'ezcDocumentPdfDefaultTableColumnWidthCalculator' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/default_table_column_width_calculator.php', + 'ezcDocumentPdfDefaultTokenizer' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/tokenizer/default.php', + 'ezcDocumentPdfDriver' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/driver.php', + 'ezcDocumentPdfFooterOptions' => __DIR__ . '/..' . '/zetacomponents/document/src/options/document_pdf_footer.php', + 'ezcDocumentPdfFooterPdfPart' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/part/footer.php', + 'ezcDocumentPdfHaruDriver' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/driver/haru.php', + 'ezcDocumentPdfHeaderPdfPart' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/part/header.php', + 'ezcDocumentPdfHyphenator' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/hyphenator.php', + 'ezcDocumentPdfImage' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/image.php', + 'ezcDocumentPdfImageHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/image/handler.php', + 'ezcDocumentPdfListItemRenderer' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/renderer/list_item.php', + 'ezcDocumentPdfListRenderer' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/renderer/list.php', + 'ezcDocumentPdfLiteralBlockRenderer' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/renderer/literal_block.php', + 'ezcDocumentPdfLiteralTokenizer' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/tokenizer/literal.php', + 'ezcDocumentPdfMainRenderer' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/renderer/main.php', + 'ezcDocumentPdfMediaObjectRenderer' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/renderer/mediaobject.php', + 'ezcDocumentPdfOptions' => __DIR__ . '/..' . '/zetacomponents/document/src/options/document_pdf.php', + 'ezcDocumentPdfPage' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/page.php', + 'ezcDocumentPdfPart' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/part.php', + 'ezcDocumentPdfPhpImageHandler' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/image/php.php', + 'ezcDocumentPdfRenderer' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/renderer.php', + 'ezcDocumentPdfSvgDriver' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/driver/svg.php', + 'ezcDocumentPdfTableColumnWidthCalculator' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/table_column_width_calculator.php', + 'ezcDocumentPdfTableRenderer' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/renderer/table.php', + 'ezcDocumentPdfTcpdfDriver' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/driver/tcpdf.php', + 'ezcDocumentPdfTextBlockRenderer' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/renderer/text_block.php', + 'ezcDocumentPdfTextBoxRenderer' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/renderer/text_box.php', + 'ezcDocumentPdfTitleRenderer' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/renderer/title.php', + 'ezcDocumentPdfTokenizer' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/tokenizer.php', + 'ezcDocumentPdfTransactionalDriverWrapper' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/driver/wrapper.php', + 'ezcDocumentPdfTransactionalDriverWrapperState' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/driver/wrapper_state.php', + 'ezcDocumentPdfWrappingTextBoxRenderer' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/renderer/paragraph.php', + 'ezcDocumentPropertyContainerDomElement' => __DIR__ . '/..' . '/zetacomponents/document/src/dom_elements/property_container.php', + 'ezcDocumentRomanListItemGenerator' => __DIR__ . '/..' . '/zetacomponents/document/src/document/pdf/item_generator/roman.php', + 'ezcDocumentRst' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst.php', + 'ezcDocumentRstAnonymousLinkNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/link_anonymous.php', + 'ezcDocumentRstAnonymousReferenceNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/anon_reference.php', + 'ezcDocumentRstAttentionDirective' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/directive/attention.php', + 'ezcDocumentRstBlockNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/block.php', + 'ezcDocumentRstBlockquoteAnnotationNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/blockquote_annotation.php', + 'ezcDocumentRstBlockquoteNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/blockquote.php', + 'ezcDocumentRstBulletListListNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/bullet_list_list.php', + 'ezcDocumentRstBulletListNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/bullet_list.php', + 'ezcDocumentRstCommentNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/comment.php', + 'ezcDocumentRstContentsDirective' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/directive/contents.php', + 'ezcDocumentRstDangerDirective' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/directive/danger.php', + 'ezcDocumentRstDefinitionListListNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/definition_list_list.php', + 'ezcDocumentRstDefinitionListNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/definition_list.php', + 'ezcDocumentRstDirective' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/directive.php', + 'ezcDocumentRstDirectiveNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/directive.php', + 'ezcDocumentRstDocbookVisitor' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/visitor/docbook.php', + 'ezcDocumentRstDocumentNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/document.php', + 'ezcDocumentRstEmphasisTextRole' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/role/emphasis.php', + 'ezcDocumentRstEnumeratedListListNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/enumerated_list_list.php', + 'ezcDocumentRstEnumeratedListNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/enumerated_list.php', + 'ezcDocumentRstExternalReferenceNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/link_reference.php', + 'ezcDocumentRstFieldListNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/field_list.php', + 'ezcDocumentRstFigureDirective' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/directive/figure.php', + 'ezcDocumentRstFootnoteNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/footnote.php', + 'ezcDocumentRstImageDirective' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/directive/image.php', + 'ezcDocumentRstIncludeDirective' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/directive/include.php', + 'ezcDocumentRstLineBlockLineNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/line_block_line.php', + 'ezcDocumentRstLineBlockNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/line_block.php', + 'ezcDocumentRstLinkNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/link.php', + 'ezcDocumentRstLiteralBlockNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/literal_block.php', + 'ezcDocumentRstLiteralNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/literal.php', + 'ezcDocumentRstLiteralTextRole' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/role/literal.php', + 'ezcDocumentRstMarkupEmphasisNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/markup_emphasis.php', + 'ezcDocumentRstMarkupInlineLiteralNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/markup_inline_literal.php', + 'ezcDocumentRstMarkupInterpretedTextNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/markup_interpreted_text.php', + 'ezcDocumentRstMarkupNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/markup.php', + 'ezcDocumentRstMarkupStrongEmphasisNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/markup_strong_emphasis.php', + 'ezcDocumentRstMarkupSubstitutionNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/markup_substitution.php', + 'ezcDocumentRstMissingDirectiveHandlerException' => __DIR__ . '/..' . '/zetacomponents/document/src/exceptions/missing_directive_handler.php', + 'ezcDocumentRstMissingTextRoleHandlerException' => __DIR__ . '/..' . '/zetacomponents/document/src/exceptions/missing_text_role_handler.php', + 'ezcDocumentRstNamedReferenceNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/named_reference.php', + 'ezcDocumentRstNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/node.php', + 'ezcDocumentRstNoteDirective' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/directive/note.php', + 'ezcDocumentRstNoticeDirective' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/directive/notice.php', + 'ezcDocumentRstOptions' => __DIR__ . '/..' . '/zetacomponents/document/src/options/document_rst.php', + 'ezcDocumentRstParagraphNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/paragraph.php', + 'ezcDocumentRstParser' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/parser.php', + 'ezcDocumentRstReferenceNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/reference.php', + 'ezcDocumentRstSectionNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/section.php', + 'ezcDocumentRstStack' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/document_stack.php', + 'ezcDocumentRstStrongTextRole' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/role/strong.php', + 'ezcDocumentRstSubscriptTextRole' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/role/subscript.php', + 'ezcDocumentRstSubstitutionNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/substitution.php', + 'ezcDocumentRstSuperscriptTextRole' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/role/superscript.php', + 'ezcDocumentRstTableBodyNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/table_body.php', + 'ezcDocumentRstTableCellNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/table_cell.php', + 'ezcDocumentRstTableHeadNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/table_head.php', + 'ezcDocumentRstTableNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/table.php', + 'ezcDocumentRstTableRowNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/table_row.php', + 'ezcDocumentRstTargetNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/target.php', + 'ezcDocumentRstTextLineNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/text_line.php', + 'ezcDocumentRstTextRole' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/role.php', + 'ezcDocumentRstTitleNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/title.php', + 'ezcDocumentRstTitleReferenceTextRole' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/role/title_reference.php', + 'ezcDocumentRstToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/token.php', + 'ezcDocumentRstTokenizer' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/tokenizer.php', + 'ezcDocumentRstTokenizerException' => __DIR__ . '/..' . '/zetacomponents/document/src/exceptions/rst_tokenizer.php', + 'ezcDocumentRstTransitionNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/nodes/transition.php', + 'ezcDocumentRstVisitor' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/visitor.php', + 'ezcDocumentRstWarningDirective' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/directive/warning.php', + 'ezcDocumentRstXhtmlBodyVisitor' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/visitor/xhtml_body.php', + 'ezcDocumentRstXhtmlDirective' => __DIR__ . '/..' . '/zetacomponents/document/src/interfaces/rst_xhtml_directive.php', + 'ezcDocumentRstXhtmlTextRole' => __DIR__ . '/..' . '/zetacomponents/document/src/interfaces/rst_xhtml_role.php', + 'ezcDocumentRstXhtmlVisitor' => __DIR__ . '/..' . '/zetacomponents/document/src/document/rst/visitor/xhtml.php', + 'ezcDocumentValidation' => __DIR__ . '/..' . '/zetacomponents/document/src/interfaces/validation.php', + 'ezcDocumentValidationError' => __DIR__ . '/..' . '/zetacomponents/document/src/validation_error.php', + 'ezcDocumentVisitException' => __DIR__ . '/..' . '/zetacomponents/document/src/exceptions/visitor.php', + 'ezcDocumentWiki' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki.php', + 'ezcDocumentWikiBlockLevelNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/block.php', + 'ezcDocumentWikiBlockMarkupToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/block_markup.php', + 'ezcDocumentWikiBlockquoteNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/blockquote.php', + 'ezcDocumentWikiBoldNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/bold.php', + 'ezcDocumentWikiBoldToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/bold.php', + 'ezcDocumentWikiBulletListItemNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/bullet_list_item.php', + 'ezcDocumentWikiBulletListItemToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/bullet_list.php', + 'ezcDocumentWikiBulletListNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/bullet_list.php', + 'ezcDocumentWikiCodePlugin' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/plugin/code.php', + 'ezcDocumentWikiConfluenceLinkStartToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/confluence_link_start.php', + 'ezcDocumentWikiConfluenceTokenizer' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/tokenizer/confluence.php', + 'ezcDocumentWikiCreoleTokenizer' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/tokenizer/creole.php', + 'ezcDocumentWikiDefinitionListItemToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/definition_list.php', + 'ezcDocumentWikiDeletedNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/deleted.php', + 'ezcDocumentWikiDeletedToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/deleted.php', + 'ezcDocumentWikiDocbookVisitor' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/visitor/docbook.php', + 'ezcDocumentWikiDocumentNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/document.php', + 'ezcDocumentWikiDokuwikiTokenizer' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/tokenizer/dokuwiki.php', + 'ezcDocumentWikiEndOfFileToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/end_of_file.php', + 'ezcDocumentWikiEnumeratedListItemNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/enumerated_list_item.php', + 'ezcDocumentWikiEnumeratedListItemToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/enumerated_list.php', + 'ezcDocumentWikiEnumeratedListNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/enumerated_list.php', + 'ezcDocumentWikiEscapeCharacterToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/escape_character.php', + 'ezcDocumentWikiExternalLinkNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/external_link.php', + 'ezcDocumentWikiExternalLinkToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/external_link.php', + 'ezcDocumentWikiFootnoteEndNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/footnote_end.php', + 'ezcDocumentWikiFootnoteEndToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/footnote_end.php', + 'ezcDocumentWikiFootnoteNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/footnote.php', + 'ezcDocumentWikiFootnoteStartToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/footnote_start.php', + 'ezcDocumentWikiImageEndNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/image_end.php', + 'ezcDocumentWikiImageEndToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/image_end.php', + 'ezcDocumentWikiImageNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/image.php', + 'ezcDocumentWikiImageStartToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/image_start.php', + 'ezcDocumentWikiInlineLiteralNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/inline_literal.php', + 'ezcDocumentWikiInlineLiteralToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/inline_literal.php', + 'ezcDocumentWikiInlineMarkupToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/inline_markup.php', + 'ezcDocumentWikiInlineNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/inline.php', + 'ezcDocumentWikiInlineQuoteNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/inline_quote.php', + 'ezcDocumentWikiInlineQuoteToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/inline_quote.php', + 'ezcDocumentWikiInterWikiLinkNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/inter_wiki_link.php', + 'ezcDocumentWikiInterWikiLinkToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/inter_wiki_link.php', + 'ezcDocumentWikiInternalLinkNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/internal_link.php', + 'ezcDocumentWikiInternalLinkToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/internal_link.php', + 'ezcDocumentWikiInvisibleBreakNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/invisible_break.php', + 'ezcDocumentWikiItalicNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/italic.php', + 'ezcDocumentWikiItalicToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/italic.php', + 'ezcDocumentWikiLineBreakNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/line_break.php', + 'ezcDocumentWikiLineBreakToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/line_break.php', + 'ezcDocumentWikiLineLevelNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/line.php', + 'ezcDocumentWikiLineMarkupToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/line_markup.php', + 'ezcDocumentWikiLinkEndNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/link_end.php', + 'ezcDocumentWikiLinkEndToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/link_end.php', + 'ezcDocumentWikiLinkNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/link.php', + 'ezcDocumentWikiLinkStartToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/link_start.php', + 'ezcDocumentWikiListNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/list.php', + 'ezcDocumentWikiLiteralBlockNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/literal_block.php', + 'ezcDocumentWikiLiteralBlockToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/literal_block.php', + 'ezcDocumentWikiLiteralLineToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/literal_line.php', + 'ezcDocumentWikiMatchingInlineNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/matching_inline.php', + 'ezcDocumentWikiMediawikiEmphasisToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/mediawiki_emphasis.php', + 'ezcDocumentWikiMediawikiTokenizer' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/tokenizer/mediawiki.php', + 'ezcDocumentWikiMissingPluginHandlerException' => __DIR__ . '/..' . '/zetacomponents/document/src/exceptions/missing_plugin_handler.php', + 'ezcDocumentWikiMonospaceNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/monospace.php', + 'ezcDocumentWikiMonospaceToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/monospace.php', + 'ezcDocumentWikiNewLineToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/new_line.php', + 'ezcDocumentWikiNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/node.php', + 'ezcDocumentWikiOptions' => __DIR__ . '/..' . '/zetacomponents/document/src/options/document_wiki.php', + 'ezcDocumentWikiPageBreakNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/page_break.php', + 'ezcDocumentWikiPageBreakToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/page_break.php', + 'ezcDocumentWikiParagraphIndentationToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/indentation.php', + 'ezcDocumentWikiParagraphNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/paragraph.php', + 'ezcDocumentWikiParser' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/parser.php', + 'ezcDocumentWikiPlugin' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/plugin.php', + 'ezcDocumentWikiPluginNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/plugin.php', + 'ezcDocumentWikiPluginToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/plugin.php', + 'ezcDocumentWikiQuoteToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/quote.php', + 'ezcDocumentWikiSectionNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/section.php', + 'ezcDocumentWikiSeparatorNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/separator.php', + 'ezcDocumentWikiSeparatorToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/separator.php', + 'ezcDocumentWikiSpecialCharsToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/special_chars.php', + 'ezcDocumentWikiStrikeToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/strike.php', + 'ezcDocumentWikiSubscriptNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/subscript.php', + 'ezcDocumentWikiSubscriptToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/subscript.php', + 'ezcDocumentWikiSuperscriptNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/superscript.php', + 'ezcDocumentWikiSuperscriptToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/superscript.php', + 'ezcDocumentWikiTableCellNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/table_cell.php', + 'ezcDocumentWikiTableHeaderSeparatorNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/table_header_separator.php', + 'ezcDocumentWikiTableHeaderToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/table_header.php', + 'ezcDocumentWikiTableNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/table.php', + 'ezcDocumentWikiTableRowNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/table_row.php', + 'ezcDocumentWikiTableRowToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/table_row.php', + 'ezcDocumentWikiTextLineToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/text_line.php', + 'ezcDocumentWikiTextNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/text.php', + 'ezcDocumentWikiTitleNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/title.php', + 'ezcDocumentWikiTitleToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/title.php', + 'ezcDocumentWikiToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token.php', + 'ezcDocumentWikiTokenizer' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/tokenizer.php', + 'ezcDocumentWikiTokenizerException' => __DIR__ . '/..' . '/zetacomponents/document/src/exceptions/wiki_tokenizer.php', + 'ezcDocumentWikiUnderlineNode' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/nodes/underline.php', + 'ezcDocumentWikiUnderlineToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/underline.php', + 'ezcDocumentWikiVisitor' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/visitor.php', + 'ezcDocumentWikiWhitespaceToken' => __DIR__ . '/..' . '/zetacomponents/document/src/document/wiki/token/whitespace.php', + 'ezcDocumentXhtml' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/xhtml.php', + 'ezcDocumentXhtmlBaseFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/xhtml/filter/base.php', + 'ezcDocumentXhtmlBlockquoteElementFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/xhtml/filter/element/blockquote.php', + 'ezcDocumentXhtmlContentLocatorFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/xhtml/filter/content_locator.php', + 'ezcDocumentXhtmlConversion' => __DIR__ . '/..' . '/zetacomponents/document/src/interfaces/conversions/xhtml.php', + 'ezcDocumentXhtmlDefinitionListElementFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/xhtml/filter/element/definitionlist.php', + 'ezcDocumentXhtmlElementBaseFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/xhtml/filter/element/base.php', + 'ezcDocumentXhtmlElementFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/xhtml/filter/element.php', + 'ezcDocumentXhtmlElementMappingFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/xhtml/filter/element/mapping.php', + 'ezcDocumentXhtmlEnumeratedElementFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/xhtml/filter/element/enumerated.php', + 'ezcDocumentXhtmlFootnoteElementFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/xhtml/filter/element/footnote.php', + 'ezcDocumentXhtmlHeaderElementFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/xhtml/filter/element/header.php', + 'ezcDocumentXhtmlImageElementFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/xhtml/filter/element/image.php', + 'ezcDocumentXhtmlLineBlockElementFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/xhtml/filter/element/lineblock.php', + 'ezcDocumentXhtmlLinkElementFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/xhtml/filter/element/link.php', + 'ezcDocumentXhtmlLiteralElementFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/xhtml/filter/element/literal.php', + 'ezcDocumentXhtmlMetadataFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/xhtml/filter/metadata.php', + 'ezcDocumentXhtmlOptions' => __DIR__ . '/..' . '/zetacomponents/document/src/options/document_xhtml.php', + 'ezcDocumentXhtmlParagraphElementFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/xhtml/filter/element/paragraph.php', + 'ezcDocumentXhtmlSpecialParagraphElementFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/xhtml/filter/element/special_paragraph.php', + 'ezcDocumentXhtmlStrongElementFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/xhtml/filter/element/strong.php', + 'ezcDocumentXhtmlTableCellElementFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/xhtml/filter/element/tablecell.php', + 'ezcDocumentXhtmlTableElementFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/xhtml/filter/element/table.php', + 'ezcDocumentXhtmlTablesFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/xhtml/filter/tables.php', + 'ezcDocumentXhtmlTextToParagraphFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/xhtml/filter/element/text.php', + 'ezcDocumentXhtmlXpathFilter' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml/xhtml/filter/xpath.php', + 'ezcDocumentXmlBase' => __DIR__ . '/..' . '/zetacomponents/document/src/document/xml_base.php', + 'ezcDocumentXmlOptions' => __DIR__ . '/..' . '/zetacomponents/document/src/options/document_xml.php', + 'ezcDocumentXsltConverter' => __DIR__ . '/..' . '/zetacomponents/document/src/converters/xslt.php', + 'ezcDocumentXsltConverterOptions' => __DIR__ . '/..' . '/zetacomponents/document/src/options/converter_xslt.php', 'phpCAS' => __DIR__ . '/..' . '/apereo/phpcas/source/CAS.php', + 'phpDocumentor\\Application' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Application.php', + 'phpDocumentor\\Bootstrap' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Bootstrap.php', + 'phpDocumentor\\Command\\Command' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Command/Command.php', + 'phpDocumentor\\Command\\Helper\\ConfigurationHelper' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Command/Helper/ConfigurationHelper.php', + 'phpDocumentor\\Command\\Helper\\LoggerHelper' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Command/Helper/LoggerHelper.php', + 'phpDocumentor\\Command\\Phar\\UpdateCommand' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Command/Phar/UpdateCommand.php', + 'phpDocumentor\\Command\\Project\\RunCommand' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Command/Project/RunCommand.php', + 'phpDocumentor\\Compiler\\Compiler' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Compiler/Compiler.php', + 'phpDocumentor\\Compiler\\CompilerPassInterface' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Compiler/CompilerPassInterface.php', + 'phpDocumentor\\Compiler\\Linker\\Linker' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Compiler/Linker/Linker.php', + 'phpDocumentor\\Compiler\\Pass\\Debug' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Compiler/Pass/Debug.php', + 'phpDocumentor\\Compiler\\Pass\\ElementsIndexBuilder' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Compiler/Pass/ElementsIndexBuilder.php', + 'phpDocumentor\\Compiler\\Pass\\ExampleTagsEnricher' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Compiler/Pass/ExampleTagsEnricher.php', + 'phpDocumentor\\Compiler\\Pass\\MarkerFromTagsExtractor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Compiler/Pass/MarkerFromTagsExtractor.php', + 'phpDocumentor\\Compiler\\Pass\\NamespaceTreeBuilder' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Compiler/Pass/NamespaceTreeBuilder.php', + 'phpDocumentor\\Compiler\\Pass\\PackageTreeBuilder' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Compiler/Pass/PackageTreeBuilder.php', + 'phpDocumentor\\Compiler\\Pass\\ResolveInlineLinkAndSeeTags' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Compiler/Pass/ResolveInlineLinkAndSeeTags.php', + 'phpDocumentor\\Configuration' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Configuration.php', + 'phpDocumentor\\Configuration\\Loader' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Configuration/Loader.php', + 'phpDocumentor\\Configuration\\Logging' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Configuration/Logging.php', + 'phpDocumentor\\Configuration\\Merger' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Configuration/Merger.php', + 'phpDocumentor\\Configuration\\Merger\\Annotation\\Replace' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Configuration/Merger/Annotation/Replace.php', + 'phpDocumentor\\Configuration\\ServiceProvider' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Configuration/ServiceProvider.php', + 'phpDocumentor\\Console\\Input\\ArgvInput' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Console/Input/ArgvInput.php', + 'phpDocumentor\\Console\\Output\\Output' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Console/Output/Output.php', + 'phpDocumentor\\Descriptor\\ArgumentDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/ArgumentDescriptor.php', + 'phpDocumentor\\Descriptor\\Builder\\AssemblerAbstract' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/AssemblerAbstract.php', + 'phpDocumentor\\Descriptor\\Builder\\AssemblerFactory' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/AssemblerFactory.php', + 'phpDocumentor\\Descriptor\\Builder\\AssemblerInterface' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/AssemblerInterface.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\ArgumentAssembler' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/ArgumentAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\AssemblerAbstract' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/AssemblerAbstract.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\ClassAssembler' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/ClassAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\ConstantAssembler' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/ConstantAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\FileAssembler' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/FileAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\FunctionAssembler' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/FunctionAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\InterfaceAssembler' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/InterfaceAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\MethodAssembler' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/MethodAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\PropertyAssembler' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/PropertyAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\Tags\\AuthorAssembler' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/Tags/AuthorAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\Tags\\DeprecatedAssembler' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/Tags/DeprecatedAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\Tags\\ExampleAssembler' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/Tags/ExampleAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\Tags\\GenericTagAssembler' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/Tags/GenericTagAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\Tags\\LinkAssembler' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/Tags/LinkAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\Tags\\MethodAssembler' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/Tags/MethodAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\Tags\\ParamAssembler' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/Tags/ParamAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\Tags\\PropertyAssembler' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/Tags/PropertyAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\Tags\\ReturnAssembler' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/Tags/ReturnAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\Tags\\SeeAssembler' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/Tags/SeeAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\Tags\\SinceAssembler' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/Tags/SinceAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\Tags\\ThrowsAssembler' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/Tags/ThrowsAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\Tags\\TypeCollectionAssembler' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/Tags/TypeCollectionAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\Tags\\UsesAssembler' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/Tags/UsesAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\Tags\\VarAssembler' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/Tags/VarAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\Tags\\VersionAssembler' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/Tags/VersionAssembler.php', + 'phpDocumentor\\Descriptor\\Builder\\Reflector\\TraitAssembler' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Builder/Reflector/TraitAssembler.php', + 'phpDocumentor\\Descriptor\\Cache\\ProjectDescriptorMapper' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Cache/ProjectDescriptorMapper.php', + 'phpDocumentor\\Descriptor\\ClassDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/ClassDescriptor.php', + 'phpDocumentor\\Descriptor\\Collection' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Collection.php', + 'phpDocumentor\\Descriptor\\ConstantDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/ConstantDescriptor.php', + 'phpDocumentor\\Descriptor\\DescriptorAbstract' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/DescriptorAbstract.php', + 'phpDocumentor\\Descriptor\\Example\\Finder' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Example/Finder.php', + 'phpDocumentor\\Descriptor\\Exception\\MissingDependencyException' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Exception/MissingDependencyException.php', + 'phpDocumentor\\Descriptor\\FileDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/FileDescriptor.php', + 'phpDocumentor\\Descriptor\\Filter\\ClassFactory' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Filter/ClassFactory.php', + 'phpDocumentor\\Descriptor\\Filter\\Filter' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Filter/Filter.php', + 'phpDocumentor\\Descriptor\\Filter\\Filterable' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Filter/Filterable.php', + 'phpDocumentor\\Descriptor\\Filter\\StripIgnore' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Filter/StripIgnore.php', + 'phpDocumentor\\Descriptor\\Filter\\StripInternal' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Filter/StripInternal.php', + 'phpDocumentor\\Descriptor\\Filter\\StripOnVisibility' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Filter/StripOnVisibility.php', + 'phpDocumentor\\Descriptor\\FunctionDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/FunctionDescriptor.php', + 'phpDocumentor\\Descriptor\\InterfaceDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/InterfaceDescriptor.php', + 'phpDocumentor\\Descriptor\\Interfaces\\ArgumentInterface' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Interfaces/ArgumentInterface.php', + 'phpDocumentor\\Descriptor\\Interfaces\\ChildInterface' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Interfaces/ChildInterface.php', + 'phpDocumentor\\Descriptor\\Interfaces\\ClassInterface' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Interfaces/ClassInterface.php', + 'phpDocumentor\\Descriptor\\Interfaces\\ConstantInterface' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Interfaces/ConstantInterface.php', + 'phpDocumentor\\Descriptor\\Interfaces\\ContainerInterface' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Interfaces/ContainerInterface.php', + 'phpDocumentor\\Descriptor\\Interfaces\\ElementInterface' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Interfaces/ElementInterface.php', + 'phpDocumentor\\Descriptor\\Interfaces\\FileInterface' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Interfaces/FileInterface.php', + 'phpDocumentor\\Descriptor\\Interfaces\\FunctionInterface' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Interfaces/FunctionInterface.php', + 'phpDocumentor\\Descriptor\\Interfaces\\InterfaceInterface' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Interfaces/InterfaceInterface.php', + 'phpDocumentor\\Descriptor\\Interfaces\\MethodInterface' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Interfaces/MethodInterface.php', + 'phpDocumentor\\Descriptor\\Interfaces\\NamespaceInterface' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Interfaces/NamespaceInterface.php', + 'phpDocumentor\\Descriptor\\Interfaces\\PackageInterface' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Interfaces/PackageInterface.php', + 'phpDocumentor\\Descriptor\\Interfaces\\ProjectInterface' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Interfaces/ProjectInterface.php', + 'phpDocumentor\\Descriptor\\Interfaces\\PropertyInterface' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Interfaces/PropertyInterface.php', + 'phpDocumentor\\Descriptor\\Interfaces\\TraitInterface' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Interfaces/TraitInterface.php', + 'phpDocumentor\\Descriptor\\Interfaces\\TypeInterface' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Interfaces/TypeInterface.php', + 'phpDocumentor\\Descriptor\\Interfaces\\VisibilityInterface' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Interfaces/VisibilityInterface.php', + 'phpDocumentor\\Descriptor\\MethodDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/MethodDescriptor.php', + 'phpDocumentor\\Descriptor\\NamespaceDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/NamespaceDescriptor.php', + 'phpDocumentor\\Descriptor\\PackageDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/PackageDescriptor.php', + 'phpDocumentor\\Descriptor\\ProjectAnalyzer' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/ProjectAnalyzer.php', + 'phpDocumentor\\Descriptor\\ProjectDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/ProjectDescriptor.php', + 'phpDocumentor\\Descriptor\\ProjectDescriptorBuilder' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/ProjectDescriptorBuilder.php', + 'phpDocumentor\\Descriptor\\ProjectDescriptor\\Settings' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/ProjectDescriptor/Settings.php', + 'phpDocumentor\\Descriptor\\PropertyDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/PropertyDescriptor.php', + 'phpDocumentor\\Descriptor\\ServiceProvider' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/ServiceProvider.php', + 'phpDocumentor\\Descriptor\\TagDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/TagDescriptor.php', + 'phpDocumentor\\Descriptor\\Tag\\AuthorDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Tag/AuthorDescriptor.php', + 'phpDocumentor\\Descriptor\\Tag\\BaseTypes\\TypedAbstract' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Tag/BaseTypes/TypedAbstract.php', + 'phpDocumentor\\Descriptor\\Tag\\BaseTypes\\TypedVariableAbstract' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Tag/BaseTypes/TypedVariableAbstract.php', + 'phpDocumentor\\Descriptor\\Tag\\DeprecatedDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Tag/DeprecatedDescriptor.php', + 'phpDocumentor\\Descriptor\\Tag\\ExampleDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Tag/ExampleDescriptor.php', + 'phpDocumentor\\Descriptor\\Tag\\LinkDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Tag/LinkDescriptor.php', + 'phpDocumentor\\Descriptor\\Tag\\MethodDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Tag/MethodDescriptor.php', + 'phpDocumentor\\Descriptor\\Tag\\ParamDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Tag/ParamDescriptor.php', + 'phpDocumentor\\Descriptor\\Tag\\PropertyDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Tag/PropertyDescriptor.php', + 'phpDocumentor\\Descriptor\\Tag\\ReturnDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Tag/ReturnDescriptor.php', + 'phpDocumentor\\Descriptor\\Tag\\SeeDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Tag/SeeDescriptor.php', + 'phpDocumentor\\Descriptor\\Tag\\SinceDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Tag/SinceDescriptor.php', + 'phpDocumentor\\Descriptor\\Tag\\ThrowsDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Tag/ThrowsDescriptor.php', + 'phpDocumentor\\Descriptor\\Tag\\UsesDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Tag/UsesDescriptor.php', + 'phpDocumentor\\Descriptor\\Tag\\VarDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Tag/VarDescriptor.php', + 'phpDocumentor\\Descriptor\\Tag\\VersionDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Tag/VersionDescriptor.php', + 'phpDocumentor\\Descriptor\\TraitDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/TraitDescriptor.php', + 'phpDocumentor\\Descriptor\\Type\\BooleanDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Type/BooleanDescriptor.php', + 'phpDocumentor\\Descriptor\\Type\\CollectionDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Type/CollectionDescriptor.php', + 'phpDocumentor\\Descriptor\\Type\\FloatDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Type/FloatDescriptor.php', + 'phpDocumentor\\Descriptor\\Type\\IntegerDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Type/IntegerDescriptor.php', + 'phpDocumentor\\Descriptor\\Type\\StringDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Type/StringDescriptor.php', + 'phpDocumentor\\Descriptor\\Type\\UnknownTypeDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Type/UnknownTypeDescriptor.php', + 'phpDocumentor\\Descriptor\\Validator\\Error' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Descriptor/Validator/Error.php', + 'phpDocumentor\\Event\\DebugEvent' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Event/DebugEvent.php', + 'phpDocumentor\\Event\\Dispatcher' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Event/Dispatcher.php', + 'phpDocumentor\\Event\\EventAbstract' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Event/EventAbstract.php', + 'phpDocumentor\\Event\\LogEvent' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Event/LogEvent.php', + 'phpDocumentor\\Fileset\\Collection' => __DIR__ . '/..' . '/phpdocumentor/fileset/src/phpDocumentor/Fileset/Collection.php', + 'phpDocumentor\\Fileset\\CollectionTest' => __DIR__ . '/..' . '/phpdocumentor/fileset/tests/unit/phpDocumentor/Fileset/CollectionTest.php', + 'phpDocumentor\\Fileset\\Collection\\IgnorePatterns' => __DIR__ . '/..' . '/phpdocumentor/fileset/src/phpDocumentor/Fileset/Collection/IgnorePatterns.php', + 'phpDocumentor\\Fileset\\Collection\\IgnorePatternsTest' => __DIR__ . '/..' . '/phpdocumentor/fileset/tests/unit/phpDocumentor/Fileset/Collection/IgnorePatternsTest.php', + 'phpDocumentor\\Fileset\\File' => __DIR__ . '/..' . '/phpdocumentor/fileset/src/phpDocumentor/Fileset/File.php', + 'phpDocumentor\\Fileset\\FileTest' => __DIR__ . '/..' . '/phpdocumentor/fileset/tests/unit/phpDocumentor/Fileset/FileTest.php', + 'phpDocumentor\\GraphViz\\Attribute' => __DIR__ . '/..' . '/phpdocumentor/graphviz/src/phpDocumentor/GraphViz/Attribute.php', + 'phpDocumentor\\GraphViz\\Edge' => __DIR__ . '/..' . '/phpdocumentor/graphviz/src/phpDocumentor/GraphViz/Edge.php', + 'phpDocumentor\\GraphViz\\Exception' => __DIR__ . '/..' . '/phpdocumentor/graphviz/src/phpDocumentor/GraphViz/Exception.php', + 'phpDocumentor\\GraphViz\\Graph' => __DIR__ . '/..' . '/phpdocumentor/graphviz/src/phpDocumentor/GraphViz/Graph.php', + 'phpDocumentor\\GraphViz\\Node' => __DIR__ . '/..' . '/phpdocumentor/graphviz/src/phpDocumentor/GraphViz/Node.php', + 'phpDocumentor\\Parser\\Command\\Project\\ParseCommand' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Parser/Command/Project/ParseCommand.php', + 'phpDocumentor\\Parser\\Configuration' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Parser/Configuration.php', + 'phpDocumentor\\Parser\\Configuration\\Files' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Parser/Configuration/Files.php', + 'phpDocumentor\\Parser\\Event\\PreFileEvent' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Parser/Event/PreFileEvent.php', + 'phpDocumentor\\Parser\\Exception' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Parser/Exception.php', + 'phpDocumentor\\Parser\\Exception\\FilesNotFoundException' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Parser/Exception/FilesNotFoundException.php', + 'phpDocumentor\\Parser\\Exception\\MissingDependencyException' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Parser/Exception/MissingDependencyException.php', + 'phpDocumentor\\Parser\\File' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Parser/File.php', + 'phpDocumentor\\Parser\\Parser' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Parser/Parser.php', + 'phpDocumentor\\Parser\\ServiceProvider' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Parser/ServiceProvider.php', + 'phpDocumentor\\Parser\\Util\\ParserPopulator' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Parser/Util/ParserPopulator.php', + 'phpDocumentor\\Partials\\Collection' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Partials/Collection.php', + 'phpDocumentor\\Partials\\Exception\\MissingNameForPartialException' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Partials/Exception/MissingNameForPartialException.php', + 'phpDocumentor\\Partials\\Partial' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Partials/Partial.php', + 'phpDocumentor\\Partials\\ServiceProvider' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Partials/ServiceProvider.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Classes\\HasPackageWithSubpackage' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Classes/HasPackageWithSubpackage.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Classes\\HasPackageWithSubpackageValidator' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Classes/HasPackageWithSubpackageValidator.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Classes\\HasSinglePackage' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Classes/HasSinglePackage.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Classes\\HasSinglePackageValidator' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Classes/HasSinglePackageValidator.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Classes\\HasSingleSubpackage' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Classes/HasSingleSubpackage.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Classes\\HasSingleSubpackageValidator' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Classes/HasSingleSubpackageValidator.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Functions\\AreAllArgumentsValid' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Functions/AreAllArgumentsValid.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Functions\\AreAllArgumentsValidValidator' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Functions/AreAllArgumentsValidValidator.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Functions\\DoesArgumentNameMatchParam' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Functions/DoesArgumentNameMatchParam.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Functions\\DoesArgumentNameMatchParamValidator' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Functions/DoesArgumentNameMatchParamValidator.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Functions\\DoesArgumentTypehintMatchParam' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Functions/DoesArgumentTypehintMatchParam.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Functions\\DoesArgumentTypehintMatchParamValidator' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Functions/DoesArgumentTypehintMatchParamValidator.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Functions\\DoesParamsExists' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Functions/DoesParamsExists.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Functions\\DoesParamsExistsValidator' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Functions/DoesParamsExistsValidator.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Functions\\IsArgumentInDocBlock' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Functions/IsArgumentInDocBlock.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Functions\\IsArgumentInDocBlockValidator' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Functions/IsArgumentInDocBlockValidator.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Functions\\IsParamTypeNotAnIdeDefault' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Functions/IsParamTypeNotAnIdeDefault.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Functions\\IsParamTypeNotAnIdeDefaultValidator' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Functions/IsParamTypeNotAnIdeDefaultValidator.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Functions\\IsReturnTypeNotAnIdeDefault' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Functions/IsReturnTypeNotAnIdeDefault.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Functions\\IsReturnTypeNotAnIdeDefaultValidator' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Functions/IsReturnTypeNotAnIdeDefaultValidator.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Property\\HasSummary' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Property/HasSummary.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Constraints\\Property\\HasSummaryValidator' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Constraints/Property/HasSummaryValidator.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\Functions\\AreAllArgumentsValid' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/Functions/AreAllArgumentsValid.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\ValidationValueObject' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/ValidationValueObject.php', + 'phpDocumentor\\Plugin\\Core\\Descriptor\\Validator\\ValidatorAbstract' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Descriptor/Validator/ValidatorAbstract.php', + 'phpDocumentor\\Plugin\\Core\\Exception' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Exception.php', + 'phpDocumentor\\Plugin\\Core\\ServiceProvider' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/ServiceProvider.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Behaviour\\Tag\\AuthorTag' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Behaviour/Tag/AuthorTag.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Behaviour\\Tag\\CoversTag' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Behaviour/Tag/CoversTag.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Behaviour\\Tag\\IgnoreTag' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Behaviour/Tag/IgnoreTag.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Behaviour\\Tag\\InternalTag' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Behaviour/Tag/InternalTag.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Behaviour\\Tag\\LicenseTag' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Behaviour/Tag/LicenseTag.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Behaviour\\Tag\\MethodTag' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Behaviour/Tag/MethodTag.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Behaviour\\Tag\\ParamTag' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Behaviour/Tag/ParamTag.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Behaviour\\Tag\\PropertyTag' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Behaviour/Tag/PropertyTag.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Behaviour\\Tag\\ReturnTag' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Behaviour/Tag/ReturnTag.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Behaviour\\Tag\\UsesTag' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Behaviour/Tag/UsesTag.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Behaviour\\Tag\\VarTag' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Behaviour/Tag/VarTag.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Writer\\Checkstyle' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Writer/Checkstyle.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Writer\\FileIo' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Writer/FileIo.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Writer\\Pathfinder' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Writer/Pathfinder.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Writer\\Sourcecode' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Writer/Sourcecode.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Writer\\Statistics' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Writer/Statistics.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Writer\\Xml' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Writer/Xml.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Writer\\Xml\\ArgumentConverter' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Writer/Xml/ArgumentConverter.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Writer\\Xml\\ConstantConverter' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Writer/Xml/ConstantConverter.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Writer\\Xml\\DocBlockConverter' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Writer/Xml/DocBlockConverter.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Writer\\Xml\\InterfaceConverter' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Writer/Xml/InterfaceConverter.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Writer\\Xml\\MethodConverter' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Writer/Xml/MethodConverter.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Writer\\Xml\\PropertyConverter' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Writer/Xml/PropertyConverter.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Writer\\Xml\\TagConverter' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Writer/Xml/TagConverter.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Writer\\Xml\\TraitConverter' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Writer/Xml/TraitConverter.php', + 'phpDocumentor\\Plugin\\Core\\Transformer\\Writer\\Xsl' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Transformer/Writer/Xsl.php', + 'phpDocumentor\\Plugin\\Core\\Xslt\\Extension' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Core/Xslt/Extension.php', + 'phpDocumentor\\Plugin\\Graphs\\ServiceProvider' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Graphs/ServiceProvider.php', + 'phpDocumentor\\Plugin\\Graphs\\Writer\\Graph' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Graphs/Writer/Graph.php', + 'phpDocumentor\\Plugin\\LegacyNamespaceConverter\\LegacyNamespaceFilter' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/LegacyNamespaceConverter/LegacyNamespaceFilter.php', + 'phpDocumentor\\Plugin\\LegacyNamespaceConverter\\ServiceProvider' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/LegacyNamespaceConverter/ServiceProvider.php', + 'phpDocumentor\\Plugin\\LegacyNamespaceConverter\\Tests\\LegacyNamespaceFilterTest' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/LegacyNamespaceConverter/Tests/LegacyNamespaceFilterTest.php', + 'phpDocumentor\\Plugin\\Parameter' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Parameter.php', + 'phpDocumentor\\Plugin\\Plugin' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Plugin.php', + 'phpDocumentor\\Plugin\\Scrybe\\Command\\Manual\\BaseConvertCommand' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Command/Manual/BaseConvertCommand.php', + 'phpDocumentor\\Plugin\\Scrybe\\Command\\Manual\\ToHtmlCommand' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Command/Manual/ToHtmlCommand.php', + 'phpDocumentor\\Plugin\\Scrybe\\Command\\Manual\\ToLatexCommand' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Command/Manual/ToLatexCommand.php', + 'phpDocumentor\\Plugin\\Scrybe\\Command\\Manual\\ToPdfCommand' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Command/Manual/ToPdfCommand.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\BaseConverter' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/BaseConverter.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\ConverterInterface' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/ConverterInterface.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\Definition\\Definition' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/Definition/Definition.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\Definition\\Factory' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/Definition/Factory.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\Exception\\ConverterNotFoundException' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/Exception/ConverterNotFoundException.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\Factory' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/Factory.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\Format\\Collection' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/Format/Collection.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\Format\\Exception\\FormatNotFoundException' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/Format/Exception/FormatNotFoundException.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\Format\\Format' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/Format/Format.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\Metadata\\Assets' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/Metadata/Assets.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\Metadata\\Glossary' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/Metadata/Glossary.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\Metadata\\TableOfContents' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/Metadata/TableOfContents.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\Metadata\\TableOfContents\\BaseEntry' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/Metadata/TableOfContents/BaseEntry.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\Metadata\\TableOfContents\\File' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/Metadata/TableOfContents/File.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\Metadata\\TableOfContents\\Heading' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/Metadata/TableOfContents/Heading.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\Metadata\\TableOfContents\\Module' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/Metadata/TableOfContents/Module.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\RestructuredText\\Directives\\CodeBlock' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/RestructuredText/Directives/CodeBlock.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\RestructuredText\\Directives\\Figure' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/RestructuredText/Directives/Figure.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\RestructuredText\\Directives\\Image' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/RestructuredText/Directives/Image.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\RestructuredText\\Directives\\Toctree' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/RestructuredText/Directives/Toctree.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\RestructuredText\\Document' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/RestructuredText/Document.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\RestructuredText\\Roles\\Doc' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/RestructuredText/Roles/Doc.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\RestructuredText\\ToHtml' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/RestructuredText/ToHtml.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\RestructuredText\\Visitors\\Creator' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/RestructuredText/Visitors/Creator.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\RestructuredText\\Visitors\\Discover' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/RestructuredText/Visitors/Discover.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\ToHtmlInterface' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/ToHtmlInterface.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\ToLatexInterface' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/ToLatexInterface.php', + 'phpDocumentor\\Plugin\\Scrybe\\Converter\\ToPdfInterface' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Converter/ToPdfInterface.php', + 'phpDocumentor\\Plugin\\Scrybe\\ServiceProvider' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/ServiceProvider.php', + 'phpDocumentor\\Plugin\\Scrybe\\Template\\Factory' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Template/Factory.php', + 'phpDocumentor\\Plugin\\Scrybe\\Template\\TemplateInterface' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Template/TemplateInterface.php', + 'phpDocumentor\\Plugin\\Scrybe\\Template\\Twig' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Scrybe/Template/Twig.php', + 'phpDocumentor\\Plugin\\ServiceProvider' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/ServiceProvider.php', + 'phpDocumentor\\Plugin\\Twig\\Extension' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Twig/Extension.php', + 'phpDocumentor\\Plugin\\Twig\\ExtensionInterface' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Twig/ExtensionInterface.php', + 'phpDocumentor\\Plugin\\Twig\\ServiceProvider' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Twig/ServiceProvider.php', + 'phpDocumentor\\Plugin\\Twig\\Writer\\Twig' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Plugin/Twig/Writer/Twig.php', + 'phpDocumentor\\Reflection\\BaseReflector' => __DIR__ . '/..' . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/BaseReflector.php', + 'phpDocumentor\\Reflection\\BaseReflectorMock' => __DIR__ . '/..' . '/phpdocumentor/reflection/tests/mocks/phpDocumentor/Reflection/BaseReflectorMock.php', + 'phpDocumentor\\Reflection\\BaseReflectorTest' => __DIR__ . '/..' . '/phpdocumentor/reflection/tests/unit/phpDocumentor/Reflection/BaseReflectorTest.php', + 'phpDocumentor\\Reflection\\ClassReflector' => __DIR__ . '/..' . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/ClassReflector.php', + 'phpDocumentor\\Reflection\\ClassReflectorMock' => __DIR__ . '/..' . '/phpdocumentor/reflection/tests/mocks/phpDocumentor/Reflection/ClassReflectorMock.php', + 'phpDocumentor\\Reflection\\ClassReflectorTest' => __DIR__ . '/..' . '/phpdocumentor/reflection/tests/unit/phpDocumentor/Reflection/ClassReflectorTest.php', + 'phpDocumentor\\Reflection\\ClassReflector\\ConstantReflector' => __DIR__ . '/..' . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/ClassReflector/ConstantReflector.php', + 'phpDocumentor\\Reflection\\ClassReflector\\MethodReflector' => __DIR__ . '/..' . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/ClassReflector/MethodReflector.php', + 'phpDocumentor\\Reflection\\ClassReflector\\PropertyReflector' => __DIR__ . '/..' . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/ClassReflector/PropertyReflector.php', + 'phpDocumentor\\Reflection\\ConstantReflector' => __DIR__ . '/..' . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/ConstantReflector.php', + 'phpDocumentor\\Reflection\\DocBlock' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock.php', + 'phpDocumentor\\Reflection\\DocBlock\\Context' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Context.php', + 'phpDocumentor\\Reflection\\DocBlock\\Description' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Description.php', + 'phpDocumentor\\Reflection\\DocBlock\\Location' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Location.php', + 'phpDocumentor\\Reflection\\DocBlock\\Serializer' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Serializer.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag\\AuthorTag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/AuthorTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag\\CoversTag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/CoversTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag\\DeprecatedTag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/DeprecatedTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag\\ExampleTag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ExampleTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag\\LinkTag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/LinkTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag\\MethodTag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/MethodTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag\\ParamTag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ParamTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag\\PropertyReadTag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyReadTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag\\PropertyTag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag\\PropertyWriteTag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyWriteTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag\\ReturnTag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ReturnTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag\\SeeTag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SeeTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag\\SinceTag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SinceTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag\\SourceTag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SourceTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag\\ThrowsTag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ThrowsTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag\\UsesTag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/UsesTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag\\VarTag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/VarTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Tag\\VersionTag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/VersionTag.php', + 'phpDocumentor\\Reflection\\DocBlock\\Type\\Collection' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Type/Collection.php', + 'phpDocumentor\\Reflection\\Event\\ExportDocBlockTagEvent' => __DIR__ . '/..' . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/Event/ExportDocBlockTagEvent.php', + 'phpDocumentor\\Reflection\\Event\\PostDocBlockExtractionEvent' => __DIR__ . '/..' . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/Event/PostDocBlockExtractionEvent.php', + 'phpDocumentor\\Reflection\\Exception' => __DIR__ . '/..' . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/Exception.php', + 'phpDocumentor\\Reflection\\Exception\\UnparsableFile' => __DIR__ . '/..' . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/Exception/UnparsableFile.php', + 'phpDocumentor\\Reflection\\Exception\\UnreadableFile' => __DIR__ . '/..' . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/Exception/UnreadableFile.php', + 'phpDocumentor\\Reflection\\FileReflector' => __DIR__ . '/..' . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/FileReflector.php', + 'phpDocumentor\\Reflection\\FunctionReflector' => __DIR__ . '/..' . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/FunctionReflector.php', + 'phpDocumentor\\Reflection\\FunctionReflector\\ArgumentReflector' => __DIR__ . '/..' . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/FunctionReflector/ArgumentReflector.php', + 'phpDocumentor\\Reflection\\IncludeReflector' => __DIR__ . '/..' . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/IncludeReflector.php', + 'phpDocumentor\\Reflection\\InterfaceReflector' => __DIR__ . '/..' . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/InterfaceReflector.php', + 'phpDocumentor\\Reflection\\Lexer' => __DIR__ . '/..' . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/Lexer.php', + 'phpDocumentor\\Reflection\\NodeExprMock' => __DIR__ . '/..' . '/phpdocumentor/reflection/tests/mocks/phpDocumentor/Reflection/NodeExprMock.php', + 'phpDocumentor\\Reflection\\NodeStmtMock' => __DIR__ . '/..' . '/phpdocumentor/reflection/tests/mocks/phpDocumentor/Reflection/NodeStmtMock.php', + 'phpDocumentor\\Reflection\\NodeStmtMock2' => __DIR__ . '/..' . '/phpdocumentor/reflection/tests/mocks/phpDocumentor/Reflection/NodeStmtMock2.php', + 'phpDocumentor\\Reflection\\PrettyPrinter' => __DIR__ . '/..' . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/PrettyPrinter.php', + 'phpDocumentor\\Reflection\\PrettyPrinterTest' => __DIR__ . '/..' . '/phpdocumentor/reflection/tests/unit/phpDocumentor/Reflection/PrettyPrinterTest.php', + 'phpDocumentor\\Reflection\\ReflectionAbstract' => __DIR__ . '/..' . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/ReflectionAbstract.php', + 'phpDocumentor\\Reflection\\TraitReflector' => __DIR__ . '/..' . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/TraitReflector.php', + 'phpDocumentor\\Reflection\\Traverser' => __DIR__ . '/..' . '/phpdocumentor/reflection/src/phpDocumentor/Reflection/Traverser.php', + 'phpDocumentor\\Transformer\\Behaviour\\BehaviourAbstract' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Behaviour/BehaviourAbstract.php', + 'phpDocumentor\\Transformer\\Behaviour\\Collection' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Behaviour/Collection.php', + 'phpDocumentor\\Transformer\\Command\\Project\\TransformCommand' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Command/Project/TransformCommand.php', + 'phpDocumentor\\Transformer\\Command\\Template\\ListCommand' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Command/Template/ListCommand.php', + 'phpDocumentor\\Transformer\\Configuration' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Configuration.php', + 'phpDocumentor\\Transformer\\Configuration\\ExternalClassDocumentation' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Configuration/ExternalClassDocumentation.php', + 'phpDocumentor\\Transformer\\Configuration\\Transformations' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Configuration/Transformations.php', + 'phpDocumentor\\Transformer\\Configuration\\Transformations\\Template' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Configuration/Transformations/Template.php', + 'phpDocumentor\\Transformer\\Event\\PostTransformEvent' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Event/PostTransformEvent.php', + 'phpDocumentor\\Transformer\\Event\\PostTransformationEvent' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Event/PostTransformationEvent.php', + 'phpDocumentor\\Transformer\\Event\\PreTransformEvent' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Event/PreTransformEvent.php', + 'phpDocumentor\\Transformer\\Event\\PreTransformationEvent' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Event/PreTransformationEvent.php', + 'phpDocumentor\\Transformer\\Event\\PreXslWriterEvent' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Event/PreXslWriterEvent.php', + 'phpDocumentor\\Transformer\\Event\\WriterInitializationEvent' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Event/WriterInitializationEvent.php', + 'phpDocumentor\\Transformer\\Exception' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Exception.php', + 'phpDocumentor\\Transformer\\Exception\\MissingDependencyException' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Exception/MissingDependencyException.php', + 'phpDocumentor\\Transformer\\Exception\\UnknownWriter' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Exception/UnknownWriter.php', + 'phpDocumentor\\Transformer\\Router\\ExternalRouter' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Router/ExternalRouter.php', + 'phpDocumentor\\Transformer\\Router\\ForFileProxy' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Router/ForFileProxy.php', + 'phpDocumentor\\Transformer\\Router\\Matcher\\MatcherInterface' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Router/Matcher/MatcherInterface.php', + 'phpDocumentor\\Transformer\\Router\\Queue' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Router/Queue.php', + 'phpDocumentor\\Transformer\\Router\\Renderer' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Router/Renderer.php', + 'phpDocumentor\\Transformer\\Router\\RouterAbstract' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Router/RouterAbstract.php', + 'phpDocumentor\\Transformer\\Router\\Rule' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Router/Rule.php', + 'phpDocumentor\\Transformer\\Router\\StandardRouter' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Router/StandardRouter.php', + 'phpDocumentor\\Transformer\\Router\\UrlGenerator\\Standard\\ClassDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Router/UrlGenerator/Standard/ClassDescriptor.php', + 'phpDocumentor\\Transformer\\Router\\UrlGenerator\\Standard\\ConstantDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Router/UrlGenerator/Standard/ConstantDescriptor.php', + 'phpDocumentor\\Transformer\\Router\\UrlGenerator\\Standard\\FileDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Router/UrlGenerator/Standard/FileDescriptor.php', + 'phpDocumentor\\Transformer\\Router\\UrlGenerator\\Standard\\FunctionDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Router/UrlGenerator/Standard/FunctionDescriptor.php', + 'phpDocumentor\\Transformer\\Router\\UrlGenerator\\Standard\\MethodDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Router/UrlGenerator/Standard/MethodDescriptor.php', + 'phpDocumentor\\Transformer\\Router\\UrlGenerator\\Standard\\NamespaceDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Router/UrlGenerator/Standard/NamespaceDescriptor.php', + 'phpDocumentor\\Transformer\\Router\\UrlGenerator\\Standard\\PackageDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Router/UrlGenerator/Standard/PackageDescriptor.php', + 'phpDocumentor\\Transformer\\Router\\UrlGenerator\\Standard\\PropertyDescriptor' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Router/UrlGenerator/Standard/PropertyDescriptor.php', + 'phpDocumentor\\Transformer\\Router\\UrlGenerator\\Standard\\QualifiedNameToUrlConverter' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Router/UrlGenerator/Standard/QualifiedNameToUrlConverter.php', + 'phpDocumentor\\Transformer\\Router\\UrlGenerator\\UrlGeneratorInterface' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Router/UrlGenerator/UrlGeneratorInterface.php', + 'phpDocumentor\\Transformer\\ServiceProvider' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/ServiceProvider.php', + 'phpDocumentor\\Transformer\\Template' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Template.php', + 'phpDocumentor\\Transformer\\Template\\Collection' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Template/Collection.php', + 'phpDocumentor\\Transformer\\Template\\Factory' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Template/Factory.php', + 'phpDocumentor\\Transformer\\Template\\Parameter' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Template/Parameter.php', + 'phpDocumentor\\Transformer\\Template\\PathResolver' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Template/PathResolver.php', + 'phpDocumentor\\Transformer\\Transformation' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Transformation.php', + 'phpDocumentor\\Transformer\\Transformer' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Transformer.php', + 'phpDocumentor\\Transformer\\Writer\\Collection' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Writer/Collection.php', + 'phpDocumentor\\Transformer\\Writer\\Exception\\RequirementMissing' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Writer/Exception/RequirementMissing.php', + 'phpDocumentor\\Transformer\\Writer\\Initializable' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Writer/Initializable.php', + 'phpDocumentor\\Transformer\\Writer\\Routable' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Writer/Routable.php', + 'phpDocumentor\\Transformer\\Writer\\Translatable' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Writer/Translatable.php', + 'phpDocumentor\\Transformer\\Writer\\WriterAbstract' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Transformer/Writer/WriterAbstract.php', + 'phpDocumentor\\Translator\\Configuration' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Translator/Configuration.php', + 'phpDocumentor\\Translator\\ServiceProvider' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Translator/ServiceProvider.php', + 'phpDocumentor\\Translator\\Translator' => __DIR__ . '/..' . '/phpdocumentor/phpdocumentor/src/phpDocumentor/Translator/Translator.php', 'phpseclib\\Crypt\\AES' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/AES.php', 'phpseclib\\Crypt\\Base' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Base.php', 'phpseclib\\Crypt\\Blowfish' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Blowfish.php', diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index 34ecc4fbd7..0b3d82400b 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -1,4 +1,68 @@ [ + { + "name": "alchemy/binary-driver", + "version": "v5.2.0", + "version_normalized": "5.2.0.0", + "source": { + "type": "git", + "url": "https://github.com/alchemy-fr/BinaryDriver.git", + "reference": "e0615cdff315e6b4b05ada67906df6262a020d22" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/alchemy-fr/BinaryDriver/zipball/e0615cdff315e6b4b05ada67906df6262a020d22", + "reference": "e0615cdff315e6b4b05ada67906df6262a020d22", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0|^2.0|^1.0", + "php": ">=5.5", + "psr/log": "^1.0", + "symfony/process": "^2.3|^3.0|^4.0|^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0|^5.0" + }, + "time": "2020-02-12T19:35:11+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "Alchemy": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Le Goff", + "email": "legoff.n@gmail.com" + }, + { + "name": "Romain Neutron", + "email": "imprec@gmail.com", + "homepage": "http://www.lickmychip.com/" + }, + { + "name": "Phraseanet Team", + "email": "info@alchemy.fr", + "homepage": "http://www.phraseanet.com/" + }, + { + "name": "Jens Hausdorf", + "email": "mail@jens-hausdorf.de", + "homepage": "https://jens-hausdorf.de", + "role": "Maintainer" + } + ], + "description": "A set of tools to build binary drivers", + "keywords": [ + "binary", + "driver" + ] + }, { "name": "apereo/phpcas", "version": "1.3.8", @@ -56,6 +120,128 @@ "jasig" ] }, + { + "name": "cilex/cilex", + "version": "1.1.0", + "version_normalized": "1.1.0.0", + "source": { + "type": "git", + "url": "https://github.com/Cilex/Cilex.git", + "reference": "7acd965a609a56d0345e8b6071c261fbdb926cb5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Cilex/Cilex/zipball/7acd965a609a56d0345e8b6071c261fbdb926cb5", + "reference": "7acd965a609a56d0345e8b6071c261fbdb926cb5", + "shasum": "" + }, + "require": { + "cilex/console-service-provider": "1.*", + "php": ">=5.3.3", + "pimple/pimple": "~1.0", + "symfony/finder": "~2.1", + "symfony/process": "~2.1" + }, + "require-dev": { + "phpunit/phpunit": "3.7.*", + "symfony/validator": "~2.1" + }, + "suggest": { + "monolog/monolog": ">=1.0.0", + "symfony/validator": ">=1.0.0", + "symfony/yaml": ">=1.0.0" + }, + "time": "2014-03-29T14:03:13+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "Cilex": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "mike.vanriel@naenius.com" + } + ], + "description": "The PHP micro-framework for Command line tools based on the Symfony2 Components", + "homepage": "http://cilex.github.com", + "keywords": [ + "cli", + "microframework" + ] + }, + { + "name": "cilex/console-service-provider", + "version": "1.0.0", + "version_normalized": "1.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/Cilex/console-service-provider.git", + "reference": "25ee3d1875243d38e1a3448ff94bdf944f70d24e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Cilex/console-service-provider/zipball/25ee3d1875243d38e1a3448ff94bdf944f70d24e", + "reference": "25ee3d1875243d38e1a3448ff94bdf944f70d24e", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "pimple/pimple": "1.*@dev", + "symfony/console": "~2.1" + }, + "require-dev": { + "cilex/cilex": "1.*@dev", + "silex/silex": "1.*@dev" + }, + "time": "2012-12-19T10:50:58+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "Cilex\\Provider\\Console": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Mike van Riel", + "email": "mike.vanriel@naenius.com" + } + ], + "description": "Console Service Provider", + "keywords": [ + "cilex", + "console", + "pimple", + "service-provider", + "silex" + ] + }, { "name": "composer/ca-bundle", "version": "1.2.7", @@ -124,6 +310,40 @@ } ] }, + { + "name": "container-interop/container-interop", + "version": "1.2.0", + "version_normalized": "1.2.0.0", + "source": { + "type": "git", + "url": "https://github.com/container-interop/container-interop.git", + "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/container-interop/container-interop/zipball/79cbf1341c22ec75643d841642dd5d6acd83bdb8", + "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8", + "shasum": "" + }, + "require": { + "psr/container": "^1.0" + }, + "time": "2017-02-14T19:40:03+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Interop\\Container\\": "src/Interop/Container/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Promoting the interoperability of container objects (DIC, SL, etc.)", + "homepage": "https://github.com/container-interop/container-interop", + "abandoned": "psr/container" + }, { "name": "diogocomposer/xmpphp", "version": "v3.0.2", @@ -201,6 +421,360 @@ "xmpphp" ] }, + { + "name": "dnoegel/php-xdg-base-dir", + "version": "v0.1.1", + "version_normalized": "0.1.1.0", + "source": { + "type": "git", + "url": "https://github.com/dnoegel/php-xdg-base-dir.git", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" + }, + "time": "2019-12-04T15:06:13+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "XdgBaseDir\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "implementation of xdg base directory specification for php" + }, + { + "name": "doctrine/annotations", + "version": "1.10.3", + "version_normalized": "1.10.3.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "5db60a4969eba0e0c197a19c077780aadbc43c5d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/5db60a4969eba0e0c197a19c077780aadbc43c5d", + "reference": "5db60a4969eba0e0c197a19c077780aadbc43c5d", + "shasum": "" + }, + "require": { + "doctrine/lexer": "1.*", + "ext-tokenizer": "*", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/cache": "1.*", + "phpunit/phpunit": "^7.5" + }, + "time": "2020-05-25T17:24:27+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "annotations", + "docblock", + "parser" + ] + }, + { + "name": "doctrine/cache", + "version": "1.10.2", + "version_normalized": "1.10.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "13e3381b25847283a91948d04640543941309727" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/13e3381b25847283a91948d04640543941309727", + "reference": "13e3381b25847283a91948d04640543941309727", + "shasum": "" + }, + "require": { + "php": "~7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "alcaeus/mongo-php-adapter": "^1.1", + "doctrine/coding-standard": "^6.0", + "mongodb/mongodb": "^1.1", + "phpunit/phpunit": "^7.0", + "predis/predis": "~1.0" + }, + "suggest": { + "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" + }, + "time": "2020-07-07T18:54:01+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", + "homepage": "https://www.doctrine-project.org/projects/cache.html", + "keywords": [ + "abstraction", + "apcu", + "cache", + "caching", + "couchdb", + "memcached", + "php", + "redis", + "xcache" + ], + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", + "type": "tidelift" + } + ] + }, + { + "name": "doctrine/instantiator", + "version": "1.3.1", + "version_normalized": "1.3.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "f350df0268e904597e3bd9c4685c53e0e333feea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f350df0268e904597e3bd9c4685c53e0e333feea", + "reference": "f350df0268e904597e3bd9c4685c53e0e333feea", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^0.13", + "phpstan/phpstan-phpunit": "^0.11", + "phpstan/phpstan-shim": "^0.11", + "phpunit/phpunit": "^7.0" + }, + "time": "2020-05-29T17:27:14+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "installation-source": "dist", + "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://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ] + }, + { + "name": "doctrine/lexer", + "version": "1.2.1", + "version_normalized": "1.2.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "phpstan/phpstan": "^0.11.8", + "phpunit/phpunit": "^8.2" + }, + "time": "2020-05-25T17:44:05+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ] + }, { "name": "embed/embed", "version": "v3.4.8", @@ -257,6 +831,99 @@ "twitter cards" ] }, + { + "name": "erusev/parsedown", + "version": "1.7.4", + "version_normalized": "1.7.4.0", + "source": { + "type": "git", + "url": "https://github.com/erusev/parsedown.git", + "reference": "cb17b6477dfff935958ba01325f2e8a2bfa6dab3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/erusev/parsedown/zipball/cb17b6477dfff935958ba01325f2e8a2bfa6dab3", + "reference": "cb17b6477dfff935958ba01325f2e8a2bfa6dab3", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35" + }, + "time": "2019-12-30T22:54:17+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "Parsedown": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Emanuil Rusev", + "email": "hello@erusev.com", + "homepage": "http://erusev.com" + } + ], + "description": "Parser for Markdown.", + "homepage": "http://parsedown.org", + "keywords": [ + "markdown", + "parser" + ] + }, + { + "name": "evenement/evenement", + "version": "v3.0.1", + "version_normalized": "3.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/igorw/evenement.git", + "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/igorw/evenement/zipball/531bfb9d15f8aa57454f5f0285b18bec903b8fb7", + "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7", + "shasum": "" + }, + "require": { + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "time": "2017-07-23T21:35:13+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "Evenement": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + } + ], + "description": "Événement is a very simple event dispatching library for PHP", + "keywords": [ + "event-dispatcher", + "event-emitter" + ] + }, { "name": "ezyang/htmlpurifier", "version": "v4.13.0", @@ -633,6 +1300,275 @@ "watermark" ] }, + { + "name": "jakub-onderka/php-console-color", + "version": "v0.2", + "version_normalized": "0.2.0.0", + "source": { + "type": "git", + "url": "https://github.com/JakubOnderka/PHP-Console-Color.git", + "reference": "d5deaecff52a0d61ccb613bb3804088da0307191" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Color/zipball/d5deaecff52a0d61ccb613bb3804088da0307191", + "reference": "d5deaecff52a0d61ccb613bb3804088da0307191", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "jakub-onderka/php-code-style": "1.0", + "jakub-onderka/php-parallel-lint": "1.0", + "jakub-onderka/php-var-dump-check": "0.*", + "phpunit/phpunit": "~4.3", + "squizlabs/php_codesniffer": "1.*" + }, + "time": "2018-09-29T17:23:10+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "JakubOnderka\\PhpConsoleColor\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Jakub Onderka", + "email": "jakub.onderka@gmail.com" + } + ], + "abandoned": "php-parallel-lint/php-console-color" + }, + { + "name": "jakub-onderka/php-console-highlighter", + "version": "v0.4", + "version_normalized": "0.4.0.0", + "source": { + "type": "git", + "url": "https://github.com/JakubOnderka/PHP-Console-Highlighter.git", + "reference": "9f7a229a69d52506914b4bc61bfdb199d90c5547" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Highlighter/zipball/9f7a229a69d52506914b4bc61bfdb199d90c5547", + "reference": "9f7a229a69d52506914b4bc61bfdb199d90c5547", + "shasum": "" + }, + "require": { + "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": "~1.0", + "jakub-onderka/php-var-dump-check": "~0.1", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "~1.5" + }, + "time": "2018-09-29T18:48:56+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "JakubOnderka\\PhpConsoleHighlighter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jakub Onderka", + "email": "acci@acci.cz", + "homepage": "http://www.acci.cz/" + } + ], + "description": "Highlight PHP code in terminal", + "abandoned": "php-parallel-lint/php-console-highlighter" + }, + { + "name": "jms/metadata", + "version": "1.7.0", + "version_normalized": "1.7.0.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/metadata.git", + "reference": "e5854ab1aa643623dc64adde718a8eec32b957a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/metadata/zipball/e5854ab1aa643623dc64adde718a8eec32b957a8", + "reference": "e5854ab1aa643623dc64adde718a8eec32b957a8", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "doctrine/cache": "~1.0", + "symfony/cache": "~3.1" + }, + "time": "2018-10-26T12:40:10+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.5.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "Metadata\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + }, + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Class/method/property metadata management in PHP", + "keywords": [ + "annotations", + "metadata", + "xml", + "yaml" + ] + }, + { + "name": "jms/parser-lib", + "version": "1.0.0", + "version_normalized": "1.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/parser-lib.git", + "reference": "c509473bc1b4866415627af0e1c6cc8ac97fa51d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/parser-lib/zipball/c509473bc1b4866415627af0e1c6cc8ac97fa51d", + "reference": "c509473bc1b4866415627af0e1c6cc8ac97fa51d", + "shasum": "" + }, + "require": { + "phpoption/phpoption": ">=0.9,<2.0-dev" + }, + "time": "2012-11-18T18:08:43+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "JMS\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache2" + ], + "description": "A library for easily creating recursive-descent parsers." + }, + { + "name": "jms/serializer", + "version": "1.7.1", + "version_normalized": "1.7.1.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/serializer.git", + "reference": "4fad8bbbe76e05de3b79ffa3db027058ed3813ff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/4fad8bbbe76e05de3b79ffa3db027058ed3813ff", + "reference": "4fad8bbbe76e05de3b79ffa3db027058ed3813ff", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.0", + "doctrine/instantiator": "^1.0.3", + "jms/metadata": "~1.1", + "jms/parser-lib": "1.*", + "php": ">=5.5.0", + "phpcollection/phpcollection": "~0.1", + "phpoption/phpoption": "^1.1" + }, + "conflict": { + "jms/serializer-bundle": "<1.2.1", + "twig/twig": "<1.12" + }, + "require-dev": { + "doctrine/orm": "~2.1", + "doctrine/phpcr-odm": "^1.3|^2.0", + "ext-pdo_sqlite": "*", + "jackalope/jackalope-doctrine-dbal": "^1.1.5", + "phpunit/phpunit": "^4.8|^5.0", + "propel/propel1": "~1.7", + "symfony/expression-language": "^2.6|^3.0", + "symfony/filesystem": "^2.1", + "symfony/form": "~2.1|^3.0", + "symfony/translation": "^2.1|^3.0", + "symfony/validator": "^2.2|^3.0", + "symfony/yaml": "^2.1|^3.0", + "twig/twig": "~1.12|~2.0" + }, + "suggest": { + "doctrine/cache": "Required if you like to use cache functionality.", + "doctrine/collections": "Required if you like to use doctrine collection types as ArrayCollection.", + "symfony/yaml": "Required if you'd like to serialize data to YAML format." + }, + "time": "2017-05-15T08:35:42+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "JMS\\Serializer": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Library for (de-)serializing data of any complexity; supports XML, JSON, and YAML.", + "homepage": "http://jmsyst.com/libs/serializer", + "keywords": [ + "deserialization", + "jaxb", + "json", + "serialization", + "xml" + ] + }, { "name": "masterminds/html5", "version": "2.7.3", @@ -811,6 +1747,240 @@ "markdown" ] }, + { + "name": "monolog/monolog", + "version": "1.25.5", + "version_normalized": "1.25.5.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "1817faadd1846cd08be9a49e905dc68823bc38c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/1817faadd1846cd08be9a49e905dc68823bc38c0", + "reference": "1817faadd1846cd08be9a49e905dc68823bc38c0", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "psr/log": "~1.0" + }, + "provide": { + "psr/log-implementation": "1.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "graylog2/gelf-php": "~1.0", + "php-amqplib/php-amqplib": "~2.4", + "php-console/php-console": "^3.1.3", + "php-parallel-lint/php-parallel-lint": "^1.0", + "phpunit/phpunit": "~4.5", + "ruflin/elastica": ">=0.90 <3.0", + "sentry/sentry": "^0.13", + "swiftmailer/swiftmailer": "^5.3|^6.0" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-mongo": "Allow sending log messages to a MongoDB server", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "php-console/php-console": "Allow sending log messages to Google Chrome", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server", + "sentry/sentry": "Allow sending log messages to a Sentry server" + }, + "time": "2020-07-23T08:35:51+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "http://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ] + }, + { + "name": "myclabs/deep-copy", + "version": "1.10.1", + "version_normalized": "1.10.1.0", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/969b211f9a51aa1f6c01d1d2aef56d3bd91598e5", + "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "replace": { + "myclabs/deep-copy": "self.version" + }, + "require-dev": { + "doctrine/collections": "^1.0", + "doctrine/common": "^2.6", + "phpunit/phpunit": "^7.1" + }, + "time": "2020-06-29T13:22:24+00:00", + "type": "library", + "installation-source": "dist", + "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" + ], + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ] + }, + { + "name": "neutron/temporary-filesystem", + "version": "2.4", + "version_normalized": "2.4.0.0", + "source": { + "type": "git", + "url": "https://github.com/romainneutron/Temporary-Filesystem.git", + "reference": "3c55497da8d7762fb4dcabc91d54a5de510e3c99" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/romainneutron/Temporary-Filesystem/zipball/3c55497da8d7762fb4dcabc91d54a5de510e3c99", + "reference": "3c55497da8d7762fb4dcabc91d54a5de510e3c99", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0", + "symfony/filesystem": "^2.3 || ^3.0 || ^4.0 || ^5.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^5.0.4" + }, + "time": "2020-02-17T15:27:36+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "Neutron": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Romain Neutron", + "email": "imprec@gmail.com" + } + ], + "description": "Symfony filesystem extension to handle temporary files" + }, + { + "name": "nikic/php-parser", + "version": "v1.4.1", + "version_normalized": "1.4.1.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "f78af2c9c86107aa1a34cd1dbb5bbe9eeb0d9f51" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f78af2c9c86107aa1a34cd1dbb5bbe9eeb0d9f51", + "reference": "f78af2c9c86107aa1a34cd1dbb5bbe9eeb0d9f51", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.3" + }, + "time": "2015-09-19T14:15:08+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "lib/bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ] + }, { "name": "openid/php-openid", "version": "2.3.0", @@ -862,6 +2032,131 @@ "yadis" ] }, + { + "name": "padraic/humbug_get_contents", + "version": "1.1.2", + "version_normalized": "1.1.2.0", + "source": { + "type": "git", + "url": "https://github.com/humbug/file_get_contents.git", + "reference": "dcb086060c9dd6b2f51d8f7a895500307110b7a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/humbug/file_get_contents/zipball/dcb086060c9dd6b2f51d8f7a895500307110b7a7", + "reference": "dcb086060c9dd6b2f51d8f7a895500307110b7a7", + "shasum": "" + }, + "require": { + "composer/ca-bundle": "^1.0", + "ext-openssl": "*", + "php": "^5.3 || ^7.0 || ^7.1 || ^7.2" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.1", + "mikey179/vfsstream": "^1.6", + "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5" + }, + "time": "2018-02-12T18:47:17+00:00", + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": false + }, + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Humbug\\": "src/" + }, + "files": [ + "src/function.php", + "src/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "http://blog.astrumfutura.com" + }, + { + "name": "Théo Fidry", + "email": "theo.fidry@gmail.com" + } + ], + "description": "Secure wrapper for accessing HTTPS resources with file_get_contents for PHP 5.3+", + "homepage": "https://github.com/padraic/file_get_contents", + "keywords": [ + "download", + "file_get_contents", + "http", + "https", + "ssl", + "tls" + ] + }, + { + "name": "padraic/phar-updater", + "version": "v1.0.6", + "version_normalized": "1.0.6.0", + "source": { + "type": "git", + "url": "https://github.com/humbug/phar-updater.git", + "reference": "d01d3b8f26e541ac9b9eeba1e18d005d852f7ff1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/humbug/phar-updater/zipball/d01d3b8f26e541ac9b9eeba1e18d005d852f7ff1", + "reference": "d01d3b8f26e541ac9b9eeba1e18d005d852f7ff1", + "shasum": "" + }, + "require": { + "padraic/humbug_get_contents": "^1.0", + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "time": "2018-03-30T12:52:15+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Humbug\\SelfUpdate\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "http://blog.astrumfutura.com" + } + ], + "description": "A thing to make PHAR self-updating easy and secure.", + "keywords": [ + "humbug", + "phar", + "self-update", + "update" + ] + }, { "name": "paragonie/constant_time_encoding", "version": "v1.0.4", @@ -1027,6 +2322,602 @@ ], "description": "More info available on: http://pear.php.net/package/Console_Getopt" }, + { + "name": "phar-io/manifest", + "version": "1.0.3", + "version_normalized": "1.0.3.0", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", + "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "phar-io/version": "^2.0", + "php": "^5.6 || ^7.0" + }, + "time": "2018-07-08T19:23:20+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "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)" + }, + { + "name": "phar-io/version", + "version": "2.0.1", + "version_normalized": "2.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", + "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "time": "2018-07-08T19:19:57+00:00", + "type": "library", + "installation-source": "dist", + "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" + }, + { + "name": "php-ffmpeg/php-ffmpeg", + "version": "v0.16", + "version_normalized": "0.16.0.0", + "source": { + "type": "git", + "url": "https://github.com/PHP-FFMpeg/PHP-FFMpeg.git", + "reference": "4175c02b7d9f7e1a02cec2ba73474266ba2c5fa1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-FFMpeg/PHP-FFMpeg/zipball/4175c02b7d9f7e1a02cec2ba73474266ba2c5fa1", + "reference": "4175c02b7d9f7e1a02cec2ba73474266ba2c5fa1", + "shasum": "" + }, + "require": { + "alchemy/binary-driver": "^1.5 || ~2.0.0 || ^5.0", + "doctrine/cache": "^1.0", + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "neutron/temporary-filesystem": "^2.1.1", + "php": "^5.3.9 || ^7.0" + }, + "require-dev": { + "sami/sami": "~1.0", + "silex/silex": "~1.0", + "symfony/phpunit-bridge": "^5.0.4" + }, + "suggest": { + "php-ffmpeg/extras": "A compilation of common audio & video drivers for PHP-FFMpeg" + }, + "time": "2020-03-29T09:57:10+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.7-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "FFMpeg": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Romain Neutron", + "email": "imprec@gmail.com", + "homepage": "http://www.lickmychip.com/" + }, + { + "name": "Phraseanet Team", + "email": "info@alchemy.fr", + "homepage": "http://www.phraseanet.com/" + }, + { + "name": "Patrik Karisch", + "email": "patrik@karisch.guru", + "homepage": "http://www.karisch.guru" + }, + { + "name": "Romain Biard", + "email": "romain.biard@gmail.com", + "homepage": "https://www.strime.io/" + }, + { + "name": "Jens Hausdorf", + "email": "hello@jens-hausdorf.de", + "homepage": "https://jens-hausdorf.de" + } + ], + "description": "FFMpeg PHP, an Object Oriented library to communicate with AVconv / ffmpeg", + "keywords": [ + "audio", + "audio processing", + "avconv", + "avprobe", + "ffmpeg", + "ffprobe", + "video", + "video processing" + ] + }, + { + "name": "phpcollection/phpcollection", + "version": "0.5.0", + "version_normalized": "0.5.0.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-collection.git", + "reference": "f2bcff45c0da7c27991bbc1f90f47c4b7fb434a6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-collection/zipball/f2bcff45c0da7c27991bbc1f90f47c4b7fb434a6", + "reference": "f2bcff45c0da7c27991bbc1f90f47c4b7fb434a6", + "shasum": "" + }, + "require": { + "phpoption/phpoption": "1.*" + }, + "time": "2015-05-17T12:39:23+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "PhpCollection": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache2" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "General-Purpose Collection Library for PHP", + "keywords": [ + "collection", + "list", + "map", + "sequence", + "set" + ] + }, + { + "name": "phpdocumentor/fileset", + "version": "1.0.0", + "version_normalized": "1.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/Fileset.git", + "reference": "bfa78d8fa9763dfce6d0e5d3730c1d8ab25d34b0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/Fileset/zipball/bfa78d8fa9763dfce6d0e5d3730c1d8ab25d34b0", + "reference": "bfa78d8fa9763dfce6d0e5d3730c1d8ab25d34b0", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/finder": "~2.1" + }, + "require-dev": { + "phpunit/phpunit": "~3.7" + }, + "time": "2013-08-06T21:07:42+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "phpDocumentor": [ + "src/", + "tests/unit/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Fileset component for collecting a set of files given directories and file paths", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "files", + "fileset", + "phpdoc" + ] + }, + { + "name": "phpdocumentor/graphviz", + "version": "1.0.4", + "version_normalized": "1.0.4.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/GraphViz.git", + "reference": "a906a90a9f230535f25ea31caf81b2323956283f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/GraphViz/zipball/a906a90a9f230535f25ea31caf81b2323956283f", + "reference": "a906a90a9f230535f25ea31caf81b2323956283f", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "time": "2016-02-02T13:00:08+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "phpDocumentor": [ + "src/", + "tests/unit" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "mike.vanriel@naenius.com" + } + ] + }, + { + "name": "phpdocumentor/phpdocumentor", + "version": "v2.9.1", + "version_normalized": "2.9.1.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/phpDocumentor.git", + "reference": "2e4f981a55ebe6f5db592d7da892d13d5b3c7816" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/phpDocumentor/zipball/2e4f981a55ebe6f5db592d7da892d13d5b3c7816", + "reference": "2e4f981a55ebe6f5db592d7da892d13d5b3c7816", + "shasum": "" + }, + "require": { + "cilex/cilex": "~1.0", + "erusev/parsedown": "~1.0", + "jms/serializer": ">=0.12 < 1.8.0", + "monolog/monolog": "~1.6", + "padraic/phar-updater": "^1.0", + "php": ">=5.3.3", + "phpdocumentor/fileset": "~1.0", + "phpdocumentor/graphviz": "~1.0", + "phpdocumentor/reflection": "^3.0", + "phpdocumentor/reflection-docblock": "~2.0", + "symfony/config": "~2.3", + "symfony/console": "~2.3", + "symfony/event-dispatcher": "~2.1", + "symfony/process": "~2.0", + "symfony/stopwatch": "~2.3", + "symfony/validator": "~2.2", + "twig/twig": "~1.3", + "webmozart/assert": "^1.2", + "zendframework/zend-cache": "~2.1", + "zendframework/zend-config": "~2.1", + "zendframework/zend-filter": "~2.1", + "zendframework/zend-i18n": "~2.1", + "zendframework/zend-serializer": "~2.1", + "zendframework/zend-servicemanager": "~2.1", + "zendframework/zend-stdlib": "~2.1", + "zetacomponents/document": ">=1.3.1" + }, + "require-dev": { + "behat/behat": "^3.0", + "mikey179/vfsstream": "~1.2", + "mockery/mockery": "^0.9@dev", + "phpunit/phpunit": "^4.0", + "squizlabs/php_codesniffer": "^1.4", + "symfony/expression-language": "^2.4" + }, + "suggest": { + "ext-twig": "Enabling the twig extension improves the generation of twig based templates.", + "ext-xslcache": "Enabling the XSLCache extension improves the generation of xml based templates." + }, + "time": "2020-01-12T19:44:16+00:00", + "bin": [ + "bin/phpdoc.php", + "bin/phpdoc" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-develop": "2.9-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "phpDocumentor": [ + "src/", + "tests/unit/" + ], + "Cilex\\Provider": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Documentation Generator for PHP", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "api", + "application", + "dga", + "documentation", + "phpdoc" + ] + }, + { + "name": "phpdocumentor/reflection", + "version": "3.0.1", + "version_normalized": "3.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/Reflection.git", + "reference": "793bfd92d9a0fc96ae9608fb3e947c3f59fb3a0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/Reflection/zipball/793bfd92d9a0fc96ae9608fb3e947c3f59fb3a0d", + "reference": "793bfd92d9a0fc96ae9608fb3e947c3f59fb3a0d", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^1.0", + "php": ">=5.3.3", + "phpdocumentor/reflection-docblock": "~2.0", + "psr/log": "~1.0" + }, + "require-dev": { + "behat/behat": "~2.4", + "mockery/mockery": "~0.8", + "phpunit/phpunit": "~4.0" + }, + "time": "2016-05-21T08:42:32+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "phpDocumentor": [ + "src/", + "tests/unit/", + "tests/mocks/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Reflection library to do Static Analysis for PHP Projects", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ] + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "2.0.5", + "version_normalized": "2.0.5.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "e6a969a640b00d8daa3c66518b0405fb41ae0c4b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/e6a969a640b00d8daa3c66518b0405fb41ae0c4b", + "reference": "e6a969a640b00d8daa3c66518b0405fb41ae0c4b", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "suggest": { + "dflydev/markdown": "~1.0", + "erusev/parsedown": "~1.0" + }, + "time": "2016-01-25T08:17:30+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "phpDocumentor": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "mike.vanriel@naenius.com" + } + ] + }, + { + "name": "phpoption/phpoption", + "version": "1.7.5", + "version_normalized": "1.7.5.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "994ecccd8f3283ecf5ac33254543eb0ac946d525" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/994ecccd8f3283ecf5ac33254543eb0ac946d525", + "reference": "994ecccd8f3283ecf5ac33254543eb0ac946d525", + "shasum": "" + }, + "require": { + "php": "^5.5.9 || ^7.0 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "phpunit/phpunit": "^4.8.35 || ^5.7.27 || ^6.5.6 || ^7.0 || ^8.0 || ^9.0" + }, + "time": "2020-07-20T17:29:33+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.7-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Graham Campbell", + "email": "graham@alt-three.com" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ] + }, { "name": "phpseclib/phpseclib", "version": "dev-master", @@ -1123,6 +3014,476 @@ "x509" ] }, + { + "name": "phpspec/prophecy", + "version": "v1.10.3", + "version_normalized": "1.10.3.0", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "451c3cd1418cf640de218914901e51b064abb093" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/451c3cd1418cf640de218914901e51b064abb093", + "reference": "451c3cd1418cf640de218914901e51b064abb093", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": "^5.3|^7.0", + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0", + "sebastian/comparator": "^1.2.3|^2.0|^3.0|^4.0", + "sebastian/recursion-context": "^1.0|^2.0|^3.0|^4.0" + }, + "require-dev": { + "phpspec/phpspec": "^2.5 || ^3.2", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" + }, + "time": "2020-03-05T15:02:03+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Prophecy\\": "src/Prophecy" + } + }, + "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" + ] + }, + { + "name": "phpunit/php-code-coverage", + "version": "7.0.10", + "version_normalized": "7.0.10.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f1884187926fbb755a9aaf0b3836ad3165b478bf", + "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-xmlwriter": "*", + "php": "^7.2", + "phpunit/php-file-iterator": "^2.0.2", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-token-stream": "^3.1.1", + "sebastian/code-unit-reverse-lookup": "^1.0.1", + "sebastian/environment": "^4.2.2", + "sebastian/version": "^2.0.1", + "theseer/tokenizer": "^1.1.3" + }, + "require-dev": { + "phpunit/phpunit": "^8.2.2" + }, + "suggest": { + "ext-xdebug": "^2.7.2" + }, + "time": "2019-11-20T13:55:58+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.0-dev" + } + }, + "installation-source": "dist", + "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" + ] + }, + { + "name": "phpunit/php-file-iterator", + "version": "2.0.2", + "version_normalized": "2.0.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "050bedf145a257b1ff02746c31894800e5122946" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946", + "reference": "050bedf145a257b1ff02746c31894800e5122946", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.1" + }, + "time": "2018-09-13T20:33:42+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.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" + ] + }, + { + "name": "phpunit/php-text-template", + "version": "1.2.1", + "version_normalized": "1.2.1.0", + "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" + }, + "time": "2015-06-21T13:50:34+00:00", + "type": "library", + "installation-source": "dist", + "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" + ] + }, + { + "name": "phpunit/php-timer", + "version": "2.1.2", + "version_normalized": "2.1.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "1038454804406b0b5f5f520358e78c1c2f71501e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e", + "reference": "1038454804406b0b5f5f520358e78c1c2f71501e", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.0" + }, + "time": "2019-06-07T04:22:29+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ] + }, + { + "name": "phpunit/php-token-stream", + "version": "3.1.1", + "version_normalized": "3.1.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff", + "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.0" + }, + "time": "2019-09-17T06:23:10+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "installation-source": "dist", + "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" + ] + }, + { + "name": "phpunit/phpunit", + "version": "8.5.8", + "version_normalized": "8.5.8.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "34c18baa6a44f1d1fbf0338907139e9dce95b997" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/34c18baa6a44f1d1fbf0338907139e9dce95b997", + "reference": "34c18baa6a44f1d1fbf0338907139e9dce95b997", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.2.0", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.9.1", + "phar-io/manifest": "^1.0.3", + "phar-io/version": "^2.0.1", + "php": "^7.2", + "phpspec/prophecy": "^1.8.1", + "phpunit/php-code-coverage": "^7.0.7", + "phpunit/php-file-iterator": "^2.0.2", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-timer": "^2.1.2", + "sebastian/comparator": "^3.0.2", + "sebastian/diff": "^3.0.2", + "sebastian/environment": "^4.2.2", + "sebastian/exporter": "^3.1.1", + "sebastian/global-state": "^3.0.0", + "sebastian/object-enumerator": "^3.0.3", + "sebastian/resource-operations": "^2.0.1", + "sebastian/type": "^1.1.3", + "sebastian/version": "^2.0.1" + }, + "require-dev": { + "ext-pdo": "*" + }, + "suggest": { + "ext-soap": "*", + "ext-xdebug": "*", + "phpunit/php-invoker": "^2.0.0" + }, + "time": "2020-06-22T07:06:58+00:00", + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.5-dev" + } + }, + "installation-source": "dist", + "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" + ], + "funding": [ + { + "url": "https://phpunit.de/donate.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ] + }, + { + "name": "pimple/pimple", + "version": "v1.1.1", + "version_normalized": "1.1.1.0", + "source": { + "type": "git", + "url": "https://github.com/silexphp/Pimple.git", + "reference": "2019c145fe393923f3441b23f29bbdfaa5c58c4d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/silexphp/Pimple/zipball/2019c145fe393923f3441b23f29bbdfaa5c58c4d", + "reference": "2019c145fe393923f3441b23f29bbdfaa5c58c4d", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "time": "2013-11-22T08:30:29+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "Pimple": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Pimple is a simple Dependency Injection Container for PHP 5.3", + "homepage": "http://pimple.sensiolabs.org", + "keywords": [ + "container", + "dependency injection" + ] + }, { "name": "predis/predis", "version": "v1.1.1", @@ -1175,6 +3536,105 @@ "redis" ] }, + { + "name": "psr/cache", + "version": "1.0.1", + "version_normalized": "1.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "time": "2016-08-06T20:24:11+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ] + }, + { + "name": "psr/container", + "version": "1.0.0", + "version_normalized": "1.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "time": "2017-02-14T16:28:37+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ] + }, { "name": "psr/http-message", "version": "1.0.1", @@ -1227,6 +3687,181 @@ "response" ] }, + { + "name": "psr/log", + "version": "1.1.3", + "version_normalized": "1.1.3.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "time": "2020-03-23T09:12:05+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ] + }, + { + "name": "psr/simple-cache", + "version": "1.0.1", + "version_normalized": "1.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "time": "2017-10-23T01:57:42+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ] + }, + { + "name": "psy/psysh", + "version": "v0.9.12", + "version_normalized": "0.9.12.0", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "90da7f37568aee36b116a030c5f99c915267edd4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/90da7f37568aee36b116a030c5f99c915267edd4", + "reference": "90da7f37568aee36b116a030c5f99c915267edd4", + "shasum": "" + }, + "require": { + "dnoegel/php-xdg-base-dir": "0.1.*", + "ext-json": "*", + "ext-tokenizer": "*", + "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|~5.0", + "symfony/var-dumper": "~2.7|~3.0|~4.0|~5.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2", + "hoa/console": "~2.15|~3.16", + "phpunit/phpunit": "~4.8.35|~5.0|~6.0|~7.0" + }, + "suggest": { + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-pdo-sqlite": "The doc command requires SQLite to work.", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", + "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": "2019-12-06T14:19:43+00:00", + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-develop": "0.9.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Psy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "http://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ] + }, { "name": "ralouphie/getallheaders", "version": "3.0.3", @@ -1269,6 +3904,645 @@ ], "description": "A polyfill for getallheaders." }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "1.0.1", + "version_normalized": "1.0.1.0", + "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" + }, + "time": "2017-03-04T06:30:41+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "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/" + }, + { + "name": "sebastian/comparator", + "version": "3.0.2", + "version_normalized": "3.0.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", + "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", + "shasum": "" + }, + "require": { + "php": "^7.1", + "sebastian/diff": "^3.0", + "sebastian/exporter": "^3.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.1" + }, + "time": "2018-07-12T15:12:46+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "installation-source": "dist", + "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" + ] + }, + { + "name": "sebastian/diff", + "version": "3.0.2", + "version_normalized": "3.0.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29", + "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.5 || ^8.0", + "symfony/process": "^2 || ^3.3 || ^4" + }, + "time": "2019-02-04T06:01:07+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "installation-source": "dist", + "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", + "udiff", + "unidiff", + "unified diff" + ] + }, + { + "name": "sebastian/environment", + "version": "4.2.3", + "version_normalized": "4.2.3.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/464c90d7bdf5ad4e8a6aea15c091fec0603d4368", + "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.5" + }, + "suggest": { + "ext-posix": "*" + }, + "time": "2019-11-20T08:46:58+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "installation-source": "dist", + "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" + ] + }, + { + "name": "sebastian/exporter", + "version": "3.1.2", + "version_normalized": "3.1.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e", + "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e", + "shasum": "" + }, + "require": { + "php": "^7.0", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^6.0" + }, + "time": "2019-09-14T09:02:43+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ] + }, + { + "name": "sebastian/global-state", + "version": "3.0.0", + "version_normalized": "3.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4", + "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4", + "shasum": "" + }, + "require": { + "php": "^7.2", + "sebastian/object-reflector": "^1.1.1", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^8.0" + }, + "suggest": { + "ext-uopz": "*" + }, + "time": "2019-02-01T05:30:01+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "installation-source": "dist", + "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" + ] + }, + { + "name": "sebastian/object-enumerator", + "version": "3.0.3", + "version_normalized": "3.0.3.0", + "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" + }, + "time": "2017-08-03T12:35:26+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "installation-source": "dist", + "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/" + }, + { + "name": "sebastian/object-reflector", + "version": "1.1.1", + "version_normalized": "1.1.1.0", + "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" + }, + "time": "2017-03-29T09:07:27+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "installation-source": "dist", + "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/" + }, + { + "name": "sebastian/recursion-context", + "version": "3.0.0", + "version_normalized": "3.0.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" + }, + "time": "2017-03-03T06:23:57+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "installation-source": "dist", + "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" + }, + { + "name": "sebastian/resource-operations", + "version": "2.0.1", + "version_normalized": "2.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9", + "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "time": "2018-10-04T04:07:39+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "installation-source": "dist", + "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" + }, + { + "name": "sebastian/type", + "version": "1.1.3", + "version_normalized": "1.1.3.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/3aaaa15fa71d27650d62a948be022fe3b48541a3", + "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3", + "shasum": "" + }, + "require": { + "php": "^7.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.2" + }, + "time": "2019-07-02T08:10:15+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type" + }, + { + "name": "sebastian/version", + "version": "2.0.1", + "version_normalized": "2.0.1.0", + "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" + }, + "time": "2016-10-03T07:35:21+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "installation-source": "dist", + "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" + }, { "name": "stomp-php/stomp-php", "version": "4.6.1", @@ -1339,5 +4613,1838 @@ "type": "github" } ] + }, + { + "name": "symfony/config", + "version": "v2.8.52", + "version_normalized": "2.8.52.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "7dd5f5040dc04c118d057fb5886563963eb70011" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/7dd5f5040dc04c118d057fb5886563963eb70011", + "reference": "7dd5f5040dc04c118d057fb5886563963eb70011", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "symfony/filesystem": "~2.3|~3.0.0", + "symfony/polyfill-ctype": "~1.8" + }, + "require-dev": { + "symfony/yaml": "~2.7|~3.0.0" + }, + "suggest": { + "symfony/yaml": "To use the yaml reference dumper" + }, + "time": "2018-11-26T09:38:12+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Config\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Config Component", + "homepage": "https://symfony.com" + }, + { + "name": "symfony/console", + "version": "v2.8.52", + "version_normalized": "2.8.52.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "cbcf4b5e233af15cd2bbd50dee1ccc9b7927dc12" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/cbcf4b5e233af15cd2bbd50dee1ccc9b7927dc12", + "reference": "cbcf4b5e233af15cd2bbd50dee1ccc9b7927dc12", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "symfony/debug": "^2.7.2|~3.0.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/event-dispatcher": "~2.1|~3.0.0", + "symfony/process": "~2.1|~3.0.0" + }, + "suggest": { + "psr/log-implementation": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/process": "" + }, + "time": "2018-11-20T15:55:20+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com" + }, + { + "name": "symfony/debug", + "version": "v3.0.9", + "version_normalized": "3.0.9.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/debug.git", + "reference": "697c527acd9ea1b2d3efac34d9806bf255278b0a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/debug/zipball/697c527acd9ea1b2d3efac34d9806bf255278b0a", + "reference": "697c527acd9ea1b2d3efac34d9806bf255278b0a", + "shasum": "" + }, + "require": { + "php": ">=5.5.9", + "psr/log": "~1.0" + }, + "conflict": { + "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" + }, + "require-dev": { + "symfony/class-loader": "~2.8|~3.0", + "symfony/http-kernel": "~2.8|~3.0" + }, + "time": "2016-07-30T07:22:48+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Debug\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Debug Component", + "homepage": "https://symfony.com" + }, + { + "name": "symfony/event-dispatcher", + "version": "v2.8.52", + "version_normalized": "2.8.52.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "a77e974a5fecb4398833b0709210e3d5e334ffb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/a77e974a5fecb4398833b0709210e3d5e334ffb0", + "reference": "a77e974a5fecb4398833b0709210e3d5e334ffb0", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "^2.0.5|~3.0.0", + "symfony/dependency-injection": "~2.6|~3.0.0", + "symfony/expression-language": "~2.6|~3.0.0", + "symfony/stopwatch": "~2.3|~3.0.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "time": "2018-11-21T14:20:20+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "https://symfony.com" + }, + { + "name": "symfony/filesystem", + "version": "v3.0.9", + "version_normalized": "3.0.9.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "b2da5009d9bacbd91d83486aa1f44c793a8c380d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/b2da5009d9bacbd91d83486aa1f44c793a8c380d", + "reference": "b2da5009d9bacbd91d83486aa1f44c793a8c380d", + "shasum": "" + }, + "require": { + "php": ">=5.5.9" + }, + "time": "2016-07-20T05:43:46+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Filesystem Component", + "homepage": "https://symfony.com" + }, + { + "name": "symfony/finder", + "version": "v2.8.52", + "version_normalized": "2.8.52.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "1444eac52273e345d9b95129bf914639305a9ba4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/1444eac52273e345d9b95129bf914639305a9ba4", + "reference": "1444eac52273e345d9b95129bf914639305a9ba4", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "time": "2018-11-11T11:18:13+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "https://symfony.com" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.18.0", + "version_normalized": "1.18.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "1c302646f6efc070cd46856e600e5e0684d6b454" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/1c302646f6efc070cd46856e600e5e0684d6b454", + "reference": "1c302646f6efc070cd46856e600e5e0684d6b454", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "time": "2020-07-14T12:35:20+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ] + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.18.0", + "version_normalized": "1.18.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/a6977d63bf9a0ad4c65cd352709e230876f9904a", + "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "time": "2020-07-14T12:35:20+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "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": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ] + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.18.0", + "version_normalized": "1.18.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "639447d008615574653fb3bc60d1986d7172eaae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/639447d008615574653fb3bc60d1986d7172eaae", + "reference": "639447d008615574653fb3bc60d1986d7172eaae", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "time": "2020-07-14T12:35:20+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "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": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ] + }, + { + "name": "symfony/process", + "version": "v2.8.52", + "version_normalized": "2.8.52.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "c3591a09c78639822b0b290d44edb69bf9f05dc8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/c3591a09c78639822b0b290d44edb69bf9f05dc8", + "reference": "c3591a09c78639822b0b290d44edb69bf9f05dc8", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "time": "2018-11-11T11:18:13+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "https://symfony.com" + }, + { + "name": "symfony/stopwatch", + "version": "v2.8.52", + "version_normalized": "2.8.52.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "752586c80af8a85aeb74d1ae8202411c68836663" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/752586c80af8a85aeb74d1ae8202411c68836663", + "reference": "752586c80af8a85aeb74d1ae8202411c68836663", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "time": "2018-11-11T11:18:13+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Stopwatch Component", + "homepage": "https://symfony.com" + }, + { + "name": "symfony/translation", + "version": "v3.0.9", + "version_normalized": "3.0.9.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "eee6c664853fd0576f21ae25725cfffeafe83f26" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/eee6c664853fd0576f21ae25725cfffeafe83f26", + "reference": "eee6c664853fd0576f21ae25725cfffeafe83f26", + "shasum": "" + }, + "require": { + "php": ">=5.5.9", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/config": "<2.8" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~2.8|~3.0", + "symfony/intl": "~2.8|~3.0", + "symfony/yaml": "~2.8|~3.0" + }, + "suggest": { + "psr/log": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "time": "2016-07-30T07:22:48+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Translation Component", + "homepage": "https://symfony.com" + }, + { + "name": "symfony/validator", + "version": "v2.8.52", + "version_normalized": "2.8.52.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/validator.git", + "reference": "d5d2090bba3139d8ddb79959fbf516e87238fe3a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/validator/zipball/d5d2090bba3139d8ddb79959fbf516e87238fe3a", + "reference": "d5d2090bba3139d8ddb79959fbf516e87238fe3a", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation": "~2.4|~3.0.0" + }, + "require-dev": { + "doctrine/annotations": "~1.0", + "doctrine/cache": "~1.0", + "egulias/email-validator": "^1.2.1", + "symfony/config": "~2.2|~3.0.0", + "symfony/expression-language": "~2.4|~3.0.0", + "symfony/http-foundation": "~2.3|~3.0.0", + "symfony/intl": "~2.7.25|^2.8.18|~3.2.5", + "symfony/property-access": "~2.3|~3.0.0", + "symfony/yaml": "^2.0.5|~3.0.0" + }, + "suggest": { + "doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.", + "doctrine/cache": "For using the default cached annotation reader and metadata cache.", + "egulias/email-validator": "Strict (RFC compliant) email validation", + "symfony/config": "", + "symfony/expression-language": "For using the 2.4 Expression validator", + "symfony/http-foundation": "", + "symfony/intl": "", + "symfony/property-access": "For using the 2.4 Validator API", + "symfony/yaml": "" + }, + "time": "2018-11-14T14:06:48+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Validator\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Validator Component", + "homepage": "https://symfony.com" + }, + { + "name": "symfony/var-dumper", + "version": "v4.0.15", + "version_normalized": "4.0.15.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "3af63f44ddb45b03af4d172a4ce3e5c58b25fc5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/3af63f44ddb45b03af4d172a4ce3e5c58b25fc5b", + "reference": "3af63f44ddb45b03af4d172a4ce3e5c58b25fc5b", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php72": "~1.5" + }, + "conflict": { + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0" + }, + "require-dev": { + "ext-iconv": "*", + "twig/twig": "~1.34|~2.4" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump" + }, + "time": "2018-07-26T11:22:46+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "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": "Symfony mechanism for exploring and dumping PHP variables", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ] + }, + { + "name": "theseer/tokenizer", + "version": "1.2.0", + "version_normalized": "1.2.0.0", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "75a63c33a8577608444246075ea0af0d052e452a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a", + "reference": "75a63c33a8577608444246075ea0af0d052e452a", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "time": "2020-07-12T23:59:07+00:00", + "type": "library", + "installation-source": "dist", + "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", + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ] + }, + { + "name": "twig/twig", + "version": "v1.43.0", + "version_normalized": "1.43.0.0", + "source": { + "type": "git", + "url": "https://github.com/twigphp/Twig.git", + "reference": "597a03e85a60af6feee4f5127f3ef4279a1694c3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/597a03e85a60af6feee4f5127f3ef4279a1694c3", + "reference": "597a03e85a60af6feee4f5127f3ef4279a1694c3", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "symfony/polyfill-ctype": "^1.8" + }, + "require-dev": { + "psr/container": "^1.0", + "symfony/phpunit-bridge": "^4.4.9|^5.0.9" + }, + "time": "2020-07-05T13:00:49+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.43-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "Twig_": "lib/" + }, + "psr-4": { + "Twig\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Twig Team", + "role": "Contributors" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "https://twig.symfony.com", + "keywords": [ + "templating" + ], + "funding": [ + { + "url": "https://certification.symfony.com/", + "type": "custom" + }, + { + "url": "https://live.symfony.com/", + "type": "custom" + }, + { + "url": "https://symfony.com/cloud/", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" + } + ] + }, + { + "name": "webmozart/assert", + "version": "1.9.1", + "version_normalized": "1.9.1.0", + "source": { + "type": "git", + "url": "https://github.com/webmozart/assert.git", + "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389", + "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0 || ^8.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<3.9.1" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.36 || ^7.5.13" + }, + "time": "2020-07-08T17:02:28+00:00", + "type": "library", + "installation-source": "dist", + "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" + ] + }, + { + "name": "zendframework/zend-cache", + "version": "2.8.3", + "version_normalized": "2.8.3.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-cache.git", + "reference": "edde41f1ee5c28e01701a032f434d03751b65df4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-cache/zipball/edde41f1ee5c28e01701a032f434d03751b65df4", + "reference": "edde41f1ee5c28e01701a032f434d03751b65df4", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0", + "psr/cache": "^1.0", + "psr/simple-cache": "^1.0", + "zendframework/zend-eventmanager": "^2.6.3 || ^3.2", + "zendframework/zend-servicemanager": "^2.7.8 || ^3.3", + "zendframework/zend-stdlib": "^2.7.7 || ^3.1" + }, + "provide": { + "psr/cache-implementation": "1.0", + "psr/simple-cache-implementation": "1.0" + }, + "require-dev": { + "cache/integration-tests": "^0.16", + "phpbench/phpbench": "^0.13", + "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2", + "zendframework/zend-coding-standard": "~1.0.0", + "zendframework/zend-serializer": "^2.6", + "zendframework/zend-session": "^2.7.4" + }, + "suggest": { + "ext-apc": "APC or compatible extension, to use the APC storage adapter", + "ext-apcu": "APCU >= 5.1.0, to use the APCu storage adapter", + "ext-dba": "DBA, to use the DBA storage adapter", + "ext-memcache": "Memcache >= 2.0.0 to use the Memcache storage adapter", + "ext-memcached": "Memcached >= 1.0.0 to use the Memcached storage adapter", + "ext-mongo": "Mongo, to use MongoDb storage adapter", + "ext-mongodb": "MongoDB, to use the ExtMongoDb storage adapter", + "ext-redis": "Redis, to use Redis storage adapter", + "ext-wincache": "WinCache, to use the WinCache storage adapter", + "ext-xcache": "XCache, to use the XCache storage adapter", + "mongodb/mongodb": "Required for use with the ext-mongodb adapter", + "mongofill/mongofill": "Alternative to ext-mongo - a pure PHP implementation designed as a drop in replacement", + "zendframework/zend-serializer": "Zend\\Serializer component", + "zendframework/zend-session": "Zend\\Session component" + }, + "time": "2019-08-28T21:34:32+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8.x-dev", + "dev-develop": "2.9.x-dev" + }, + "zf": { + "component": "Zend\\Cache", + "config-provider": "Zend\\Cache\\ConfigProvider" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "autoload/patternPluginManagerPolyfill.php" + ], + "psr-4": { + "Zend\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Caching implementation with a variety of storage options, as well as codified caching strategies for callbacks, classes, and output", + "keywords": [ + "ZendFramework", + "cache", + "psr-16", + "psr-6", + "zf" + ], + "abandoned": "laminas/laminas-cache" + }, + { + "name": "zendframework/zend-config", + "version": "2.6.0", + "version_normalized": "2.6.0.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-config.git", + "reference": "2920e877a9f6dca9fa8f6bd3b1ffc2e19bb1e30d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-config/zipball/2920e877a9f6dca9fa8f6bd3b1ffc2e19bb1e30d", + "reference": "2920e877a9f6dca9fa8f6bd3b1ffc2e19bb1e30d", + "shasum": "" + }, + "require": { + "php": "^5.5 || ^7.0", + "zendframework/zend-stdlib": "^2.7 || ^3.0" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "zendframework/zend-filter": "^2.6", + "zendframework/zend-i18n": "^2.5", + "zendframework/zend-json": "^2.6.1", + "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3" + }, + "suggest": { + "zendframework/zend-filter": "Zend\\Filter component", + "zendframework/zend-i18n": "Zend\\I18n component", + "zendframework/zend-json": "Zend\\Json to use the Json reader or writer classes", + "zendframework/zend-servicemanager": "Zend\\ServiceManager for use with the Config Factory to retrieve reader and writer instances" + }, + "time": "2016-02-04T23:01:10+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6-dev", + "dev-develop": "2.7-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Zend\\Config\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides a nested object property based user interface for accessing this configuration data within application code", + "homepage": "https://github.com/zendframework/zend-config", + "keywords": [ + "config", + "zf2" + ], + "abandoned": "laminas/laminas-config" + }, + { + "name": "zendframework/zend-eventmanager", + "version": "3.2.1", + "version_normalized": "3.2.1.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-eventmanager.git", + "reference": "a5e2583a211f73604691586b8406ff7296a946dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-eventmanager/zipball/a5e2583a211f73604691586b8406ff7296a946dd", + "reference": "a5e2583a211f73604691586b8406ff7296a946dd", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "athletic/athletic": "^0.1", + "container-interop/container-interop": "^1.1.0", + "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2", + "zendframework/zend-coding-standard": "~1.0.0", + "zendframework/zend-stdlib": "^2.7.3 || ^3.0" + }, + "suggest": { + "container-interop/container-interop": "^1.1.0, to use the lazy listeners feature", + "zendframework/zend-stdlib": "^2.7.3 || ^3.0, to use the FilterChain feature" + }, + "time": "2018-04-25T15:33:34+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev", + "dev-develop": "3.3-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Zend\\EventManager\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Trigger and listen to events within a PHP application", + "homepage": "https://github.com/zendframework/zend-eventmanager", + "keywords": [ + "event", + "eventmanager", + "events", + "zf2" + ], + "abandoned": "laminas/laminas-eventmanager" + }, + { + "name": "zendframework/zend-filter", + "version": "2.9.2", + "version_normalized": "2.9.2.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-filter.git", + "reference": "d78f2cdde1c31975e18b2a0753381ed7b61118ef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-filter/zipball/d78f2cdde1c31975e18b2a0753381ed7b61118ef", + "reference": "d78f2cdde1c31975e18b2a0753381ed7b61118ef", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0", + "zendframework/zend-stdlib": "^2.7.7 || ^3.1" + }, + "conflict": { + "zendframework/zend-validator": "<2.10.1" + }, + "require-dev": { + "pear/archive_tar": "^1.4.3", + "phpunit/phpunit": "^5.7.23 || ^6.4.3", + "psr/http-factory": "^1.0", + "zendframework/zend-coding-standard": "~1.0.0", + "zendframework/zend-crypt": "^3.2.1", + "zendframework/zend-servicemanager": "^2.7.8 || ^3.3", + "zendframework/zend-uri": "^2.6" + }, + "suggest": { + "psr/http-factory-implementation": "psr/http-factory-implementation, for creating file upload instances when consuming PSR-7 in file upload filters", + "zendframework/zend-crypt": "Zend\\Crypt component, for encryption filters", + "zendframework/zend-i18n": "Zend\\I18n component for filters depending on i18n functionality", + "zendframework/zend-servicemanager": "Zend\\ServiceManager component, for using the filter chain functionality", + "zendframework/zend-uri": "Zend\\Uri component, for the UriNormalize filter" + }, + "time": "2019-08-19T07:08:04+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.9.x-dev", + "dev-develop": "2.10.x-dev" + }, + "zf": { + "component": "Zend\\Filter", + "config-provider": "Zend\\Filter\\ConfigProvider" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Zend\\Filter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Programmatically filter and normalize data and files", + "keywords": [ + "ZendFramework", + "filter", + "zf" + ], + "abandoned": "laminas/laminas-filter" + }, + { + "name": "zendframework/zend-hydrator", + "version": "1.1.0", + "version_normalized": "1.1.0.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-hydrator.git", + "reference": "22652e1661a5a10b3f564cf7824a2206cf5a4a65" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-hydrator/zipball/22652e1661a5a10b3f564cf7824a2206cf5a4a65", + "reference": "22652e1661a5a10b3f564cf7824a2206cf5a4a65", + "shasum": "" + }, + "require": { + "php": "^5.5 || ^7.0", + "zendframework/zend-stdlib": "^2.7 || ^3.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "^2.0@dev", + "zendframework/zend-eventmanager": "^2.6.2 || ^3.0", + "zendframework/zend-filter": "^2.6", + "zendframework/zend-inputfilter": "^2.6", + "zendframework/zend-serializer": "^2.6.1", + "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3" + }, + "suggest": { + "zendframework/zend-eventmanager": "^2.6.2 || ^3.0, to support aggregate hydrator usage", + "zendframework/zend-filter": "^2.6, to support naming strategy hydrator usage", + "zendframework/zend-serializer": "^2.6.1, to use the SerializableStrategy", + "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3, to support hydrator plugin manager usage" + }, + "time": "2016-02-18T22:38:26+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-release-1.0": "1.0-dev", + "dev-release-1.1": "1.1-dev", + "dev-master": "2.0-dev", + "dev-develop": "2.1-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Zend\\Hydrator\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-hydrator", + "keywords": [ + "hydrator", + "zf2" + ], + "abandoned": "laminas/laminas-hydrator" + }, + { + "name": "zendframework/zend-i18n", + "version": "2.10.1", + "version_normalized": "2.10.1.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-i18n.git", + "reference": "84038e6a1838b611dcc491b1c40321fa4c3a123c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-i18n/zipball/84038e6a1838b611dcc491b1c40321fa4c3a123c", + "reference": "84038e6a1838b611dcc491b1c40321fa4c3a123c", + "shasum": "" + }, + "require": { + "ext-intl": "*", + "php": "^5.6 || ^7.0", + "zendframework/zend-stdlib": "^2.7 || ^3.0" + }, + "conflict": { + "phpspec/prophecy": "<1.9.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7.27 || ^6.5.14 || ^7.5.16", + "zendframework/zend-cache": "^2.6.1", + "zendframework/zend-coding-standard": "~1.0.0", + "zendframework/zend-config": "^2.6", + "zendframework/zend-eventmanager": "^2.6.2 || ^3.0", + "zendframework/zend-filter": "^2.6.1", + "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3", + "zendframework/zend-validator": "^2.6", + "zendframework/zend-view": "^2.6.3" + }, + "suggest": { + "zendframework/zend-cache": "Zend\\Cache component", + "zendframework/zend-config": "Zend\\Config component", + "zendframework/zend-eventmanager": "You should install this package to use the events in the translator", + "zendframework/zend-filter": "You should install this package to use the provided filters", + "zendframework/zend-i18n-resources": "Translation resources", + "zendframework/zend-servicemanager": "Zend\\ServiceManager component", + "zendframework/zend-validator": "You should install this package to use the provided validators", + "zendframework/zend-view": "You should install this package to use the provided view helpers" + }, + "time": "2019-12-12T14:08:22+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.10.x-dev", + "dev-develop": "2.11.x-dev" + }, + "zf": { + "component": "Zend\\I18n", + "config-provider": "Zend\\I18n\\ConfigProvider" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Zend\\I18n\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Provide translations for your application, and filter and validate internationalized values", + "keywords": [ + "ZendFramework", + "i18n", + "zf" + ], + "abandoned": "laminas/laminas-i18n" + }, + { + "name": "zendframework/zend-json", + "version": "3.1.2", + "version_normalized": "3.1.2.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-json.git", + "reference": "e9ddb1192d93fe7fff846ac895249c39db75132b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-json/zipball/e9ddb1192d93fe7fff846ac895249c39db75132b", + "reference": "e9ddb1192d93fe7fff846ac895249c39db75132b", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7.23 || ^6.4.3", + "zendframework/zend-coding-standard": "~1.0.0", + "zendframework/zend-stdlib": "^2.7.7 || ^3.1" + }, + "suggest": { + "zendframework/zend-json-server": "For implementing JSON-RPC servers", + "zendframework/zend-xml2json": "For converting XML documents to JSON" + }, + "time": "2019-10-09T13:56:13+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1.x-dev", + "dev-develop": "3.2.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Zend\\Json\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides convenience methods for serializing native PHP to JSON and decoding JSON to native PHP", + "keywords": [ + "ZendFramework", + "json", + "zf" + ], + "abandoned": "laminas/laminas-json" + }, + { + "name": "zendframework/zend-serializer", + "version": "2.9.1", + "version_normalized": "2.9.1.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-serializer.git", + "reference": "6fb7ae016cfdf0cfcdfa2b989e6a65f351170e21" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-serializer/zipball/6fb7ae016cfdf0cfcdfa2b989e6a65f351170e21", + "reference": "6fb7ae016cfdf0cfcdfa2b989e6a65f351170e21", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0", + "zendframework/zend-json": "^2.5 || ^3.0", + "zendframework/zend-stdlib": "^2.7 || ^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7.27 || ^6.5.14 || ^7.5.16", + "zendframework/zend-coding-standard": "~1.0.0", + "zendframework/zend-math": "^2.6 || ^3.0", + "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3" + }, + "suggest": { + "zendframework/zend-math": "(^2.6 || ^3.0) To support Python Pickle serialization", + "zendframework/zend-servicemanager": "(^2.7.5 || ^3.0.3) To support plugin manager support" + }, + "time": "2019-10-19T08:06:30+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.9.x-dev", + "dev-develop": "2.10.x-dev" + }, + "zf": { + "component": "Zend\\Serializer", + "config-provider": "Zend\\Serializer\\ConfigProvider" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Zend\\Serializer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Serialize and deserialize PHP structures to a variety of representations", + "keywords": [ + "ZendFramework", + "serializer", + "zf" + ], + "abandoned": "laminas/laminas-serializer" + }, + { + "name": "zendframework/zend-servicemanager", + "version": "2.7.11", + "version_normalized": "2.7.11.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-servicemanager.git", + "reference": "99ec9ed5d0f15aed9876433c74c2709eb933d4c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-servicemanager/zipball/99ec9ed5d0f15aed9876433c74c2709eb933d4c7", + "reference": "99ec9ed5d0f15aed9876433c74c2709eb933d4c7", + "shasum": "" + }, + "require": { + "container-interop/container-interop": "~1.0", + "php": "^5.5 || ^7.0" + }, + "require-dev": { + "athletic/athletic": "dev-master", + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "zendframework/zend-di": "~2.5", + "zendframework/zend-mvc": "~2.5" + }, + "suggest": { + "ocramius/proxy-manager": "ProxyManager 0.5.* to handle lazy initialization of services", + "zendframework/zend-di": "Zend\\Di component" + }, + "time": "2018-06-22T14:49:54+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev", + "dev-develop": "3.0-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Zend\\ServiceManager\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-servicemanager", + "keywords": [ + "servicemanager", + "zf2" + ], + "abandoned": "laminas/laminas-servicemanager" + }, + { + "name": "zendframework/zend-stdlib", + "version": "2.7.7", + "version_normalized": "2.7.7.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-stdlib.git", + "reference": "0e44eb46788f65e09e077eb7f44d2659143bcc1f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-stdlib/zipball/0e44eb46788f65e09e077eb7f44d2659143bcc1f", + "reference": "0e44eb46788f65e09e077eb7f44d2659143bcc1f", + "shasum": "" + }, + "require": { + "php": "^5.5 || ^7.0", + "zendframework/zend-hydrator": "~1.1" + }, + "require-dev": { + "athletic/athletic": "~0.1", + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "zendframework/zend-config": "~2.5", + "zendframework/zend-eventmanager": "~2.5", + "zendframework/zend-filter": "~2.5", + "zendframework/zend-inputfilter": "~2.5", + "zendframework/zend-serializer": "~2.5", + "zendframework/zend-servicemanager": "~2.5" + }, + "suggest": { + "zendframework/zend-eventmanager": "To support aggregate hydrator usage", + "zendframework/zend-filter": "To support naming strategy hydrator usage", + "zendframework/zend-serializer": "Zend\\Serializer component", + "zendframework/zend-servicemanager": "To support hydrator plugin manager usage" + }, + "time": "2016-04-12T21:17:31+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-release-2.7": "2.7-dev", + "dev-master": "3.0-dev", + "dev-develop": "3.1-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Zend\\Stdlib\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-stdlib", + "keywords": [ + "stdlib", + "zf2" + ], + "abandoned": "laminas/laminas-stdlib" + }, + { + "name": "zetacomponents/base", + "version": "1.9.1", + "version_normalized": "1.9.1.0", + "source": { + "type": "git", + "url": "https://github.com/zetacomponents/Base.git", + "reference": "489e20235989ddc97fdd793af31ac803972454f1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zetacomponents/Base/zipball/489e20235989ddc97fdd793af31ac803972454f1", + "reference": "489e20235989ddc97fdd793af31ac803972454f1", + "shasum": "" + }, + "require-dev": { + "phpunit/phpunit": "~5.7", + "zetacomponents/unit-test": "*" + }, + "time": "2017-11-28T11:30:00+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "classmap": [ + "src" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Sergey Alexeev" + }, + { + "name": "Sebastian Bergmann" + }, + { + "name": "Jan Borsodi" + }, + { + "name": "Raymond Bosman" + }, + { + "name": "Frederik Holljen" + }, + { + "name": "Kore Nordmann" + }, + { + "name": "Derick Rethans" + }, + { + "name": "Vadym Savchuk" + }, + { + "name": "Tobias Schlitt" + }, + { + "name": "Alexandru Stanoi" + } + ], + "description": "The Base package provides the basic infrastructure that all packages rely on. Therefore every component relies on this package.", + "homepage": "https://github.com/zetacomponents" + }, + { + "name": "zetacomponents/document", + "version": "1.3.1", + "version_normalized": "1.3.1.0", + "source": { + "type": "git", + "url": "https://github.com/zetacomponents/Document.git", + "reference": "688abfde573cf3fe0730f82538fbd7aa9fc95bc8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zetacomponents/Document/zipball/688abfde573cf3fe0730f82538fbd7aa9fc95bc8", + "reference": "688abfde573cf3fe0730f82538fbd7aa9fc95bc8", + "shasum": "" + }, + "require": { + "zetacomponents/base": "*" + }, + "require-dev": { + "zetacomponents/unit-test": "dev-master" + }, + "time": "2013-12-19T11:40:00+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "classmap": [ + "src" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Sebastian Bergmann" + }, + { + "name": "Kore Nordmann" + }, + { + "name": "Derick Rethans" + }, + { + "name": "Tobias Schlitt" + }, + { + "name": "Alexandru Stanoi" + } + ], + "description": "The Document components provides a general conversion framework for different semantic document markup languages like XHTML, Docbook, RST and similar.", + "homepage": "https://github.com/zetacomponents" } ] diff --git a/vendor/container-interop/container-interop/.gitignore b/vendor/container-interop/container-interop/.gitignore new file mode 100644 index 0000000000..b2395aa055 --- /dev/null +++ b/vendor/container-interop/container-interop/.gitignore @@ -0,0 +1,3 @@ +composer.lock +composer.phar +/vendor/ diff --git a/vendor/container-interop/container-interop/LICENSE b/vendor/container-interop/container-interop/LICENSE new file mode 100644 index 0000000000..7671d9020f --- /dev/null +++ b/vendor/container-interop/container-interop/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2013 container-interop + +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/container-interop/container-interop/README.md b/vendor/container-interop/container-interop/README.md new file mode 100644 index 0000000000..cdd7a44c8e --- /dev/null +++ b/vendor/container-interop/container-interop/README.md @@ -0,0 +1,148 @@ +# Container Interoperability + +[![Latest Stable Version](https://poser.pugx.org/container-interop/container-interop/v/stable.png)](https://packagist.org/packages/container-interop/container-interop) +[![Total Downloads](https://poser.pugx.org/container-interop/container-interop/downloads.svg)](https://packagist.org/packages/container-interop/container-interop) + +## Deprecation warning! + +Starting Feb. 13th 2017, container-interop is officially deprecated in favor of [PSR-11](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-11-container.md). +Container-interop has been the test-bed of PSR-11. From v1.2, container-interop directly extends PSR-11 interfaces. +Therefore, all containers implementing container-interop are now *de-facto* compatible with PSR-11. + +- Projects implementing container-interop interfaces are encouraged to directly implement PSR-11 interfaces instead. +- Projects consuming container-interop interfaces are very strongly encouraged to directly type-hint on PSR-11 interfaces, in order to be compatible with PSR-11 containers that are not compatible with container-interop. + +Regarding the delegate lookup feature, that is present in container-interop and not in PSR-11, the feature is actually a design pattern. It is therefore not deprecated. Documentation regarding this design pattern will be migrated from this repository into a separate website in the future. + +## About + +*container-interop* tries to identify and standardize features in *container* objects (service locators, +dependency injection containers, etc.) to achieve interoperability. + +Through discussions and trials, we try to create a standard, made of common interfaces but also recommendations. + +If PHP projects that provide container implementations begin to adopt these common standards, then PHP +applications and projects that use containers can depend on the common interfaces instead of specific +implementations. This facilitates a high-level of interoperability and flexibility that allows users to consume +*any* container implementation that can be adapted to these interfaces. + +The work done in this project is not officially endorsed by the [PHP-FIG](http://www.php-fig.org/), but it is being +worked on by members of PHP-FIG and other good developers. We adhere to the spirit and ideals of PHP-FIG, and hope +this project will pave the way for one or more future PSRs. + + +## Installation + +You can install this package through Composer: + +```json +composer require container-interop/container-interop +``` + +The packages adheres to the [SemVer](http://semver.org/) specification, and there will be full backward compatibility +between minor versions. + +## Standards + +### Available + +- [`ContainerInterface`](src/Interop/Container/ContainerInterface.php). +[Description](docs/ContainerInterface.md) [Meta Document](docs/ContainerInterface-meta.md). +Describes the interface of a container that exposes methods to read its entries. +- [*Delegate lookup feature*](docs/Delegate-lookup.md). +[Meta Document](docs/Delegate-lookup-meta.md). +Describes the ability for a container to delegate the lookup of its dependencies to a third-party container. This +feature lets several containers work together in a single application. + +### Proposed + +View open [request for comments](https://github.com/container-interop/container-interop/labels/RFC) + +## Compatible projects + +### Projects implementing `ContainerInterface` + +- [Acclimate](https://github.com/jeremeamia/acclimate-container): Adapters for + Aura.Di, Laravel, Nette DI, Pimple, Symfony DI, ZF2 Service manager, ZF2 + Dependency injection and any container using `ArrayAccess` +- [Aura.Di](https://github.com/auraphp/Aura.Di) +- [auryn-container-interop](https://github.com/elazar/auryn-container-interop) +- [Burlap](https://github.com/codeeverything/burlap) +- [Chernozem](https://github.com/pyrsmk/Chernozem) +- [Data Manager](https://github.com/chrismichaels84/data-manager) +- [Disco](https://github.com/bitexpert/disco) +- [InDI](https://github.com/idealogica/indi) +- [League/Container](http://container.thephpleague.com/) +- [Mouf](http://mouf-php.com) +- [Njasm Container](https://github.com/njasm/container) +- [PHP-DI](http://php-di.org) +- [Picotainer](https://github.com/thecodingmachine/picotainer) +- [PimpleInterop](https://github.com/moufmouf/pimple-interop) +- [Pimple3-ContainerInterop](https://github.com/Sam-Burns/pimple3-containerinterop) (using Pimple v3) +- [SitePoint Container](https://github.com/sitepoint/Container) +- [Thruster Container](https://github.com/ThrusterIO/container) (PHP7 only) +- [Ultra-Lite Container](https://github.com/ultra-lite/container) +- [Unbox](https://github.com/mindplay-dk/unbox) +- [XStatic](https://github.com/jeremeamia/xstatic) +- [Zend\ServiceManager](https://github.com/zendframework/zend-servicemanager) +- [Zit](https://github.com/inxilpro/Zit) + +### Projects implementing the *delegate lookup* feature + +- [Aura.Di](https://github.com/auraphp/Aura.Di) +- [Burlap](https://github.com/codeeverything/burlap) +- [Chernozem](https://github.com/pyrsmk/Chernozem) +- [InDI](https://github.com/idealogica/indi) +- [League/Container](http://container.thephpleague.com/) +- [Mouf](http://mouf-php.com) +- [Picotainer](https://github.com/thecodingmachine/picotainer) +- [PHP-DI](http://php-di.org) +- [PimpleInterop](https://github.com/moufmouf/pimple-interop) +- [Ultra-Lite Container](https://github.com/ultra-lite/container) + +### Middlewares implementing `ContainerInterface` + +- [Alias-Container](https://github.com/thecodingmachine/alias-container): add + aliases support to any container +- [Prefixer-Container](https://github.com/thecodingmachine/prefixer-container): + dynamically prefix identifiers +- [Lazy-Container](https://github.com/snapshotpl/lazy-container): lazy services + +### Projects using `ContainerInterface` + +The list below contains only a sample of all the projects consuming `ContainerInterface`. For a more complete list have a look [here](http://packanalyst.com/class?q=Interop%5CContainer%5CContainerInterface). + +| | Downloads | +| --- | --- | +| [Adroit](https://github.com/bitexpert/adroit) | ![](https://img.shields.io/packagist/dt/bitexpert/adroit.svg) | +| [Behat](https://github.com/Behat/Behat/pull/974) | ![](https://img.shields.io/packagist/dt/behat/behat.svg) | +| [blast-facades](https://github.com/phpthinktank/blast-facades): Minimize complexity and represent dependencies as facades. | ![](https://img.shields.io/packagist/dt/blast/facades.svg) | +| [interop.silex.di](https://github.com/thecodingmachine/interop.silex.di): an extension to [Silex](http://silex.sensiolabs.org/) that adds support for any *container-interop* compatible container | ![](https://img.shields.io/packagist/dt/mouf/interop.silex.di.svg) | +| [mindplay/walkway](https://github.com/mindplay-dk/walkway): a modular request router | ![](https://img.shields.io/packagist/dt/mindplay/walkway.svg) | +| [mindplay/middleman](https://github.com/mindplay-dk/middleman): minimalist PSR-7 middleware dispatcher | ![](https://img.shields.io/packagist/dt/mindplay/middleman.svg) | +| [PHP-DI/Invoker](https://github.com/PHP-DI/Invoker): extensible and configurable invoker/dispatcher | ![](https://img.shields.io/packagist/dt/php-di/invoker.svg) | +| [Prophiler](https://github.com/fabfuel/prophiler) | ![](https://img.shields.io/packagist/dt/fabfuel/prophiler.svg) | +| [Silly](https://github.com/mnapoli/silly): CLI micro-framework | ![](https://img.shields.io/packagist/dt/mnapoli/silly.svg) | +| [Slim v3](https://github.com/slimphp/Slim) | ![](https://img.shields.io/packagist/dt/slim/slim.svg) | +| [Splash](http://mouf-php.com/packages/mouf/mvc.splash-common/version/8.0-dev/README.md) | ![](https://img.shields.io/packagist/dt/mouf/mvc.splash-common.svg) | +| [Woohoo Labs. Harmony](https://github.com/woohoolabs/harmony): a flexible micro-framework | ![](https://img.shields.io/packagist/dt/woohoolabs/harmony.svg) | +| [zend-expressive](https://github.com/zendframework/zend-expressive) | ![](https://img.shields.io/packagist/dt/zendframework/zend-expressive.svg) | + + +## Workflow + +Everyone is welcome to join and contribute. + +The general workflow looks like this: + +1. Someone opens a discussion (GitHub issue) to suggest an interface +1. Feedback is gathered +1. The interface is added to a development branch +1. We release alpha versions so that the interface can be experimented with +1. Discussions and edits ensue until the interface is deemed stable by a general consensus +1. A new minor version of the package is released + +We try to not break BC by creating new interfaces instead of editing existing ones. + +While we currently work on interfaces, we are open to anything that might help towards interoperability, may that +be code, best practices, etc. diff --git a/vendor/container-interop/container-interop/composer.json b/vendor/container-interop/container-interop/composer.json new file mode 100644 index 0000000000..855f766723 --- /dev/null +++ b/vendor/container-interop/container-interop/composer.json @@ -0,0 +1,15 @@ +{ + "name": "container-interop/container-interop", + "type": "library", + "description": "Promoting the interoperability of container objects (DIC, SL, etc.)", + "homepage": "https://github.com/container-interop/container-interop", + "license": "MIT", + "autoload": { + "psr-4": { + "Interop\\Container\\": "src/Interop/Container/" + } + }, + "require": { + "psr/container": "^1.0" + } +} diff --git a/vendor/container-interop/container-interop/docs/ContainerInterface-meta.md b/vendor/container-interop/container-interop/docs/ContainerInterface-meta.md new file mode 100644 index 0000000000..59f3d5599f --- /dev/null +++ b/vendor/container-interop/container-interop/docs/ContainerInterface-meta.md @@ -0,0 +1,114 @@ +# ContainerInterface Meta Document + +## Introduction + +This document describes the process and discussions that lead to the `ContainerInterface`. +Its goal is to explain the reasons behind each decision. + +## Goal + +The goal set by `ContainerInterface` is to standardize how frameworks and libraries make use of a +container to obtain objects and parameters. + +By standardizing such a behavior, frameworks and libraries using the `ContainerInterface` +could work with any compatible container. +That would allow end users to choose their own container based on their own preferences. + +It is important to distinguish the two usages of a container: + +- configuring entries +- fetching entries + +Most of the time, those two sides are not used by the same party. +While it is often end users who tend to configure entries, it is generally the framework that fetch +entries to build the application. + +This is why this interface focuses only on how entries can be fetched from a container. + +## Interface name + +The interface name has been thoroughly discussed and was decided by a vote. + +The list of options considered with their respective votes are: + +- `ContainerInterface`: +8 +- `ProviderInterface`: +2 +- `LocatorInterface`: 0 +- `ReadableContainerInterface`: -5 +- `ServiceLocatorInterface`: -6 +- `ObjectFactory`: -6 +- `ObjectStore`: -8 +- `ConsumerInterface`: -9 + +[Full results of the vote](https://github.com/container-interop/container-interop/wiki/%231-interface-name:-Vote) + +The complete discussion can be read in [the issue #1](https://github.com/container-interop/container-interop/issues/1). + +## Interface methods + +The choice of which methods the interface would contain was made after a statistical analysis of existing containers. +The results of this analysis are available [in this document](https://gist.github.com/mnapoli/6159681). + +The summary of the analysis showed that: + +- all containers offer a method to get an entry by its id +- a large majority name such method `get()` +- for all containers, the `get()` method has 1 mandatory parameter of type string +- some containers have an optional additional argument for `get()`, but it doesn't have the same purpose between containers +- a large majority of the containers offer a method to test if it can return an entry by its id +- a majority name such method `has()` +- for all containers offering `has()`, the method has exactly 1 parameter of type string +- a large majority of the containers throw an exception rather than returning null when an entry is not found in `get()` +- a large majority of the containers don't implement `ArrayAccess` + +The question of whether to include methods to define entries has been discussed in +[issue #1](https://github.com/container-interop/container-interop/issues/1). +It has been judged that such methods do not belong in the interface described here because it is out of its scope +(see the "Goal" section). + +As a result, the `ContainerInterface` contains two methods: + +- `get()`, returning anything, with one mandatory string parameter. Should throw an exception if the entry is not found. +- `has()`, returning a boolean, with one mandatory string parameter. + +### Number of parameters in `get()` method + +While `ContainerInterface` only defines one mandatory parameter in `get()`, it is not incompatible with +existing containers that have additional optional parameters. PHP allows an implementation to offer more parameters +as long as they are optional, because the implementation *does* satisfy the interface. + +This issue has been discussed in [issue #6](https://github.com/container-interop/container-interop/issues/6). + +### Type of the `$id` parameter + +The type of the `$id` parameter in `get()` and `has()` has been discussed in +[issue #6](https://github.com/container-interop/container-interop/issues/6). +While `string` is used in all the containers that were analyzed, it was suggested that allowing +anything (such as objects) could allow containers to offer a more advanced query API. + +An example given was to use the container as an object builder. The `$id` parameter would then be an +object that would describe how to create an instance. + +The conclusion of the discussion was that this was beyond the scope of getting entries from a container without +knowing how the container provided them, and it was more fit for a factory. + +## Contributors + +Are listed here all people that contributed in the discussions or votes, by alphabetical order: + +- [Amy Stephen](https://github.com/AmyStephen) +- [David Négrier](https://github.com/moufmouf) +- [Don Gilbert](https://github.com/dongilbert) +- [Jason Judge](https://github.com/judgej) +- [Jeremy Lindblom](https://github.com/jeremeamia) +- [Marco Pivetta](https://github.com/Ocramius) +- [Matthieu Napoli](https://github.com/mnapoli) +- [Paul M. Jones](https://github.com/pmjones) +- [Stephan Hochdörfer](https://github.com/shochdoerfer) +- [Taylor Otwell](https://github.com/taylorotwell) + +## Relevant links + +- [`ContainerInterface.php`](https://github.com/container-interop/container-interop/blob/master/src/Interop/Container/ContainerInterface.php) +- [List of all issues](https://github.com/container-interop/container-interop/issues?labels=ContainerInterface&milestone=&page=1&state=closed) +- [Vote for the interface name](https://github.com/container-interop/container-interop/wiki/%231-interface-name:-Vote) diff --git a/vendor/container-interop/container-interop/docs/ContainerInterface.md b/vendor/container-interop/container-interop/docs/ContainerInterface.md new file mode 100644 index 0000000000..bda973d6fc --- /dev/null +++ b/vendor/container-interop/container-interop/docs/ContainerInterface.md @@ -0,0 +1,158 @@ +Container interface +=================== + +This document describes a common interface for dependency injection containers. + +The goal set by `ContainerInterface` is to standardize how frameworks and libraries make use of a +container to obtain objects and parameters (called *entries* in the rest of this document). + +The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", +"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be +interpreted as described in [RFC 2119][]. + +The word `implementor` in this document is to be interpreted as someone +implementing the `ContainerInterface` in a dependency injection-related library or framework. +Users of dependency injections containers (DIC) are referred to as `user`. + +[RFC 2119]: http://tools.ietf.org/html/rfc2119 + +1. Specification +----------------- + +### 1.1 Basics + +- The `Interop\Container\ContainerInterface` exposes two methods : `get` and `has`. + +- `get` takes one mandatory parameter: an entry identifier. It MUST be a string. + A call to `get` can return anything (a *mixed* value), or throws an exception if the identifier + is not known to the container. Two successive calls to `get` with the same + identifier SHOULD return the same value. However, depending on the `implementor` + design and/or `user` configuration, different values might be returned, so + `user` SHOULD NOT rely on getting the same value on 2 successive calls. + While `ContainerInterface` only defines one mandatory parameter in `get()`, implementations + MAY accept additional optional parameters. + +- `has` takes one unique parameter: an entry identifier. It MUST return `true` + if an entry identifier is known to the container and `false` if it is not. + `has($id)` returning true does not mean that `get($id)` will not throw an exception. + It does however mean that `get($id)` will not throw a `NotFoundException`. + +### 1.2 Exceptions + +Exceptions directly thrown by the container MUST implement the +[`Interop\Container\Exception\ContainerException`](../src/Interop/Container/Exception/ContainerException.php). + +A call to the `get` method with a non-existing id SHOULD throw a +[`Interop\Container\Exception\NotFoundException`](../src/Interop/Container/Exception/NotFoundException.php). + +### 1.3 Additional features + +This section describes additional features that MAY be added to a container. Containers are not +required to implement these features to respect the ContainerInterface. + +#### 1.3.1 Delegate lookup feature + +The goal of the *delegate lookup* feature is to allow several containers to share entries. +Containers implementing this feature can perform dependency lookups in other containers. + +Containers implementing this feature will offer a greater lever of interoperability +with other containers. Implementation of this feature is therefore RECOMMENDED. + +A container implementing this feature: + +- MUST implement the `ContainerInterface` +- MUST provide a way to register a delegate container (using a constructor parameter, or a setter, + or any possible way). The delegate container MUST implement the `ContainerInterface`. + +When a container is configured to use a delegate container for dependencies: + +- Calls to the `get` method should only return an entry if the entry is part of the container. + If the entry is not part of the container, an exception should be thrown + (as requested by the `ContainerInterface`). +- Calls to the `has` method should only return `true` if the entry is part of the container. + If the entry is not part of the container, `false` should be returned. +- If the fetched entry has dependencies, **instead** of performing + the dependency lookup in the container, the lookup is performed on the *delegate container*. + +Important! By default, the lookup SHOULD be performed on the delegate container **only**, not on the container itself. + +It is however allowed for containers to provide exception cases for special entries, and a way to lookup +into the same container (or another container) instead of the delegate container. + +2. Package +---------- + +The interfaces and classes described as well as relevant exception are provided as part of the +[container-interop/container-interop](https://packagist.org/packages/container-interop/container-interop) package. + +3. `Interop\Container\ContainerInterface` +----------------------------------------- + +```php +setParentContainer($this); + } + } + ... + } +} + +``` + +**Cons:** + +Cons have been extensively discussed [here](https://github.com/container-interop/container-interop/pull/8#issuecomment-51721777). +Basically, forcing a setter into an interface is a bad idea. Setters are similar to constructor arguments, +and it's a bad idea to standardize a constructor: how the delegate container is configured into a container is an implementation detail. This outweights the benefits of the interface. + +### 4.4 Alternative: no exception case for delegate lookups + +Originally, the proposed wording for delegate lookup calls was: + +> Important! The lookup MUST be performed on the delegate container **only**, not on the container itself. + +This was later replaced by: + +> Important! By default, the lookup SHOULD be performed on the delegate container **only**, not on the container itself. +> +> It is however allowed for containers to provide exception cases for special entries, and a way to lookup +> into the same container (or another container) instead of the delegate container. + +Exception cases have been allowed to avoid breaking dependencies with some services that must be provided +by the container (on @njasm proposal). This was proposed here: https://github.com/container-interop/container-interop/pull/20#issuecomment-56597235 + +### 4.5 Alternative: having one of the containers act as the composite container + +In real-life scenarios, we usually have a big framework (Symfony 2, Zend Framework 2, etc...) and we want to +add another DI container to this container. Most of the time, the "big" framework will be responsible for +creating the controller's instances, using it's own DI container. Until *container-interop* is fully adopted, +the "big" framework will not be aware of the existence of a composite container that it should use instead +of its own container. + +For this real-life use cases, @mnapoli and @moufmouf proposed to extend the "big" framework's DI container +to make it act as a composite container. + +This has been discussed [here](https://github.com/container-interop/container-interop/pull/8#issuecomment-40367194) +and [here](http://mouf-php.com/container-interop-whats-next#solution4). + +This was implemented in Symfony 2 using: + +- [interop.symfony.di](https://github.com/thecodingmachine/interop.symfony.di/tree/v0.1.0) +- [framework interop](https://github.com/mnapoli/framework-interop/) + +This was implemented in Silex using: + +- [interop.silex.di](https://github.com/thecodingmachine/interop.silex.di) + +Having a container act as the composite container is not part of the delegate lookup standard because it is +simply a temporary design pattern used to make existing frameworks that do not support yet ContainerInterop +play nice with other DI containers. + + +5. Implementations +------------------ + +The following projects already implement the delegate lookup feature: + +- [Mouf](http://mouf-php.com), through the [`setDelegateLookupContainer` method](https://github.com/thecodingmachine/mouf/blob/2.0/src/Mouf/MoufManager.php#L2120) +- [PHP-DI](http://php-di.org/), through the [`$wrapperContainer` parameter of the constructor](https://github.com/mnapoli/PHP-DI/blob/master/src/DI/Container.php#L72) +- [pimple-interop](https://github.com/moufmouf/pimple-interop), through the [`$container` parameter of the constructor](https://github.com/moufmouf/pimple-interop/blob/master/src/Interop/Container/Pimple/PimpleInterop.php#L62) + +6. People +--------- + +Are listed here all people that contributed in the discussions, by alphabetical order: + +- [Alexandru Pătrănescu](https://github.com/drealecs) +- [Ben Peachey](https://github.com/potherca) +- [David Négrier](https://github.com/moufmouf) +- [Jeremy Lindblom](https://github.com/jeremeamia) +- [Marco Pivetta](https://github.com/Ocramius) +- [Matthieu Napoli](https://github.com/mnapoli) +- [Nelson J Morais](https://github.com/njasm) +- [Phil Sturgeon](https://github.com/philsturgeon) +- [Stephan Hochdörfer](https://github.com/shochdoerfer) + +7. Relevant Links +----------------- + +_**Note:** Order descending chronologically._ + +- [Pull request on the delegate lookup feature](https://github.com/container-interop/container-interop/pull/20) +- [Pull request on the interface idea](https://github.com/container-interop/container-interop/pull/8) +- [Original article exposing the delegate lookup idea along many others](http://mouf-php.com/container-interop-whats-next) + diff --git a/vendor/container-interop/container-interop/docs/Delegate-lookup.md b/vendor/container-interop/container-interop/docs/Delegate-lookup.md new file mode 100644 index 0000000000..f64a8f785a --- /dev/null +++ b/vendor/container-interop/container-interop/docs/Delegate-lookup.md @@ -0,0 +1,60 @@ +Delegate lookup feature +======================= + +This document describes a standard for dependency injection containers. + +The goal set by the *delegate lookup* feature is to allow several containers to share entries. +Containers implementing this feature can perform dependency lookups in other containers. + +Containers implementing this feature will offer a greater lever of interoperability +with other containers. Implementation of this feature is therefore RECOMMENDED. + +The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", +"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be +interpreted as described in [RFC 2119][]. + +The word `implementor` in this document is to be interpreted as someone +implementing the delegate lookup feature in a dependency injection-related library or framework. +Users of dependency injections containers (DIC) are referred to as `user`. + +[RFC 2119]: http://tools.ietf.org/html/rfc2119 + +1. Vocabulary +------------- + +In a dependency injection container, the container is used to fetch entries. +Entries can have dependencies on other entries. Usually, these other entries are fetched by the container. + +The *delegate lookup* feature is the ability for a container to fetch dependencies in +another container. In the rest of the document, the word "container" will reference the container +implemented by the implementor. The word "delegate container" will reference the container we are +fetching the dependencies from. + +2. Specification +---------------- + +A container implementing the *delegate lookup* feature: + +- MUST implement the [`ContainerInterface`](ContainerInterface.md) +- MUST provide a way to register a delegate container (using a constructor parameter, or a setter, + or any possible way). The delegate container MUST implement the [`ContainerInterface`](ContainerInterface.md). + +When a container is configured to use a delegate container for dependencies: + +- Calls to the `get` method should only return an entry if the entry is part of the container. + If the entry is not part of the container, an exception should be thrown + (as requested by the [`ContainerInterface`](ContainerInterface.md)). +- Calls to the `has` method should only return `true` if the entry is part of the container. + If the entry is not part of the container, `false` should be returned. +- If the fetched entry has dependencies, **instead** of performing + the dependency lookup in the container, the lookup is performed on the *delegate container*. + +Important: By default, the dependency lookups SHOULD be performed on the delegate container **only**, not on the container itself. + +It is however allowed for containers to provide exception cases for special entries, and a way to lookup +into the same container (or another container) instead of the delegate container. + +3. Package / Interface +---------------------- + +This feature is not tied to any code, interface or package. diff --git a/vendor/container-interop/container-interop/docs/images/interoperating_containers.png b/vendor/container-interop/container-interop/docs/images/interoperating_containers.png new file mode 100644 index 0000000000..1d3fdd0ddb Binary files /dev/null and b/vendor/container-interop/container-interop/docs/images/interoperating_containers.png differ diff --git a/vendor/container-interop/container-interop/docs/images/priority.png b/vendor/container-interop/container-interop/docs/images/priority.png new file mode 100644 index 0000000000..d02cb7d1f1 Binary files /dev/null and b/vendor/container-interop/container-interop/docs/images/priority.png differ diff --git a/vendor/container-interop/container-interop/docs/images/side_by_side_containers.png b/vendor/container-interop/container-interop/docs/images/side_by_side_containers.png new file mode 100644 index 0000000000..87884bc292 Binary files /dev/null and b/vendor/container-interop/container-interop/docs/images/side_by_side_containers.png differ diff --git a/vendor/container-interop/container-interop/src/Interop/Container/ContainerInterface.php b/vendor/container-interop/container-interop/src/Interop/Container/ContainerInterface.php new file mode 100644 index 0000000000..a75468f6a4 --- /dev/null +++ b/vendor/container-interop/container-interop/src/Interop/Container/ContainerInterface.php @@ -0,0 +1,15 @@ +getHomeDir(); +echo $xdg->getHomeConfigDir(); +echo $xdg->getHomeDataDir(); +echo $xdg->getHomeCacheDir(); +echo $xdg->getRuntimeDir(); + +print_r($xdg->getDataDirs()); // returns array +print_r($xdg->getConfigDirs()); // returns array +``` + +## Testing + +``` bash +$ phpunit +``` + +## License + +The MIT License (MIT). Please see [License File](https://github.com/dnoegel/php-xdg-base-dir/blob/master/LICENSE) for more information. diff --git a/vendor/dnoegel/php-xdg-base-dir/composer.json b/vendor/dnoegel/php-xdg-base-dir/composer.json new file mode 100644 index 0000000000..94c463745b --- /dev/null +++ b/vendor/dnoegel/php-xdg-base-dir/composer.json @@ -0,0 +1,17 @@ +{ + "name": "dnoegel/php-xdg-base-dir", + "description": "implementation of xdg base directory specification for php", + "type": "library", + "license": "MIT", + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" + }, + "autoload": { + "psr-4": { + "XdgBaseDir\\": "src/" + } + } +} diff --git a/vendor/dnoegel/php-xdg-base-dir/src/Xdg.php b/vendor/dnoegel/php-xdg-base-dir/src/Xdg.php new file mode 100644 index 0000000000..2dd314d0bc --- /dev/null +++ b/vendor/dnoegel/php-xdg-base-dir/src/Xdg.php @@ -0,0 +1,132 @@ +getHomeDir(); + + $path = DIRECTORY_SEPARATOR === $homeDir ? $homeDir.'.config' : $homeDir . DIRECTORY_SEPARATOR . '.config'; + + return $path; + } + + /** + * @return string + */ + public function getHomeDataDir() + { + $path = getenv('XDG_DATA_HOME') ?: $this->getHomeDir() . DIRECTORY_SEPARATOR . '.local' . DIRECTORY_SEPARATOR . 'share'; + + return $path; + } + + /** + * @return array + */ + public function getConfigDirs() + { + $configDirs = getenv('XDG_CONFIG_DIRS') ? explode(':', getenv('XDG_CONFIG_DIRS')) : array('/etc/xdg'); + + $paths = array_merge(array($this->getHomeConfigDir()), $configDirs); + + return $paths; + } + + /** + * @return array + */ + public function getDataDirs() + { + $dataDirs = getenv('XDG_DATA_DIRS') ? explode(':', getenv('XDG_DATA_DIRS')) : array('/usr/local/share', '/usr/share'); + + $paths = array_merge(array($this->getHomeDataDir()), $dataDirs); + + return $paths; + } + + /** + * @return string + */ + public function getHomeCacheDir() + { + $path = getenv('XDG_CACHE_HOME') ?: $this->getHomeDir() . DIRECTORY_SEPARATOR . '.cache'; + + return $path; + + } + + public function getRuntimeDir($strict=true) + { + if ($runtimeDir = getenv('XDG_RUNTIME_DIR')) { + return $runtimeDir; + } + + if ($strict) { + throw new \RuntimeException('XDG_RUNTIME_DIR was not set'); + } + + $fallback = sys_get_temp_dir() . DIRECTORY_SEPARATOR . self::RUNTIME_DIR_FALLBACK . getenv('USER'); + + $create = false; + + if (!is_dir($fallback)) { + mkdir($fallback, 0700, true); + } + + $st = lstat($fallback); + + # The fallback must be a directory + if (!$st['mode'] & self::S_IFDIR) { + rmdir($fallback); + $create = true; + } elseif ($st['uid'] != $this->getUid() || + $st['mode'] & (self::S_IRWXG | self::S_IRWXO) + ) { + rmdir($fallback); + $create = true; + } + + if ($create) { + mkdir($fallback, 0700, true); + } + + return $fallback; + } + + private function getUid() + { + if (function_exists('posix_getuid')) { + return posix_getuid(); + } + + return getmyuid(); + } +} diff --git a/vendor/doctrine/annotations/.doctrine-project.json b/vendor/doctrine/annotations/.doctrine-project.json new file mode 100644 index 0000000000..25d470860a --- /dev/null +++ b/vendor/doctrine/annotations/.doctrine-project.json @@ -0,0 +1,40 @@ +{ + "active": true, + "name": "Annotations", + "slug": "annotations", + "docsSlug": "doctrine-annotations", + "versions": [ + { + "name": "1.9", + "branchName": "1.9", + "slug": "1.9", + "aliases": [ + "latest" + ], + "upcoming": true + }, + { + "name": "1.8", + "branchName": "1.8", + "slug": "1.8", + "current": true, + "aliases": [ + "current", + "stable" + ], + "maintained": true + }, + { + "name": "1.7", + "branchName": "1.7", + "slug": "1.7", + "maintained": false + }, + { + "name": "1.6", + "branchName": "1.6", + "slug": "1.6", + "maintained": false + } + ] +} diff --git a/vendor/doctrine/annotations/CHANGELOG.md b/vendor/doctrine/annotations/CHANGELOG.md new file mode 100644 index 0000000000..0b0ba1a71d --- /dev/null +++ b/vendor/doctrine/annotations/CHANGELOG.md @@ -0,0 +1,162 @@ +## Changelog + +### 1.6.1 + +This release fixes an issue in which annotations such as `@foo-bar` +and `@foo-` were incorrectly recognised as valid, and both erroneously +parsed as `@foo`. + +Any annotation with `@name-*` format will now silently be ignored, +allowing vendor-specific annotations to be prefixed with the tool +name. + +Total issues resolved: **3** + +- [165: Update the composer branch alias](https://github.com/doctrine/annotations/pull/165) thanks to @mikeSimonson +- [209: Change Annotation::value typehint to mixed](https://github.com/doctrine/annotations/pull/209) thanks to @malarzm +- [257: Skip parsing annotations containing dashes, such as `@Foo-bar`, or `@Foo-`](https://github.com/doctrine/annotations/pull/257) thanks to @Ocramius + +### 1.6.0 + +This release brings a new endpoint that make sure that you can't shoot yourself in the foot by calling ```registerLoader``` multiple times and a few tests improvements. + +Total issues resolved: **7** + +- [145: Memory leak in AnnotationRegistry::registerLoader() when called multiple times](https://github.com/doctrine/annotations/issues/145) thanks to @TriAnMan +- [146: Import error on @experimental Annotation](https://github.com/doctrine/annotations/issues/146) thanks to @aturki +- [147: Ignoring @experimental annotation used by Symfony 3.3 CacheAdapter](https://github.com/doctrine/annotations/pull/147) thanks to @aturki +- [151: Remove duplicate code in `DCOM58Test`](https://github.com/doctrine/annotations/pull/151) thanks to @tuanphpvn +- [161: Prevent loading class_exists multiple times](https://github.com/doctrine/annotations/pull/161) thanks to @jrjohnson +- [162: Add registerUniqueLoader to AnnotationRegistry](https://github.com/doctrine/annotations/pull/162) thanks to @jrjohnson +- [163: Use assertDirectoryExists and assertDirectoryNotExists](https://github.com/doctrine/annotations/pull/163) thanks to @carusogabriel + +Thanks to everyone involved in this release. + +### 1.5.0 + +This release increments the minimum supported PHP version to 7.1.0. + +Also, HHVM official support has been dropped. + +Some noticeable performance improvements to annotation autoloading +have been applied, making failed annotation autoloading less heavy +on the filesystem access. + +- [133: Add @throws annotation in AnnotationReader#__construct()](https://github.com/doctrine/annotations/issues/133) thanks to @SenseException +- [134: Require PHP 7.1, drop HHVM support](https://github.com/doctrine/annotations/issues/134) thanks to @lcobucci +- [135: Prevent the same loader from being registered twice](https://github.com/doctrine/annotations/issues/135) thanks to @jrjohnson +- [137: #135 optimise multiple class load attempts in AnnotationRegistry](https://github.com/doctrine/annotations/issues/137) thanks to @Ocramius + + +### 1.4.0 + +This release fix an issue were some annotations could be not loaded if the namespace in the use statement started with a backslash. +It also update the tests and drop the support for php 5.X + +- [115: Missing annotations with the latest composer version](https://github.com/doctrine/annotations/issues/115) thanks to @pascalporedda +- [120: Missing annotations with the latest composer version](https://github.com/doctrine/annotations/pull/120) thanks to @gnat42 +- [121: Adding a more detailed explanation of the test](https://github.com/doctrine/annotations/pull/121) thanks to @mikeSimonson +- [101: Test annotation parameters containing space](https://github.com/doctrine/annotations/pull/101) thanks to @mikeSimonson +- [111: Cleanup: move to correct phpunit assertions](https://github.com/doctrine/annotations/pull/111) thanks to @Ocramius +- [112: Removes support for PHP 5.x](https://github.com/doctrine/annotations/pull/112) thanks to @railto +- [113: bumped phpunit version to 5.7](https://github.com/doctrine/annotations/pull/113) thanks to @gabbydgab +- [114: Enhancement: Use SVG Travis build badge](https://github.com/doctrine/annotations/pull/114) thanks to @localheinz +- [118: Integrating PHPStan](https://github.com/doctrine/annotations/pull/118) thanks to @ondrejmirtes + +### 1.3.1 - 2016-12-30 + +This release fixes an issue with ignored annotations that were already +autoloaded, causing the `SimpleAnnotationReader` to pick them up +anyway. [#110](https://github.com/doctrine/annotations/pull/110) + +Additionally, an issue was fixed in the `CachedReader`, which was +not correctly checking the freshness of cached annotations when +traits were defined on a class. [#105](https://github.com/doctrine/annotations/pull/105) + +Total issues resolved: **2** + +- [105: Return single max timestamp](https://github.com/doctrine/annotations/pull/105) +- [110: setIgnoreNotImportedAnnotations(true) didn’t work for existing classes](https://github.com/doctrine/annotations/pull/110) + +### 1.3.0 + +This release introduces a PHP version bump. `doctrine/annotations` now requires PHP +5.6 or later to be installed. + +A series of additional improvements have been introduced: + + * support for PHP 7 "grouped use statements" + * support for ignoring entire namespace names + via `Doctrine\Common\Annotations\AnnotationReader::addGlobalIgnoredNamespace()` and + `Doctrine\Common\Annotations\DocParser::setIgnoredAnnotationNamespaces()`. This will + allow you to ignore annotations from namespaces that you cannot autoload + * testing all parent classes and interfaces when checking if the annotation cache + in the `CachedReader` is fresh + * simplifying the cache keys used by the `CachedReader`: keys are no longer artificially + namespaced, since `Doctrine\Common\Cache` already supports that + * corrected parsing of multibyte strings when `mbstring.func_overload` is enabled + * corrected parsing of annotations when `"\t"` is put before the first annotation + in a docblock + * allow skipping non-imported annotations when a custom `DocParser` is passed to + the `AnnotationReader` constructor + +Total issues resolved: **15** + +- [45: DocParser can now ignore whole namespaces](https://github.com/doctrine/annotations/pull/45) +- [57: Switch to the docker-based infrastructure on Travis](https://github.com/doctrine/annotations/pull/57) +- [59: opcache.load_comments has been removed from PHP 7](https://github.com/doctrine/annotations/pull/59) +- [62: [CachedReader\ Test traits and parent class to see if cache is fresh](https://github.com/doctrine/annotations/pull/62) +- [65: Remove cache salt making key unnecessarily long](https://github.com/doctrine/annotations/pull/65) +- [66: Fix of incorrect parsing multibyte strings](https://github.com/doctrine/annotations/pull/66) +- [68: Annotations that are indented by tab are not processed.](https://github.com/doctrine/annotations/issues/68) +- [69: Support for Group Use Statements](https://github.com/doctrine/annotations/pull/69) +- [70: Allow tab character before first annotation in DocBlock](https://github.com/doctrine/annotations/pull/70) +- [74: Ignore not registered annotations fix](https://github.com/doctrine/annotations/pull/74) +- [92: Added tests for AnnotationRegistry class.](https://github.com/doctrine/annotations/pull/92) +- [96: Fix/#62 check trait and parent class ttl in annotations](https://github.com/doctrine/annotations/pull/96) +- [97: Feature - #45 - allow ignoring entire namespaces](https://github.com/doctrine/annotations/pull/97) +- [98: Enhancement/#65 remove cache salt from cached reader](https://github.com/doctrine/annotations/pull/98) +- [99: Fix - #70 - allow tab character before first annotation in docblock](https://github.com/doctrine/annotations/pull/99) + +### 1.2.4 + +Total issues resolved: **1** + +- [51: FileCacheReader::saveCacheFile::unlink fix](https://github.com/doctrine/annotations/pull/51) + +### 1.2.3 + +Total issues resolved: [**2**](https://github.com/doctrine/annotations/milestones/v1.2.3) + +- [49: #46 - applying correct `chmod()` to generated cache file](https://github.com/doctrine/annotations/pull/49) +- [50: Hotfix: match escaped quotes (revert #44)](https://github.com/doctrine/annotations/pull/50) + +### 1.2.2 + +Total issues resolved: **4** + +- [43: Exclude files from distribution with .gitattributes](https://github.com/doctrine/annotations/pull/43) +- [44: Update DocLexer.php](https://github.com/doctrine/annotations/pull/44) +- [46: A plain "file_put_contents" can cause havoc](https://github.com/doctrine/annotations/pull/46) +- [48: Deprecating the `FileCacheReader` in 1.2.2: will be removed in 2.0.0](https://github.com/doctrine/annotations/pull/48) + +### 1.2.1 + +Total issues resolved: **4** + +- [38: fixes doctrine/common#326](https://github.com/doctrine/annotations/pull/38) +- [39: Remove superfluous NS](https://github.com/doctrine/annotations/pull/39) +- [41: Warn if load_comments is not enabled.](https://github.com/doctrine/annotations/pull/41) +- [42: Clean up unused uses](https://github.com/doctrine/annotations/pull/42) + +### 1.2.0 + + * HHVM support + * Allowing dangling comma in annotations + * Excluded annotations are no longer autoloaded + * Importing namespaces also in traits + * Added support for `::class` 5.5-style constant, works also in 5.3 and 5.4 + +### 1.1.0 + + * Add Exception when ZendOptimizer+ or Opcache is configured to drop comments diff --git a/vendor/doctrine/annotations/LICENSE b/vendor/doctrine/annotations/LICENSE new file mode 100644 index 0000000000..5e781fce4b --- /dev/null +++ b/vendor/doctrine/annotations/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2006-2013 Doctrine Project + +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/doctrine/annotations/README.md b/vendor/doctrine/annotations/README.md new file mode 100644 index 0000000000..a53b91f2b0 --- /dev/null +++ b/vendor/doctrine/annotations/README.md @@ -0,0 +1,17 @@ +# Doctrine Annotations + +[![Build Status](https://travis-ci.org/doctrine/annotations.svg?branch=master)](https://travis-ci.org/doctrine/annotations) +[![Dependency Status](https://www.versioneye.com/package/php--doctrine--annotations/badge.png)](https://www.versioneye.com/package/php--doctrine--annotations) +[![Reference Status](https://www.versioneye.com/php/doctrine:annotations/reference_badge.svg)](https://www.versioneye.com/php/doctrine:annotations/references) +[![Total Downloads](https://poser.pugx.org/doctrine/annotations/downloads.png)](https://packagist.org/packages/doctrine/annotations) +[![Latest Stable Version](https://poser.pugx.org/doctrine/annotations/v/stable.png)](https://packagist.org/packages/doctrine/annotations) + +Docblock Annotations Parser library (extracted from [Doctrine Common](https://github.com/doctrine/common)). + +## Documentation + +See the [doctrine-project website](https://www.doctrine-project.org/projects/doctrine-annotations/en/latest/index.html). + +## Changelog + +See [CHANGELOG.md](CHANGELOG.md). diff --git a/vendor/doctrine/annotations/composer.json b/vendor/doctrine/annotations/composer.json new file mode 100644 index 0000000000..040e71732c --- /dev/null +++ b/vendor/doctrine/annotations/composer.json @@ -0,0 +1,44 @@ +{ + "name": "doctrine/annotations", + "type": "library", + "description": "Docblock Annotations Parser", + "keywords": ["annotations", "docblock", "parser"], + "homepage": "http://www.doctrine-project.org", + "license": "MIT", + "authors": [ + {"name": "Guilherme Blanco", "email": "guilhermeblanco@gmail.com"}, + {"name": "Roman Borschel", "email": "roman@code-factory.org"}, + {"name": "Benjamin Eberlei", "email": "kontakt@beberlei.de"}, + {"name": "Jonathan Wage", "email": "jonwage@gmail.com"}, + {"name": "Johannes Schmitt", "email": "schmittjoh@gmail.com"} + ], + "require": { + "php": "^7.1 || ^8.0", + "ext-tokenizer": "*", + "doctrine/lexer": "1.*" + }, + "require-dev": { + "doctrine/cache": "1.*", + "phpunit/phpunit": "^7.5" + }, + "config": { + "sort-packages": true + }, + "autoload": { + "psr-4": { "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" } + }, + "autoload-dev": { + "psr-4": { + "Doctrine\\Performance\\Common\\Annotations\\": "tests/Doctrine/Performance/Common/Annotations", + "Doctrine\\Tests\\Common\\Annotations\\": "tests/Doctrine/Tests/Common/Annotations" + }, + "files": [ + "tests/Doctrine/Tests/Common/Annotations/Fixtures/SingleClassLOC1000.php" + ] + }, + "extra": { + "branch-alias": { + "dev-master": "1.9.x-dev" + } + } +} diff --git a/vendor/doctrine/annotations/docs/en/annotations.rst b/vendor/doctrine/annotations/docs/en/annotations.rst new file mode 100644 index 0000000000..1984dba5f7 --- /dev/null +++ b/vendor/doctrine/annotations/docs/en/annotations.rst @@ -0,0 +1,271 @@ +Handling Annotations +==================== + +There are several different approaches to handling annotations in PHP. +Doctrine Annotations maps docblock annotations to PHP classes. Because +not all docblock annotations are used for metadata purposes a filter is +applied to ignore or skip classes that are not Doctrine annotations. + +Take a look at the following code snippet: + +.. code-block:: php + + namespace MyProject\Entities; + + use Doctrine\ORM\Mapping AS ORM; + use Symfony\Component\Validation\Constraints AS Assert; + + /** + * @author Benjamin Eberlei + * @ORM\Entity + * @MyProject\Annotations\Foobarable + */ + class User + { + /** + * @ORM\Id @ORM\Column @ORM\GeneratedValue + * @dummy + * @var int + */ + private $id; + + /** + * @ORM\Column(type="string") + * @Assert\NotEmpty + * @Assert\Email + * @var string + */ + private $email; + } + +In this snippet you can see a variety of different docblock annotations: + +- Documentation annotations such as ``@var`` and ``@author``. These + annotations are on a blacklist and never considered for throwing an + exception due to wrongly used annotations. +- Annotations imported through use statements. The statement ``use + Doctrine\ORM\Mapping AS ORM`` makes all classes under that namespace + available as ``@ORM\ClassName``. Same goes for the import of + ``@Assert``. +- The ``@dummy`` annotation. It is not a documentation annotation and + not blacklisted. For Doctrine Annotations it is not entirely clear how + to handle this annotation. Depending on the configuration an exception + (unknown annotation) will be thrown when parsing this annotation. +- The fully qualified annotation ``@MyProject\Annotations\Foobarable``. + This is transformed directly into the given class name. + +How are these annotations loaded? From looking at the code you could +guess that the ORM Mapping, Assert Validation and the fully qualified +annotation can just be loaded using +the defined PHP autoloaders. This is not the case however: For error +handling reasons every check for class existence inside the +``AnnotationReader`` sets the second parameter $autoload +of ``class_exists($name, $autoload)`` to false. To work flawlessly the +``AnnotationReader`` requires silent autoloaders which many autoloaders are +not. Silent autoloading is NOT part of the `PSR-0 specification +`_ +for autoloading. + +This is why Doctrine Annotations uses its own autoloading mechanism +through a global registry. If you are wondering about the annotation +registry being global, there is no other way to solve the architectural +problems of autoloading annotation classes in a straightforward fashion. +Additionally if you think about PHP autoloading then you recognize it is +a global as well. + +To anticipate the configuration section, making the above PHP class work +with Doctrine Annotations requires this setup: + +.. code-block:: php + + use Doctrine\Common\Annotations\AnnotationReader; + use Doctrine\Common\Annotations\AnnotationRegistry; + + AnnotationRegistry::registerFile("/path/to/doctrine/lib/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php"); + AnnotationRegistry::registerAutoloadNamespace("Symfony\Component\Validator\Constraint", "/path/to/symfony/src"); + AnnotationRegistry::registerAutoloadNamespace("MyProject\Annotations", "/path/to/myproject/src"); + + $reader = new AnnotationReader(); + AnnotationReader::addGlobalIgnoredName('dummy'); + +The second block with the annotation registry calls registers all the +three different annotation namespaces that are used. +Doctrine Annotations saves all its annotations in a single file, that is +why ``AnnotationRegistry#registerFile`` is used in contrast to +``AnnotationRegistry#registerAutoloadNamespace`` which creates a PSR-0 +compatible loading mechanism for class to file names. + +In the third block, we create the actual ``AnnotationReader`` instance. +Note that we also add ``dummy`` to the global list of ignored +annotations for which we do not throw exceptions. Setting this is +necessary in our example case, otherwise ``@dummy`` would trigger an +exception to be thrown during the parsing of the docblock of +``MyProject\Entities\User#id``. + +Setup and Configuration +----------------------- + +To use the annotations library is simple, you just need to create a new +``AnnotationReader`` instance: + +.. code-block:: php + + $reader = new \Doctrine\Common\Annotations\AnnotationReader(); + +This creates a simple annotation reader with no caching other than in +memory (in php arrays). Since parsing docblocks can be expensive you +should cache this process by using a caching reader. + +You can use a file caching reader, but please note it is deprecated to +do so: + +.. code-block:: php + + use Doctrine\Common\Annotations\FileCacheReader; + use Doctrine\Common\Annotations\AnnotationReader; + + $reader = new FileCacheReader( + new AnnotationReader(), + "/path/to/cache", + $debug = true + ); + +If you set the ``debug`` flag to ``true`` the cache reader will check +for changes in the original files, which is very important during +development. If you don't set it to ``true`` you have to delete the +directory to clear the cache. This gives faster performance, however +should only be used in production, because of its inconvenience during +development. + +You can also use one of the ``Doctrine\Common\Cache\Cache`` cache +implementations to cache the annotations: + +.. code-block:: php + + use Doctrine\Common\Annotations\AnnotationReader; + use Doctrine\Common\Annotations\CachedReader; + use Doctrine\Common\Cache\ApcCache; + + $reader = new CachedReader( + new AnnotationReader(), + new ApcCache(), + $debug = true + ); + +The ``debug`` flag is used here as well to invalidate the cache files +when the PHP class with annotations changed and should be used during +development. + +.. warning :: + + The ``AnnotationReader`` works and caches under the + assumption that all annotations of a doc-block are processed at + once. That means that annotation classes that do not exist and + aren't loaded and cannot be autoloaded (using the + AnnotationRegistry) would never be visible and not accessible if a + cache is used unless the cache is cleared and the annotations + requested again, this time with all annotations defined. + +By default the annotation reader returns a list of annotations with +numeric indexes. If you want your annotations to be indexed by their +class name you can wrap the reader in an ``IndexedReader``: + +.. code-block:: php + + use Doctrine\Common\Annotations\AnnotationReader; + use Doctrine\Common\Annotations\IndexedReader; + + $reader = new IndexedReader(new AnnotationReader()); + +.. warning:: + + You should never wrap the indexed reader inside a cached reader, + only the other way around. This way you can re-use the cache with + indexed or numeric keys, otherwise your code may experience failures + due to caching in a numerical or indexed format. + +Registering Annotations +~~~~~~~~~~~~~~~~~~~~~~~ + +As explained in the introduction, Doctrine Annotations uses its own +autoloading mechanism to determine if a given annotation has a +corresponding PHP class that can be autoloaded. For annotation +autoloading you have to configure the +``Doctrine\Common\Annotations\AnnotationRegistry``. There are three +different mechanisms to configure annotation autoloading: + +- Calling ``AnnotationRegistry#registerFile($file)`` to register a file + that contains one or more annotation classes. +- Calling ``AnnotationRegistry#registerNamespace($namespace, $dirs = + null)`` to register that the given namespace contains annotations and + that their base directory is located at the given $dirs or in the + include path if ``NULL`` is passed. The given directories should *NOT* + be the directory where classes of the namespace are in, but the base + directory of the root namespace. The AnnotationRegistry uses a + namespace to directory separator approach to resolve the correct path. +- Calling ``AnnotationRegistry#registerLoader($callable)`` to register + an autoloader callback. The callback accepts the class as first and + only parameter and has to return ``true`` if the corresponding file + was found and included. + +.. note:: + + Loaders have to fail silently, if a class is not found even if it + matches for example the namespace prefix of that loader. Never is a + loader to throw a warning or exception if the loading failed + otherwise parsing doc block annotations will become a huge pain. + +A sample loader callback could look like: + +.. code-block:: php + + use Doctrine\Common\Annotations\AnnotationRegistry; + use Symfony\Component\ClassLoader\UniversalClassLoader; + + AnnotationRegistry::registerLoader(function($class) { + $file = str_replace("\\", DIRECTORY_SEPARATOR, $class) . ".php"; + + if (file_exists("/my/base/path/" . $file)) { + // file_exists() makes sure that the loader fails silently + require "/my/base/path/" . $file; + } + }); + + $loader = new UniversalClassLoader(); + AnnotationRegistry::registerLoader(array($loader, "loadClass")); + + +Ignoring missing exceptions +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +By default an exception is thrown from the ``AnnotationReader`` if an +annotation was found that: + +- is not part of the blacklist of ignored "documentation annotations"; +- was not imported through a use statement; +- is not a fully qualified class that exists. + +You can disable this behavior for specific names if your docblocks do +not follow strict requirements: + +.. code-block:: php + + $reader = new \Doctrine\Common\Annotations\AnnotationReader(); + AnnotationReader::addGlobalIgnoredName('foo'); + +PHP Imports +~~~~~~~~~~~ + +By default the annotation reader parses the use-statement of a php file +to gain access to the import rules and register them for the annotation +processing. Only if you are using PHP Imports can you validate the +correct usage of annotations and throw exceptions if you misspelled an +annotation. This mechanism is enabled by default. + +To ease the upgrade path, we still allow you to disable this mechanism. +Note however that we will remove this in future versions: + +.. code-block:: php + + $reader = new \Doctrine\Common\Annotations\AnnotationReader(); + $reader->setEnabledPhpImports(false); diff --git a/vendor/doctrine/annotations/docs/en/custom.rst b/vendor/doctrine/annotations/docs/en/custom.rst new file mode 100644 index 0000000000..e589a5432a --- /dev/null +++ b/vendor/doctrine/annotations/docs/en/custom.rst @@ -0,0 +1,353 @@ +Custom Annotation Classes +========================= + +If you want to define your own annotations, you just have to group them +in a namespace and register this namespace in the ``AnnotationRegistry``. +Annotation classes have to contain a class-level docblock with the text +``@Annotation``: + +.. code-block:: php + + namespace MyCompany\Annotations; + + /** @Annotation */ + class Bar + { + // some code + } + +Inject annotation values +------------------------ + +The annotation parser checks if the annotation constructor has arguments, +if so then it will pass the value array, otherwise it will try to inject +values into public properties directly: + + +.. code-block:: php + + namespace MyCompany\Annotations; + + /** + * @Annotation + * + * Some Annotation using a constructor + */ + class Bar + { + private $foo; + + public function __construct(array $values) + { + $this->foo = $values['foo']; + } + } + + /** + * @Annotation + * + * Some Annotation without a constructor + */ + class Foo + { + public $bar; + } + +Annotation Target +----------------- + +``@Target`` indicates the kinds of class elements to which an annotation +type is applicable. Then you could define one or more targets: + +- ``CLASS`` Allowed in class docblocks +- ``PROPERTY`` Allowed in property docblocks +- ``METHOD`` Allowed in the method docblocks +- ``ALL`` Allowed in class, property and method docblocks +- ``ANNOTATION`` Allowed inside other annotations + +If the annotations is not allowed in the current context, an +``AnnotationException`` is thrown. + +.. code-block:: php + + namespace MyCompany\Annotations; + + /** + * @Annotation + * @Target({"METHOD","PROPERTY"}) + */ + class Bar + { + // some code + } + + /** + * @Annotation + * @Target("CLASS") + */ + class Foo + { + // some code + } + +Attribute types +--------------- + +The annotation parser checks the given parameters using the phpdoc +annotation ``@var``, The data type could be validated using the ``@var`` +annotation on the annotation properties or using the ``@Attributes`` and +``@Attribute`` annotations. + +If the data type does not match you get an ``AnnotationException`` + +.. code-block:: php + + namespace MyCompany\Annotations; + + /** + * @Annotation + * @Target({"METHOD","PROPERTY"}) + */ + class Bar + { + /** @var mixed */ + public $mixed; + + /** @var boolean */ + public $boolean; + + /** @var bool */ + public $bool; + + /** @var float */ + public $float; + + /** @var string */ + public $string; + + /** @var integer */ + public $integer; + + /** @var array */ + public $array; + + /** @var SomeAnnotationClass */ + public $annotation; + + /** @var array */ + public $arrayOfIntegers; + + /** @var array */ + public $arrayOfAnnotations; + } + + /** + * @Annotation + * @Target({"METHOD","PROPERTY"}) + * @Attributes({ + * @Attribute("stringProperty", type = "string"), + * @Attribute("annotProperty", type = "SomeAnnotationClass"), + * }) + */ + class Foo + { + public function __construct(array $values) + { + $this->stringProperty = $values['stringProperty']; + $this->annotProperty = $values['annotProperty']; + } + + // some code + } + +Annotation Required +------------------- + +``@Required`` indicates that the field must be specified when the +annotation is used. If it is not used you get an ``AnnotationException`` +stating that this value can not be null. + +Declaring a required field: + +.. code-block:: php + + /** + * @Annotation + * @Target("ALL") + */ + class Foo + { + /** @Required */ + public $requiredField; + } + +Usage: + +.. code-block:: php + + /** @Foo(requiredField="value") */ + public $direction; // Valid + + /** @Foo */ + public $direction; // Required field missing, throws an AnnotationException + + +Enumerated values +----------------- + +- An annotation property marked with ``@Enum`` is a field that accepts a + fixed set of scalar values. +- You should use ``@Enum`` fields any time you need to represent fixed + values. +- The annotation parser checks the given value and throws an + ``AnnotationException`` if the value does not match. + + +Declaring an enumerated property: + +.. code-block:: php + + /** + * @Annotation + * @Target("ALL") + */ + class Direction + { + /** + * @Enum({"NORTH", "SOUTH", "EAST", "WEST"}) + */ + public $value; + } + +Annotation usage: + +.. code-block:: php + + /** @Direction("NORTH") */ + public $direction; // Valid value + + /** @Direction("NORTHEAST") */ + public $direction; // Invalid value, throws an AnnotationException + + +Constants +--------- + +The use of constants and class constants is available on the annotations +parser. + +The following usages are allowed: + +.. code-block:: php + + namespace MyCompany\Entity; + + use MyCompany\Annotations\Foo; + use MyCompany\Annotations\Bar; + use MyCompany\Entity\SomeClass; + + /** + * @Foo(PHP_EOL) + * @Bar(Bar::FOO) + * @Foo({SomeClass::FOO, SomeClass::BAR}) + * @Bar({SomeClass::FOO_KEY = SomeClass::BAR_VALUE}) + */ + class User + { + } + + +Be careful with constants and the cache ! + +.. note:: + + The cached reader will not re-evaluate each time an annotation is + loaded from cache. When a constant is changed the cache must be + cleaned. + + +Usage +----- + +Using the library API is simple. Using the annotations described in the +previous section, you can now annotate other classes with your +annotations: + +.. code-block:: php + + namespace MyCompany\Entity; + + use MyCompany\Annotations\Foo; + use MyCompany\Annotations\Bar; + + /** + * @Foo(bar="foo") + * @Bar(foo="bar") + */ + class User + { + } + +Now we can write a script to get the annotations above: + +.. code-block:: php + + $reflClass = new ReflectionClass('MyCompany\Entity\User'); + $classAnnotations = $reader->getClassAnnotations($reflClass); + + foreach ($classAnnotations AS $annot) { + if ($annot instanceof \MyCompany\Annotations\Foo) { + echo $annot->bar; // prints "foo"; + } else if ($annot instanceof \MyCompany\Annotations\Bar) { + echo $annot->foo; // prints "bar"; + } + } + +You have a complete API for retrieving annotation class instances from a +class, property or method docblock: + + +Reader API +~~~~~~~~~~ + +Access all annotations of a class +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: php + + public function getClassAnnotations(\ReflectionClass $class); + +Access one annotation of a class +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: php + + public function getClassAnnotation(\ReflectionClass $class, $annotationName); + +Access all annotations of a method +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: php + + public function getMethodAnnotations(\ReflectionMethod $method); + +Access one annotation of a method +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: php + + public function getMethodAnnotation(\ReflectionMethod $method, $annotationName); + +Access all annotations of a property +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: php + + public function getPropertyAnnotations(\ReflectionProperty $property); + +Access one annotation of a property +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: php + + public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName); diff --git a/vendor/doctrine/annotations/docs/en/index.rst b/vendor/doctrine/annotations/docs/en/index.rst new file mode 100644 index 0000000000..3b3368c962 --- /dev/null +++ b/vendor/doctrine/annotations/docs/en/index.rst @@ -0,0 +1,97 @@ +Introduction +============ + +Doctrine Annotations allows to implement custom annotation +functionality for PHP classes. + +.. code-block:: php + + class Foo + { + /** + * @MyAnnotation(myProperty="value") + */ + private $bar; + } + +Annotations aren't implemented in PHP itself which is why this component +offers a way to use the PHP doc-blocks as a place for the well known +annotation syntax using the ``@`` char. + +Annotations in Doctrine are used for the ORM configuration to build the +class mapping, but it can be used in other projects for other purposes +too. + +Installation +============ + +You can install the Annotation component with composer: + +.. code-block:: + +   $ composer require doctrine/annotations + +Create an annotation class +========================== + +An annotation class is a representation of the later used annotation +configuration in classes. The annotation class of the previous example +looks like this: + +.. code-block:: php + + /** + * @Annotation + */ + final class MyAnnotation + { + public $myProperty; + } + +The annotation class is declared as an annotation by ``@Annotation``. + +:ref:`Read more about custom annotations. ` + +Reading annotations +=================== + +The access to the annotations happens by reflection of the class +containing them. There are multiple reader-classes implementing the +``Doctrine\Common\Annotations\Reader`` interface, that can access the +annotations of a class. A common one is +``Doctrine\Common\Annotations\AnnotationReader``: + +.. code-block:: php + + use Doctrine\Common\Annotations\AnnotationReader; + use Doctrine\Common\Annotations\AnnotationRegistry; + + // Deprecated and will be removed in 2.0 but currently needed + AnnotationRegistry::registerLoader('class_exists'); + + $reflectionClass = new ReflectionClass(Foo::class); + $property = $reflectionClass->getProperty('bar'); + + $reader = new AnnotationReader(); + $myAnnotation = $reader->getPropertyAnnotation($property, MyAnnotation::class); + + echo $myAnnotation->myProperty; // result: "value" + +Note that ``AnnotationRegistry::registerLoader('class_exists')`` only works +if you already have an autoloader configured (i.e. composer autoloader). +Otherwise, :ref:`please take a look to the other annotation autoload mechanisms `. + +A reader has multiple methods to access the annotations of a class. + +:ref:`Read more about handling annotations. ` + +IDE Support +----------- + +Some IDEs already provide support for annotations: + +- Eclipse via the `Symfony2 Plugin `_ +- PHPStorm via the `PHP Annotations Plugin `_ or the `Symfony2 Plugin `_ + +.. _Read more about handling annotations.: annotations +.. _Read more about custom annotations.: custom diff --git a/vendor/doctrine/annotations/docs/en/sidebar.rst b/vendor/doctrine/annotations/docs/en/sidebar.rst new file mode 100644 index 0000000000..6f5d13c46a --- /dev/null +++ b/vendor/doctrine/annotations/docs/en/sidebar.rst @@ -0,0 +1,6 @@ +.. toctree:: + :depth: 3 + + index + annotations + custom diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation.php new file mode 100644 index 0000000000..a79a0f8f0a --- /dev/null +++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation.php @@ -0,0 +1,79 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +/** + * Annotations class. + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class Annotation +{ + /** + * Value property. Common among all derived classes. + * + * @var string + */ + public $value; + + /** + * Constructor. + * + * @param array $data Key-value for properties to be defined in this class. + */ + public final function __construct(array $data) + { + foreach ($data as $key => $value) { + $this->$key = $value; + } + } + + /** + * Error handler for unknown property accessor in Annotation class. + * + * @param string $name Unknown property name. + * + * @throws \BadMethodCallException + */ + public function __get($name) + { + throw new \BadMethodCallException( + sprintf("Unknown property '%s' on annotation '%s'.", $name, get_class($this)) + ); + } + + /** + * Error handler for unknown property mutator in Annotation class. + * + * @param string $name Unknown property name. + * @param mixed $value Property value. + * + * @throws \BadMethodCallException + */ + public function __set($name, $value) + { + throw new \BadMethodCallException( + sprintf("Unknown property '%s' on annotation '%s'.", $name, get_class($this)) + ); + } +} diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Attribute.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Attribute.php new file mode 100644 index 0000000000..dbef6df087 --- /dev/null +++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Attribute.php @@ -0,0 +1,47 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check the attribute type during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Attribute +{ + /** + * @var string + */ + public $name; + + /** + * @var string + */ + public $type; + + /** + * @var boolean + */ + public $required = false; +} diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Attributes.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Attributes.php new file mode 100644 index 0000000000..53134e3097 --- /dev/null +++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Attributes.php @@ -0,0 +1,37 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check the types of all declared attributes during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Attributes +{ + /** + * @var array + */ + public $value; +} diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Enum.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Enum.php new file mode 100644 index 0000000000..82f6241ec9 --- /dev/null +++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Enum.php @@ -0,0 +1,84 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check the available values during the parsing process. + * + * @since 2.4 + * @author Fabio B. Silva + * + * @Annotation + * @Attributes({ + * @Attribute("value", required = true, type = "array"), + * @Attribute("literal", required = false, type = "array") + * }) + */ +final class Enum +{ + /** + * @var array + */ + public $value; + + /** + * Literal target declaration. + * + * @var array + */ + public $literal; + + /** + * Annotation constructor. + * + * @param array $values + * + * @throws \InvalidArgumentException + */ + public function __construct(array $values) + { + if ( ! isset($values['literal'])) { + $values['literal'] = []; + } + + foreach ($values['value'] as $var) { + if( ! is_scalar($var)) { + throw new \InvalidArgumentException(sprintf( + '@Enum supports only scalar values "%s" given.', + is_object($var) ? get_class($var) : gettype($var) + )); + } + } + + foreach ($values['literal'] as $key => $var) { + if( ! in_array($key, $values['value'])) { + throw new \InvalidArgumentException(sprintf( + 'Undefined enumerator value "%s" for literal "%s".', + $key , $var + )); + } + } + + $this->value = $values['value']; + $this->literal = $values['literal']; + } +} diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php new file mode 100644 index 0000000000..85ec3d6dd1 --- /dev/null +++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php @@ -0,0 +1,54 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser to ignore specific + * annotations during the parsing process. + * + * @Annotation + * @author Johannes M. Schmitt + */ +final class IgnoreAnnotation +{ + /** + * @var array + */ + public $names; + + /** + * Constructor. + * + * @param array $values + * + * @throws \RuntimeException + */ + public function __construct(array $values) + { + if (is_string($values['value'])) { + $values['value'] = [$values['value']]; + } + if (!is_array($values['value'])) { + throw new \RuntimeException(sprintf('@IgnoreAnnotation expects either a string name, or an array of strings, but got %s.', json_encode($values['value']))); + } + + $this->names = $values['value']; + } +} diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Required.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Required.php new file mode 100644 index 0000000000..d67f960687 --- /dev/null +++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Required.php @@ -0,0 +1,33 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check if that attribute is required during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Required +{ +} diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Target.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Target.php new file mode 100644 index 0000000000..a52972b8b4 --- /dev/null +++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Target.php @@ -0,0 +1,107 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check the annotation target during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Target +{ + const TARGET_CLASS = 1; + const TARGET_METHOD = 2; + const TARGET_PROPERTY = 4; + const TARGET_ANNOTATION = 8; + const TARGET_ALL = 15; + + /** + * @var array + */ + private static $map = [ + 'ALL' => self::TARGET_ALL, + 'CLASS' => self::TARGET_CLASS, + 'METHOD' => self::TARGET_METHOD, + 'PROPERTY' => self::TARGET_PROPERTY, + 'ANNOTATION' => self::TARGET_ANNOTATION, + ]; + + /** + * @var array + */ + public $value; + + /** + * Targets as bitmask. + * + * @var integer + */ + public $targets; + + /** + * Literal target declaration. + * + * @var integer + */ + public $literal; + + /** + * Annotation constructor. + * + * @param array $values + * + * @throws \InvalidArgumentException + */ + public function __construct(array $values) + { + if (!isset($values['value'])){ + $values['value'] = null; + } + if (is_string($values['value'])){ + $values['value'] = [$values['value']]; + } + if (!is_array($values['value'])){ + throw new \InvalidArgumentException( + sprintf('@Target expects either a string value, or an array of strings, "%s" given.', + is_object($values['value']) ? get_class($values['value']) : gettype($values['value']) + ) + ); + } + + $bitmask = 0; + foreach ($values['value'] as $literal) { + if(!isset(self::$map[$literal])){ + throw new \InvalidArgumentException( + sprintf('Invalid Target "%s". Available targets: [%s]', + $literal, implode(', ', array_keys(self::$map))) + ); + } + $bitmask |= self::$map[$literal]; + } + + $this->targets = $bitmask; + $this->value = $values['value']; + $this->literal = implode(', ', $this->value); + } +} diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationException.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationException.php new file mode 100644 index 0000000000..d06fe663c2 --- /dev/null +++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationException.php @@ -0,0 +1,197 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +/** + * Description of AnnotationException + * + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class AnnotationException extends \Exception +{ + /** + * Creates a new AnnotationException describing a Syntax error. + * + * @param string $message Exception message + * + * @return AnnotationException + */ + public static function syntaxError($message) + { + return new self('[Syntax Error] ' . $message); + } + + /** + * Creates a new AnnotationException describing a Semantical error. + * + * @param string $message Exception message + * + * @return AnnotationException + */ + public static function semanticalError($message) + { + return new self('[Semantical Error] ' . $message); + } + + /** + * Creates a new AnnotationException describing an error which occurred during + * the creation of the annotation. + * + * @since 2.2 + * + * @param string $message + * + * @return AnnotationException + */ + public static function creationError($message) + { + return new self('[Creation Error] ' . $message); + } + + /** + * Creates a new AnnotationException describing a type error. + * + * @since 1.1 + * + * @param string $message + * + * @return AnnotationException + */ + public static function typeError($message) + { + return new self('[Type Error] ' . $message); + } + + /** + * Creates a new AnnotationException describing a constant semantical error. + * + * @since 2.3 + * + * @param string $identifier + * @param string $context + * + * @return AnnotationException + */ + public static function semanticalErrorConstants($identifier, $context = null) + { + return self::semanticalError(sprintf( + "Couldn't find constant %s%s.", + $identifier, + $context ? ', ' . $context : '' + )); + } + + /** + * Creates a new AnnotationException describing an type error of an attribute. + * + * @since 2.2 + * + * @param string $attributeName + * @param string $annotationName + * @param string $context + * @param string $expected + * @param mixed $actual + * + * @return AnnotationException + */ + public static function attributeTypeError($attributeName, $annotationName, $context, $expected, $actual) + { + return self::typeError(sprintf( + 'Attribute "%s" of @%s declared on %s expects %s, but got %s.', + $attributeName, + $annotationName, + $context, + $expected, + is_object($actual) ? 'an instance of ' . get_class($actual) : gettype($actual) + )); + } + + /** + * Creates a new AnnotationException describing an required error of an attribute. + * + * @since 2.2 + * + * @param string $attributeName + * @param string $annotationName + * @param string $context + * @param string $expected + * + * @return AnnotationException + */ + public static function requiredError($attributeName, $annotationName, $context, $expected) + { + return self::typeError(sprintf( + 'Attribute "%s" of @%s declared on %s expects %s. This value should not be null.', + $attributeName, + $annotationName, + $context, + $expected + )); + } + + /** + * Creates a new AnnotationException describing a invalid enummerator. + * + * @since 2.4 + * + * @param string $attributeName + * @param string $annotationName + * @param string $context + * @param array $available + * @param mixed $given + * + * @return AnnotationException + */ + public static function enumeratorError($attributeName, $annotationName, $context, $available, $given) + { + return new self(sprintf( + '[Enum Error] Attribute "%s" of @%s declared on %s accept only [%s], but got %s.', + $attributeName, + $annotationName, + $context, + implode(', ', $available), + is_object($given) ? get_class($given) : $given + )); + } + + /** + * @return AnnotationException + */ + public static function optimizerPlusSaveComments() + { + return new self( + "You have to enable opcache.save_comments=1 or zend_optimizerplus.save_comments=1." + ); + } + + /** + * @return AnnotationException + */ + public static function optimizerPlusLoadComments() + { + return new self( + "You have to enable opcache.load_comments=1 or zend_optimizerplus.load_comments=1." + ); + } +} diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationReader.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationReader.php new file mode 100644 index 0000000000..8811c2951d --- /dev/null +++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationReader.php @@ -0,0 +1,418 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Annotations\Annotation\IgnoreAnnotation; +use Doctrine\Common\Annotations\Annotation\Target; +use ReflectionClass; +use ReflectionMethod; +use ReflectionProperty; + +/** + * A reader for docblock annotations. + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Johannes M. Schmitt + */ +class AnnotationReader implements Reader +{ + /** + * Global map for imports. + * + * @var array + */ + private static $globalImports = [ + 'ignoreannotation' => 'Doctrine\Common\Annotations\Annotation\IgnoreAnnotation', + ]; + + /** + * A list with annotations that are not causing exceptions when not resolved to an annotation class. + * + * The names are case sensitive. + * + * @var array + */ + private static $globalIgnoredNames = [ + // Annotation tags + 'Annotation' => true, 'Attribute' => true, 'Attributes' => true, + /* Can we enable this? 'Enum' => true, */ + 'Required' => true, + 'Target' => true, + // Widely used tags (but not existent in phpdoc) + 'fix' => true , 'fixme' => true, + 'override' => true, + // PHPDocumentor 1 tags + 'abstract'=> true, 'access'=> true, + 'code' => true, + 'deprec'=> true, + 'endcode' => true, 'exception'=> true, + 'final'=> true, + 'ingroup' => true, 'inheritdoc'=> true, 'inheritDoc'=> true, + 'magic' => true, + 'name'=> true, + 'toc' => true, 'tutorial'=> true, + 'private' => true, + 'static'=> true, 'staticvar'=> true, 'staticVar'=> true, + 'throw' => true, + // PHPDocumentor 2 tags. + 'api' => true, 'author'=> true, + 'category'=> true, 'copyright'=> true, + 'deprecated'=> true, + 'example'=> true, + 'filesource'=> true, + 'global'=> true, + 'ignore'=> true, /* Can we enable this? 'index' => true, */ 'internal'=> true, + 'license'=> true, 'link'=> true, + 'method' => true, + 'package'=> true, 'param'=> true, 'property' => true, 'property-read' => true, 'property-write' => true, + 'return'=> true, + 'see'=> true, 'since'=> true, 'source' => true, 'subpackage'=> true, + 'throws'=> true, 'todo'=> true, 'TODO'=> true, + 'usedby'=> true, 'uses' => true, + 'var'=> true, 'version'=> true, + // PHPUnit tags + 'codeCoverageIgnore' => true, 'codeCoverageIgnoreStart' => true, 'codeCoverageIgnoreEnd' => true, + // PHPCheckStyle + 'SuppressWarnings' => true, + // PHPStorm + 'noinspection' => true, + // PEAR + 'package_version' => true, + // PlantUML + 'startuml' => true, 'enduml' => true, + // Symfony 3.3 Cache Adapter + 'experimental' => true, + // Slevomat Coding Standard + 'phpcsSuppress' => true, + // PHP CodeSniffer + 'codingStandardsIgnoreStart' => true, + 'codingStandardsIgnoreEnd' => true, + // PHPStan + 'template' => true, 'implements' => true, 'extends' => true, 'use' => true, + ]; + + /** + * A list with annotations that are not causing exceptions when not resolved to an annotation class. + * + * The names are case sensitive. + * + * @var array + */ + private static $globalIgnoredNamespaces = []; + + /** + * Add a new annotation to the globally ignored annotation names with regard to exception handling. + * + * @param string $name + */ + static public function addGlobalIgnoredName($name) + { + self::$globalIgnoredNames[$name] = true; + } + + /** + * Add a new annotation to the globally ignored annotation namespaces with regard to exception handling. + * + * @param string $namespace + */ + static public function addGlobalIgnoredNamespace($namespace) + { + self::$globalIgnoredNamespaces[$namespace] = true; + } + + /** + * Annotations parser. + * + * @var \Doctrine\Common\Annotations\DocParser + */ + private $parser; + + /** + * Annotations parser used to collect parsing metadata. + * + * @var \Doctrine\Common\Annotations\DocParser + */ + private $preParser; + + /** + * PHP parser used to collect imports. + * + * @var \Doctrine\Common\Annotations\PhpParser + */ + private $phpParser; + + /** + * In-memory cache mechanism to store imported annotations per class. + * + * @var array + */ + private $imports = []; + + /** + * In-memory cache mechanism to store ignored annotations per class. + * + * @var array + */ + private $ignoredAnnotationNames = []; + + /** + * Constructor. + * + * Initializes a new AnnotationReader. + * + * @param DocParser $parser + * + * @throws AnnotationException + */ + public function __construct(DocParser $parser = null) + { + if (extension_loaded('Zend Optimizer+') && (ini_get('zend_optimizerplus.save_comments') === "0" || ini_get('opcache.save_comments') === "0")) { + throw AnnotationException::optimizerPlusSaveComments(); + } + + if (extension_loaded('Zend OPcache') && ini_get('opcache.save_comments') == 0) { + throw AnnotationException::optimizerPlusSaveComments(); + } + + // Make sure that the IgnoreAnnotation annotation is loaded + class_exists(IgnoreAnnotation::class); + + $this->parser = $parser ?: new DocParser(); + + $this->preParser = new DocParser; + + $this->preParser->setImports(self::$globalImports); + $this->preParser->setIgnoreNotImportedAnnotations(true); + $this->preParser->setIgnoredAnnotationNames(self::$globalIgnoredNames); + + $this->phpParser = new PhpParser; + } + + /** + * {@inheritDoc} + */ + public function getClassAnnotations(ReflectionClass $class) + { + $this->parser->setTarget(Target::TARGET_CLASS); + $this->parser->setImports($this->getClassImports($class)); + $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); + $this->parser->setIgnoredAnnotationNamespaces(self::$globalIgnoredNamespaces); + + return $this->parser->parse($class->getDocComment(), 'class ' . $class->getName()); + } + + /** + * {@inheritDoc} + */ + public function getClassAnnotation(ReflectionClass $class, $annotationName) + { + $annotations = $this->getClassAnnotations($class); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * {@inheritDoc} + */ + public function getPropertyAnnotations(ReflectionProperty $property) + { + $class = $property->getDeclaringClass(); + $context = 'property ' . $class->getName() . "::\$" . $property->getName(); + + $this->parser->setTarget(Target::TARGET_PROPERTY); + $this->parser->setImports($this->getPropertyImports($property)); + $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); + $this->parser->setIgnoredAnnotationNamespaces(self::$globalIgnoredNamespaces); + + return $this->parser->parse($property->getDocComment(), $context); + } + + /** + * {@inheritDoc} + */ + public function getPropertyAnnotation(ReflectionProperty $property, $annotationName) + { + $annotations = $this->getPropertyAnnotations($property); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * {@inheritDoc} + */ + public function getMethodAnnotations(ReflectionMethod $method) + { + $class = $method->getDeclaringClass(); + $context = 'method ' . $class->getName() . '::' . $method->getName() . '()'; + + $this->parser->setTarget(Target::TARGET_METHOD); + $this->parser->setImports($this->getMethodImports($method)); + $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); + $this->parser->setIgnoredAnnotationNamespaces(self::$globalIgnoredNamespaces); + + return $this->parser->parse($method->getDocComment(), $context); + } + + /** + * {@inheritDoc} + */ + public function getMethodAnnotation(ReflectionMethod $method, $annotationName) + { + $annotations = $this->getMethodAnnotations($method); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Returns the ignored annotations for the given class. + * + * @param \ReflectionClass $class + * + * @return array + */ + private function getIgnoredAnnotationNames(ReflectionClass $class) + { + $name = $class->getName(); + if (isset($this->ignoredAnnotationNames[$name])) { + return $this->ignoredAnnotationNames[$name]; + } + + $this->collectParsingMetadata($class); + + return $this->ignoredAnnotationNames[$name]; + } + + /** + * Retrieves imports. + * + * @param \ReflectionClass $class + * + * @return array + */ + private function getClassImports(ReflectionClass $class) + { + $name = $class->getName(); + if (isset($this->imports[$name])) { + return $this->imports[$name]; + } + + $this->collectParsingMetadata($class); + + return $this->imports[$name]; + } + + /** + * Retrieves imports for methods. + * + * @param \ReflectionMethod $method + * + * @return array + */ + private function getMethodImports(ReflectionMethod $method) + { + $class = $method->getDeclaringClass(); + $classImports = $this->getClassImports($class); + + $traitImports = []; + + foreach ($class->getTraits() as $trait) { + if ($trait->hasMethod($method->getName()) + && $trait->getFileName() === $method->getFileName() + ) { + $traitImports = array_merge($traitImports, $this->phpParser->parseClass($trait)); + } + } + + return array_merge($classImports, $traitImports); + } + + /** + * Retrieves imports for properties. + * + * @param \ReflectionProperty $property + * + * @return array + */ + private function getPropertyImports(ReflectionProperty $property) + { + $class = $property->getDeclaringClass(); + $classImports = $this->getClassImports($class); + + $traitImports = []; + + foreach ($class->getTraits() as $trait) { + if ($trait->hasProperty($property->getName())) { + $traitImports = array_merge($traitImports, $this->phpParser->parseClass($trait)); + } + } + + return array_merge($classImports, $traitImports); + } + + /** + * Collects parsing metadata for a given class. + * + * @param \ReflectionClass $class + */ + private function collectParsingMetadata(ReflectionClass $class) + { + $ignoredAnnotationNames = self::$globalIgnoredNames; + $annotations = $this->preParser->parse($class->getDocComment(), 'class ' . $class->name); + + foreach ($annotations as $annotation) { + if ($annotation instanceof IgnoreAnnotation) { + foreach ($annotation->names AS $annot) { + $ignoredAnnotationNames[$annot] = true; + } + } + } + + $name = $class->getName(); + + $this->imports[$name] = array_merge( + self::$globalImports, + $this->phpParser->parseClass($class), + ['__NAMESPACE__' => $class->getNamespaceName()] + ); + + $this->ignoredAnnotationNames[$name] = $ignoredAnnotationNames; + } +} diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationRegistry.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationRegistry.php new file mode 100644 index 0000000000..ceb7eb7e09 --- /dev/null +++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationRegistry.php @@ -0,0 +1,180 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +final class AnnotationRegistry +{ + /** + * A map of namespaces to use for autoloading purposes based on a PSR-0 convention. + * + * Contains the namespace as key and an array of directories as value. If the value is NULL + * the include path is used for checking for the corresponding file. + * + * This autoloading mechanism does not utilize the PHP autoloading but implements autoloading on its own. + * + * @var string[][]|string[]|null[] + */ + static private $autoloadNamespaces = []; + + /** + * A map of autoloader callables. + * + * @var callable[] + */ + static private $loaders = []; + + /** + * An array of classes which cannot be found + * + * @var null[] indexed by class name + */ + static private $failedToAutoload = []; + + /** + * Whenever registerFile() was used. Disables use of standard autoloader. + * + * @var bool + */ + static private $registerFileUsed = false; + + public static function reset() : void + { + self::$autoloadNamespaces = []; + self::$loaders = []; + self::$failedToAutoload = []; + self::$registerFileUsed = false; + } + + /** + * Registers file. + * + * @deprecated This method is deprecated and will be removed in doctrine/annotations 2.0. Annotations will be autoloaded in 2.0. + */ + public static function registerFile(string $file) : void + { + self::$registerFileUsed = true; + + require_once $file; + } + + /** + * Adds a namespace with one or many directories to look for files or null for the include path. + * + * Loading of this namespaces will be done with a PSR-0 namespace loading algorithm. + * + * @param string $namespace + * @param string|array|null $dirs + * + * @deprecated This method is deprecated and will be removed in doctrine/annotations 2.0. Annotations will be autoloaded in 2.0. + */ + public static function registerAutoloadNamespace(string $namespace, $dirs = null) : void + { + self::$autoloadNamespaces[$namespace] = $dirs; + } + + /** + * Registers multiple namespaces. + * + * Loading of this namespaces will be done with a PSR-0 namespace loading algorithm. + * + * @param string[][]|string[]|null[] $namespaces indexed by namespace name + * + * @deprecated This method is deprecated and will be removed in doctrine/annotations 2.0. Annotations will be autoloaded in 2.0. + */ + public static function registerAutoloadNamespaces(array $namespaces) : void + { + self::$autoloadNamespaces = \array_merge(self::$autoloadNamespaces, $namespaces); + } + + /** + * Registers an autoloading callable for annotations, much like spl_autoload_register(). + * + * NOTE: These class loaders HAVE to be silent when a class was not found! + * IMPORTANT: Loaders have to return true if they loaded a class that could contain the searched annotation class. + * + * @deprecated This method is deprecated and will be removed in doctrine/annotations 2.0. Annotations will be autoloaded in 2.0. + */ + public static function registerLoader(callable $callable) : void + { + // Reset our static cache now that we have a new loader to work with + self::$failedToAutoload = []; + self::$loaders[] = $callable; + } + + /** + * Registers an autoloading callable for annotations, if it is not already registered + * + * @deprecated This method is deprecated and will be removed in doctrine/annotations 2.0. Annotations will be autoloaded in 2.0. + */ + public static function registerUniqueLoader(callable $callable) : void + { + if ( ! in_array($callable, self::$loaders, true) ) { + self::registerLoader($callable); + } + } + + /** + * Autoloads an annotation class silently. + */ + public static function loadAnnotationClass(string $class) : bool + { + if (\class_exists($class, false)) { + return true; + } + + if (\array_key_exists($class, self::$failedToAutoload)) { + return false; + } + + foreach (self::$autoloadNamespaces AS $namespace => $dirs) { + if (\strpos($class, $namespace) === 0) { + $file = \str_replace('\\', \DIRECTORY_SEPARATOR, $class) . '.php'; + + if ($dirs === null) { + if ($path = stream_resolve_include_path($file)) { + require $path; + return true; + } + } else { + foreach((array) $dirs AS $dir) { + if (is_file($dir . \DIRECTORY_SEPARATOR . $file)) { + require $dir . \DIRECTORY_SEPARATOR . $file; + return true; + } + } + } + } + } + + foreach (self::$loaders AS $loader) { + if ($loader($class) === true) { + return true; + } + } + + if (self::$loaders === [] && self::$autoloadNamespaces === [] && self::$registerFileUsed === false && \class_exists($class)) { + return true; + } + + self::$failedToAutoload[$class] = null; + + return false; + } +} diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/CachedReader.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/CachedReader.php new file mode 100644 index 0000000000..8ed16f1a0d --- /dev/null +++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/CachedReader.php @@ -0,0 +1,278 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Cache\Cache; +use ReflectionClass; + +/** + * A cache aware annotation reader. + * + * @author Johannes M. Schmitt + * @author Benjamin Eberlei + */ +final class CachedReader implements Reader +{ + /** + * @var Reader + */ + private $delegate; + + /** + * @var Cache + */ + private $cache; + + /** + * @var boolean + */ + private $debug; + + /** + * @var array + */ + private $loadedAnnotations = []; + + /** + * @var int[] + */ + private $loadedFilemtimes = []; + + /** + * @param bool $debug + */ + public function __construct(Reader $reader, Cache $cache, $debug = false) + { + $this->delegate = $reader; + $this->cache = $cache; + $this->debug = (boolean) $debug; + } + + /** + * {@inheritDoc} + */ + public function getClassAnnotations(ReflectionClass $class) + { + $cacheKey = $class->getName(); + + if (isset($this->loadedAnnotations[$cacheKey])) { + return $this->loadedAnnotations[$cacheKey]; + } + + if (false === ($annots = $this->fetchFromCache($cacheKey, $class))) { + $annots = $this->delegate->getClassAnnotations($class); + $this->saveToCache($cacheKey, $annots); + } + + return $this->loadedAnnotations[$cacheKey] = $annots; + } + + /** + * {@inheritDoc} + */ + public function getClassAnnotation(ReflectionClass $class, $annotationName) + { + foreach ($this->getClassAnnotations($class) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + /** + * {@inheritDoc} + */ + public function getPropertyAnnotations(\ReflectionProperty $property) + { + $class = $property->getDeclaringClass(); + $cacheKey = $class->getName().'$'.$property->getName(); + + if (isset($this->loadedAnnotations[$cacheKey])) { + return $this->loadedAnnotations[$cacheKey]; + } + + if (false === ($annots = $this->fetchFromCache($cacheKey, $class))) { + $annots = $this->delegate->getPropertyAnnotations($property); + $this->saveToCache($cacheKey, $annots); + } + + return $this->loadedAnnotations[$cacheKey] = $annots; + } + + /** + * {@inheritDoc} + */ + public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName) + { + foreach ($this->getPropertyAnnotations($property) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + /** + * {@inheritDoc} + */ + public function getMethodAnnotations(\ReflectionMethod $method) + { + $class = $method->getDeclaringClass(); + $cacheKey = $class->getName().'#'.$method->getName(); + + if (isset($this->loadedAnnotations[$cacheKey])) { + return $this->loadedAnnotations[$cacheKey]; + } + + if (false === ($annots = $this->fetchFromCache($cacheKey, $class))) { + $annots = $this->delegate->getMethodAnnotations($method); + $this->saveToCache($cacheKey, $annots); + } + + return $this->loadedAnnotations[$cacheKey] = $annots; + } + + /** + * {@inheritDoc} + */ + public function getMethodAnnotation(\ReflectionMethod $method, $annotationName) + { + foreach ($this->getMethodAnnotations($method) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + /** + * Clears loaded annotations. + * + * @return void + */ + public function clearLoadedAnnotations() + { + $this->loadedAnnotations = []; + $this->loadedFilemtimes = []; + } + + /** + * Fetches a value from the cache. + * + * @param string $cacheKey The cache key. + * + * @return mixed The cached value or false when the value is not in cache. + */ + private function fetchFromCache($cacheKey, ReflectionClass $class) + { + if (($data = $this->cache->fetch($cacheKey)) !== false) { + if (!$this->debug || $this->isCacheFresh($cacheKey, $class)) { + return $data; + } + } + + return false; + } + + /** + * Saves a value to the cache. + * + * @param string $cacheKey The cache key. + * @param mixed $value The value. + * + * @return void + */ + private function saveToCache($cacheKey, $value) + { + $this->cache->save($cacheKey, $value); + if ($this->debug) { + $this->cache->save('[C]'.$cacheKey, time()); + } + } + + /** + * Checks if the cache is fresh. + * + * @param string $cacheKey + * + * @return boolean + */ + private function isCacheFresh($cacheKey, ReflectionClass $class) + { + $lastModification = $this->getLastModification($class); + if ($lastModification === 0) { + return true; + } + + return $this->cache->fetch('[C]'.$cacheKey) >= $lastModification; + } + + /** + * Returns the time the class was last modified, testing traits and parents + * + * @return int + */ + private function getLastModification(ReflectionClass $class) + { + $filename = $class->getFileName(); + + if (isset($this->loadedFilemtimes[$filename])) { + return $this->loadedFilemtimes[$filename]; + } + + $parent = $class->getParentClass(); + + $lastModification = max(array_merge( + [$filename ? filemtime($filename) : 0], + array_map([$this, 'getTraitLastModificationTime'], $class->getTraits()), + array_map([$this, 'getLastModification'], $class->getInterfaces()), + $parent ? [$this->getLastModification($parent)] : [] + )); + + assert($lastModification !== false); + + return $this->loadedFilemtimes[$filename] = $lastModification; + } + + /** + * @return int + */ + private function getTraitLastModificationTime(ReflectionClass $reflectionTrait) + { + $fileName = $reflectionTrait->getFileName(); + + if (isset($this->loadedFilemtimes[$fileName])) { + return $this->loadedFilemtimes[$fileName]; + } + + $lastModificationTime = max(array_merge( + [$fileName ? filemtime($fileName) : 0], + array_map([$this, 'getTraitLastModificationTime'], $reflectionTrait->getTraits()) + )); + + assert($lastModificationTime !== false); + + return $this->loadedFilemtimes[$fileName] = $lastModificationTime; + } +} diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/DocLexer.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/DocLexer.php new file mode 100644 index 0000000000..8182f6c6e0 --- /dev/null +++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/DocLexer.php @@ -0,0 +1,147 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Lexer\AbstractLexer; + +/** + * Simple lexer for docblock annotations. + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Johannes M. Schmitt + */ +final class DocLexer extends AbstractLexer +{ + const T_NONE = 1; + const T_INTEGER = 2; + const T_STRING = 3; + const T_FLOAT = 4; + + // All tokens that are also identifiers should be >= 100 + const T_IDENTIFIER = 100; + const T_AT = 101; + const T_CLOSE_CURLY_BRACES = 102; + const T_CLOSE_PARENTHESIS = 103; + const T_COMMA = 104; + const T_EQUALS = 105; + const T_FALSE = 106; + const T_NAMESPACE_SEPARATOR = 107; + const T_OPEN_CURLY_BRACES = 108; + const T_OPEN_PARENTHESIS = 109; + const T_TRUE = 110; + const T_NULL = 111; + const T_COLON = 112; + const T_MINUS = 113; + + /** + * @var array + */ + protected $noCase = [ + '@' => self::T_AT, + ',' => self::T_COMMA, + '(' => self::T_OPEN_PARENTHESIS, + ')' => self::T_CLOSE_PARENTHESIS, + '{' => self::T_OPEN_CURLY_BRACES, + '}' => self::T_CLOSE_CURLY_BRACES, + '=' => self::T_EQUALS, + ':' => self::T_COLON, + '-' => self::T_MINUS, + '\\' => self::T_NAMESPACE_SEPARATOR + ]; + + /** + * @var array + */ + protected $withCase = [ + 'true' => self::T_TRUE, + 'false' => self::T_FALSE, + 'null' => self::T_NULL + ]; + + /** + * Whether the next token starts immediately, or if there were + * non-captured symbols before that + */ + public function nextTokenIsAdjacent() : bool + { + return $this->token === null + || ($this->lookahead !== null + && ($this->lookahead['position'] - $this->token['position']) === strlen($this->token['value'])); + } + + /** + * {@inheritdoc} + */ + protected function getCatchablePatterns() + { + return [ + '[a-z_\\\][a-z0-9_\:\\\]*[a-z_][a-z0-9_]*', + '(?:[+-]?[0-9]+(?:[\.][0-9]+)*)(?:[eE][+-]?[0-9]+)?', + '"(?:""|[^"])*+"', + ]; + } + + /** + * {@inheritdoc} + */ + protected function getNonCatchablePatterns() + { + return ['\s+', '\*+', '(.)']; + } + + /** + * {@inheritdoc} + */ + protected function getType(&$value) + { + $type = self::T_NONE; + + if ($value[0] === '"') { + $value = str_replace('""', '"', substr($value, 1, strlen($value) - 2)); + + return self::T_STRING; + } + + if (isset($this->noCase[$value])) { + return $this->noCase[$value]; + } + + if ($value[0] === '_' || $value[0] === '\\' || ctype_alpha($value[0])) { + return self::T_IDENTIFIER; + } + + $lowerValue = strtolower($value); + + if (isset($this->withCase[$lowerValue])) { + return $this->withCase[$lowerValue]; + } + + // Checking numeric value + if (is_numeric($value)) { + return (strpos($value, '.') !== false || stripos($value, 'e') !== false) + ? self::T_FLOAT : self::T_INTEGER; + } + + return $type; + } +} diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/DocParser.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/DocParser.php new file mode 100644 index 0000000000..741149ae24 --- /dev/null +++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/DocParser.php @@ -0,0 +1,1221 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Annotations\Annotation\Attribute; +use ReflectionClass; +use Doctrine\Common\Annotations\Annotation\Enum; +use Doctrine\Common\Annotations\Annotation\Target; +use Doctrine\Common\Annotations\Annotation\Attributes; + +/** + * A parser for docblock annotations. + * + * It is strongly discouraged to change the default annotation parsing process. + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Johannes M. Schmitt + * @author Fabio B. Silva + */ +final class DocParser +{ + /** + * An array of all valid tokens for a class name. + * + * @var array + */ + private static $classIdentifiers = [ + DocLexer::T_IDENTIFIER, + DocLexer::T_TRUE, + DocLexer::T_FALSE, + DocLexer::T_NULL + ]; + + /** + * The lexer. + * + * @var \Doctrine\Common\Annotations\DocLexer + */ + private $lexer; + + /** + * Current target context. + * + * @var integer + */ + private $target; + + /** + * Doc parser used to collect annotation target. + * + * @var \Doctrine\Common\Annotations\DocParser + */ + private static $metadataParser; + + /** + * Flag to control if the current annotation is nested or not. + * + * @var boolean + */ + private $isNestedAnnotation = false; + + /** + * Hashmap containing all use-statements that are to be used when parsing + * the given doc block. + * + * @var array + */ + private $imports = []; + + /** + * This hashmap is used internally to cache results of class_exists() + * look-ups. + * + * @var array + */ + private $classExists = []; + + /** + * Whether annotations that have not been imported should be ignored. + * + * @var boolean + */ + private $ignoreNotImportedAnnotations = false; + + /** + * An array of default namespaces if operating in simple mode. + * + * @var string[] + */ + private $namespaces = []; + + /** + * A list with annotations that are not causing exceptions when not resolved to an annotation class. + * + * The names must be the raw names as used in the class, not the fully qualified + * class names. + * + * @var bool[] indexed by annotation name + */ + private $ignoredAnnotationNames = []; + + /** + * A list with annotations in namespaced format + * that are not causing exceptions when not resolved to an annotation class. + * + * @var bool[] indexed by namespace name + */ + private $ignoredAnnotationNamespaces = []; + + /** + * @var string + */ + private $context = ''; + + /** + * Hash-map for caching annotation metadata. + * + * @var array + */ + private static $annotationMetadata = [ + 'Doctrine\Common\Annotations\Annotation\Target' => [ + 'is_annotation' => true, + 'has_constructor' => true, + 'properties' => [], + 'targets_literal' => 'ANNOTATION_CLASS', + 'targets' => Target::TARGET_CLASS, + 'default_property' => 'value', + 'attribute_types' => [ + 'value' => [ + 'required' => false, + 'type' =>'array', + 'array_type'=>'string', + 'value' =>'array' + ] + ], + ], + 'Doctrine\Common\Annotations\Annotation\Attribute' => [ + 'is_annotation' => true, + 'has_constructor' => false, + 'targets_literal' => 'ANNOTATION_ANNOTATION', + 'targets' => Target::TARGET_ANNOTATION, + 'default_property' => 'name', + 'properties' => [ + 'name' => 'name', + 'type' => 'type', + 'required' => 'required' + ], + 'attribute_types' => [ + 'value' => [ + 'required' => true, + 'type' =>'string', + 'value' =>'string' + ], + 'type' => [ + 'required' =>true, + 'type' =>'string', + 'value' =>'string' + ], + 'required' => [ + 'required' =>false, + 'type' =>'boolean', + 'value' =>'boolean' + ] + ], + ], + 'Doctrine\Common\Annotations\Annotation\Attributes' => [ + 'is_annotation' => true, + 'has_constructor' => false, + 'targets_literal' => 'ANNOTATION_CLASS', + 'targets' => Target::TARGET_CLASS, + 'default_property' => 'value', + 'properties' => [ + 'value' => 'value' + ], + 'attribute_types' => [ + 'value' => [ + 'type' =>'array', + 'required' =>true, + 'array_type'=>'Doctrine\Common\Annotations\Annotation\Attribute', + 'value' =>'array' + ] + ], + ], + 'Doctrine\Common\Annotations\Annotation\Enum' => [ + 'is_annotation' => true, + 'has_constructor' => true, + 'targets_literal' => 'ANNOTATION_PROPERTY', + 'targets' => Target::TARGET_PROPERTY, + 'default_property' => 'value', + 'properties' => [ + 'value' => 'value' + ], + 'attribute_types' => [ + 'value' => [ + 'type' => 'array', + 'required' => true, + ], + 'literal' => [ + 'type' => 'array', + 'required' => false, + ], + ], + ], + ]; + + /** + * Hash-map for handle types declaration. + * + * @var array + */ + private static $typeMap = [ + 'float' => 'double', + 'bool' => 'boolean', + // allow uppercase Boolean in honor of George Boole + 'Boolean' => 'boolean', + 'int' => 'integer', + ]; + + /** + * Constructs a new DocParser. + */ + public function __construct() + { + $this->lexer = new DocLexer; + } + + /** + * Sets the annotation names that are ignored during the parsing process. + * + * The names are supposed to be the raw names as used in the class, not the + * fully qualified class names. + * + * @param bool[] $names indexed by annotation name + * + * @return void + */ + public function setIgnoredAnnotationNames(array $names) + { + $this->ignoredAnnotationNames = $names; + } + + /** + * Sets the annotation namespaces that are ignored during the parsing process. + * + * @param bool[] $ignoredAnnotationNamespaces indexed by annotation namespace name + * + * @return void + */ + public function setIgnoredAnnotationNamespaces($ignoredAnnotationNamespaces) + { + $this->ignoredAnnotationNamespaces = $ignoredAnnotationNamespaces; + } + + /** + * Sets ignore on not-imported annotations. + * + * @param boolean $bool + * + * @return void + */ + public function setIgnoreNotImportedAnnotations($bool) + { + $this->ignoreNotImportedAnnotations = (boolean) $bool; + } + + /** + * Sets the default namespaces. + * + * @param string $namespace + * + * @return void + * + * @throws \RuntimeException + */ + public function addNamespace($namespace) + { + if ($this->imports) { + throw new \RuntimeException('You must either use addNamespace(), or setImports(), but not both.'); + } + + $this->namespaces[] = $namespace; + } + + /** + * Sets the imports. + * + * @param array $imports + * + * @return void + * + * @throws \RuntimeException + */ + public function setImports(array $imports) + { + if ($this->namespaces) { + throw new \RuntimeException('You must either use addNamespace(), or setImports(), but not both.'); + } + + $this->imports = $imports; + } + + /** + * Sets current target context as bitmask. + * + * @param integer $target + * + * @return void + */ + public function setTarget($target) + { + $this->target = $target; + } + + /** + * Parses the given docblock string for annotations. + * + * @param string $input The docblock string to parse. + * @param string $context The parsing context. + * + * @return array Array of annotations. If no annotations are found, an empty array is returned. + */ + public function parse($input, $context = '') + { + $pos = $this->findInitialTokenPosition($input); + if ($pos === null) { + return []; + } + + $this->context = $context; + + $this->lexer->setInput(trim(substr($input, $pos), '* /')); + $this->lexer->moveNext(); + + return $this->Annotations(); + } + + /** + * Finds the first valid annotation + * + * @param string $input The docblock string to parse + * + * @return int|null + */ + private function findInitialTokenPosition($input) + { + $pos = 0; + + // search for first valid annotation + while (($pos = strpos($input, '@', $pos)) !== false) { + $preceding = substr($input, $pos - 1, 1); + + // if the @ is preceded by a space, a tab or * it is valid + if ($pos === 0 || $preceding === ' ' || $preceding === '*' || $preceding === "\t") { + return $pos; + } + + $pos++; + } + + return null; + } + + /** + * Attempts to match the given token with the current lookahead token. + * If they match, updates the lookahead token; otherwise raises a syntax error. + * + * @param integer $token Type of token. + * + * @return boolean True if tokens match; false otherwise. + */ + private function match($token) + { + if ( ! $this->lexer->isNextToken($token) ) { + $this->syntaxError($this->lexer->getLiteral($token)); + } + + return $this->lexer->moveNext(); + } + + /** + * Attempts to match the current lookahead token with any of the given tokens. + * + * If any of them matches, this method updates the lookahead token; otherwise + * a syntax error is raised. + * + * @param array $tokens + * + * @return boolean + */ + private function matchAny(array $tokens) + { + if ( ! $this->lexer->isNextTokenAny($tokens)) { + $this->syntaxError(implode(' or ', array_map([$this->lexer, 'getLiteral'], $tokens))); + } + + return $this->lexer->moveNext(); + } + + /** + * Generates a new syntax error. + * + * @param string $expected Expected string. + * @param array|null $token Optional token. + * + * @return void + * + * @throws AnnotationException + */ + private function syntaxError($expected, $token = null) + { + if ($token === null) { + $token = $this->lexer->lookahead; + } + + $message = sprintf('Expected %s, got ', $expected); + $message .= ($this->lexer->lookahead === null) + ? 'end of string' + : sprintf("'%s' at position %s", $token['value'], $token['position']); + + if (strlen($this->context)) { + $message .= ' in ' . $this->context; + } + + $message .= '.'; + + throw AnnotationException::syntaxError($message); + } + + /** + * Attempts to check if a class exists or not. This never goes through the PHP autoloading mechanism + * but uses the {@link AnnotationRegistry} to load classes. + * + * @param string $fqcn + * + * @return boolean + */ + private function classExists($fqcn) + { + if (isset($this->classExists[$fqcn])) { + return $this->classExists[$fqcn]; + } + + // first check if the class already exists, maybe loaded through another AnnotationReader + if (class_exists($fqcn, false)) { + return $this->classExists[$fqcn] = true; + } + + // final check, does this class exist? + return $this->classExists[$fqcn] = AnnotationRegistry::loadAnnotationClass($fqcn); + } + + /** + * Collects parsing metadata for a given annotation class + * + * @param string $name The annotation name + * + * @return void + */ + private function collectAnnotationMetadata($name) + { + if (self::$metadataParser === null) { + self::$metadataParser = new self(); + + self::$metadataParser->setIgnoreNotImportedAnnotations(true); + self::$metadataParser->setIgnoredAnnotationNames($this->ignoredAnnotationNames); + self::$metadataParser->setImports([ + 'enum' => 'Doctrine\Common\Annotations\Annotation\Enum', + 'target' => 'Doctrine\Common\Annotations\Annotation\Target', + 'attribute' => 'Doctrine\Common\Annotations\Annotation\Attribute', + 'attributes' => 'Doctrine\Common\Annotations\Annotation\Attributes' + ]); + + // Make sure that annotations from metadata are loaded + class_exists(Enum::class); + class_exists(Target::class); + class_exists(Attribute::class); + class_exists(Attributes::class); + } + + $class = new \ReflectionClass($name); + $docComment = $class->getDocComment(); + + // Sets default values for annotation metadata + $metadata = [ + 'default_property' => null, + 'has_constructor' => (null !== $constructor = $class->getConstructor()) && $constructor->getNumberOfParameters() > 0, + 'properties' => [], + 'property_types' => [], + 'attribute_types' => [], + 'targets_literal' => null, + 'targets' => Target::TARGET_ALL, + 'is_annotation' => false !== strpos($docComment, '@Annotation'), + ]; + + // verify that the class is really meant to be an annotation + if ($metadata['is_annotation']) { + self::$metadataParser->setTarget(Target::TARGET_CLASS); + + foreach (self::$metadataParser->parse($docComment, 'class @' . $name) as $annotation) { + if ($annotation instanceof Target) { + $metadata['targets'] = $annotation->targets; + $metadata['targets_literal'] = $annotation->literal; + + continue; + } + + if ($annotation instanceof Attributes) { + foreach ($annotation->value as $attribute) { + $this->collectAttributeTypeMetadata($metadata, $attribute); + } + } + } + + // if not has a constructor will inject values into public properties + if (false === $metadata['has_constructor']) { + // collect all public properties + foreach ($class->getProperties(\ReflectionProperty::IS_PUBLIC) as $property) { + $metadata['properties'][$property->name] = $property->name; + + if (false === ($propertyComment = $property->getDocComment())) { + continue; + } + + $attribute = new Attribute(); + + $attribute->required = (false !== strpos($propertyComment, '@Required')); + $attribute->name = $property->name; + $attribute->type = (false !== strpos($propertyComment, '@var') && preg_match('/@var\s+([^\s]+)/',$propertyComment, $matches)) + ? $matches[1] + : 'mixed'; + + $this->collectAttributeTypeMetadata($metadata, $attribute); + + // checks if the property has @Enum + if (false !== strpos($propertyComment, '@Enum')) { + $context = 'property ' . $class->name . "::\$" . $property->name; + + self::$metadataParser->setTarget(Target::TARGET_PROPERTY); + + foreach (self::$metadataParser->parse($propertyComment, $context) as $annotation) { + if ( ! $annotation instanceof Enum) { + continue; + } + + $metadata['enum'][$property->name]['value'] = $annotation->value; + $metadata['enum'][$property->name]['literal'] = ( ! empty($annotation->literal)) + ? $annotation->literal + : $annotation->value; + } + } + } + + // choose the first property as default property + $metadata['default_property'] = reset($metadata['properties']); + } + } + + self::$annotationMetadata[$name] = $metadata; + } + + /** + * Collects parsing metadata for a given attribute. + * + * @param array $metadata + * @param Attribute $attribute + * + * @return void + */ + private function collectAttributeTypeMetadata(&$metadata, Attribute $attribute) + { + // handle internal type declaration + $type = self::$typeMap[$attribute->type] ?? $attribute->type; + + // handle the case if the property type is mixed + if ('mixed' === $type) { + return; + } + + // Evaluate type + switch (true) { + // Checks if the property has array + case (false !== $pos = strpos($type, '<')): + $arrayType = substr($type, $pos + 1, -1); + $type = 'array'; + + if (isset(self::$typeMap[$arrayType])) { + $arrayType = self::$typeMap[$arrayType]; + } + + $metadata['attribute_types'][$attribute->name]['array_type'] = $arrayType; + break; + + // Checks if the property has type[] + case (false !== $pos = strrpos($type, '[')): + $arrayType = substr($type, 0, $pos); + $type = 'array'; + + if (isset(self::$typeMap[$arrayType])) { + $arrayType = self::$typeMap[$arrayType]; + } + + $metadata['attribute_types'][$attribute->name]['array_type'] = $arrayType; + break; + } + + $metadata['attribute_types'][$attribute->name]['type'] = $type; + $metadata['attribute_types'][$attribute->name]['value'] = $attribute->type; + $metadata['attribute_types'][$attribute->name]['required'] = $attribute->required; + } + + /** + * Annotations ::= Annotation {[ "*" ]* [Annotation]}* + * + * @return array + */ + private function Annotations() + { + $annotations = []; + + while (null !== $this->lexer->lookahead) { + if (DocLexer::T_AT !== $this->lexer->lookahead['type']) { + $this->lexer->moveNext(); + continue; + } + + // make sure the @ is preceded by non-catchable pattern + if (null !== $this->lexer->token && $this->lexer->lookahead['position'] === $this->lexer->token['position'] + strlen($this->lexer->token['value'])) { + $this->lexer->moveNext(); + continue; + } + + // make sure the @ is followed by either a namespace separator, or + // an identifier token + if ((null === $peek = $this->lexer->glimpse()) + || (DocLexer::T_NAMESPACE_SEPARATOR !== $peek['type'] && !in_array($peek['type'], self::$classIdentifiers, true)) + || $peek['position'] !== $this->lexer->lookahead['position'] + 1) { + $this->lexer->moveNext(); + continue; + } + + $this->isNestedAnnotation = false; + if (false !== $annot = $this->Annotation()) { + $annotations[] = $annot; + } + } + + return $annotations; + } + + /** + * Annotation ::= "@" AnnotationName MethodCall + * AnnotationName ::= QualifiedName | SimpleName + * QualifiedName ::= NameSpacePart "\" {NameSpacePart "\"}* SimpleName + * NameSpacePart ::= identifier | null | false | true + * SimpleName ::= identifier | null | false | true + * + * @return mixed False if it is not a valid annotation. + * + * @throws AnnotationException + */ + private function Annotation() + { + $this->match(DocLexer::T_AT); + + // check if we have an annotation + $name = $this->Identifier(); + + if ($this->lexer->isNextToken(DocLexer::T_MINUS) + && $this->lexer->nextTokenIsAdjacent() + ) { + // Annotations with dashes, such as "@foo-" or "@foo-bar", are to be discarded + return false; + } + + // only process names which are not fully qualified, yet + // fully qualified names must start with a \ + $originalName = $name; + + if ('\\' !== $name[0]) { + $pos = strpos($name, '\\'); + $alias = (false === $pos)? $name : substr($name, 0, $pos); + $found = false; + $loweredAlias = strtolower($alias); + + if ($this->namespaces) { + foreach ($this->namespaces as $namespace) { + if ($this->classExists($namespace.'\\'.$name)) { + $name = $namespace.'\\'.$name; + $found = true; + break; + } + } + } elseif (isset($this->imports[$loweredAlias])) { + $namespace = ltrim($this->imports[$loweredAlias], '\\'); + $name = (false !== $pos) + ? $namespace . substr($name, $pos) + : $namespace; + $found = $this->classExists($name); + } elseif ( ! isset($this->ignoredAnnotationNames[$name]) + && isset($this->imports['__NAMESPACE__']) + && $this->classExists($this->imports['__NAMESPACE__'] . '\\' . $name) + ) { + $name = $this->imports['__NAMESPACE__'].'\\'.$name; + $found = true; + } elseif (! isset($this->ignoredAnnotationNames[$name]) && $this->classExists($name)) { + $found = true; + } + + if ( ! $found) { + if ($this->isIgnoredAnnotation($name)) { + return false; + } + + throw AnnotationException::semanticalError(sprintf('The annotation "@%s" in %s was never imported. Did you maybe forget to add a "use" statement for this annotation?', $name, $this->context)); + } + } + + $name = ltrim($name,'\\'); + + if ( ! $this->classExists($name)) { + throw AnnotationException::semanticalError(sprintf('The annotation "@%s" in %s does not exist, or could not be auto-loaded.', $name, $this->context)); + } + + // at this point, $name contains the fully qualified class name of the + // annotation, and it is also guaranteed that this class exists, and + // that it is loaded + + + // collects the metadata annotation only if there is not yet + if ( ! isset(self::$annotationMetadata[$name])) { + $this->collectAnnotationMetadata($name); + } + + // verify that the class is really meant to be an annotation and not just any ordinary class + if (self::$annotationMetadata[$name]['is_annotation'] === false) { + if ($this->isIgnoredAnnotation($originalName) || $this->isIgnoredAnnotation($name)) { + return false; + } + + throw AnnotationException::semanticalError(sprintf('The class "%s" is not annotated with @Annotation. Are you sure this class can be used as annotation? If so, then you need to add @Annotation to the _class_ doc comment of "%s". If it is indeed no annotation, then you need to add @IgnoreAnnotation("%s") to the _class_ doc comment of %s.', $name, $name, $originalName, $this->context)); + } + + //if target is nested annotation + $target = $this->isNestedAnnotation ? Target::TARGET_ANNOTATION : $this->target; + + // Next will be nested + $this->isNestedAnnotation = true; + + //if annotation does not support current target + if (0 === (self::$annotationMetadata[$name]['targets'] & $target) && $target) { + throw AnnotationException::semanticalError( + sprintf('Annotation @%s is not allowed to be declared on %s. You may only use this annotation on these code elements: %s.', + $originalName, $this->context, self::$annotationMetadata[$name]['targets_literal']) + ); + } + + $values = $this->MethodCall(); + + if (isset(self::$annotationMetadata[$name]['enum'])) { + // checks all declared attributes + foreach (self::$annotationMetadata[$name]['enum'] as $property => $enum) { + // checks if the attribute is a valid enumerator + if (isset($values[$property]) && ! in_array($values[$property], $enum['value'])) { + throw AnnotationException::enumeratorError($property, $name, $this->context, $enum['literal'], $values[$property]); + } + } + } + + // checks all declared attributes + foreach (self::$annotationMetadata[$name]['attribute_types'] as $property => $type) { + if ($property === self::$annotationMetadata[$name]['default_property'] + && !isset($values[$property]) && isset($values['value'])) { + $property = 'value'; + } + + // handle a not given attribute or null value + if (!isset($values[$property])) { + if ($type['required']) { + throw AnnotationException::requiredError($property, $originalName, $this->context, 'a(n) '.$type['value']); + } + + continue; + } + + if ($type['type'] === 'array') { + // handle the case of a single value + if ( ! is_array($values[$property])) { + $values[$property] = [$values[$property]]; + } + + // checks if the attribute has array type declaration, such as "array" + if (isset($type['array_type'])) { + foreach ($values[$property] as $item) { + if (gettype($item) !== $type['array_type'] && !$item instanceof $type['array_type']) { + throw AnnotationException::attributeTypeError($property, $originalName, $this->context, 'either a(n) '.$type['array_type'].', or an array of '.$type['array_type'].'s', $item); + } + } + } + } elseif (gettype($values[$property]) !== $type['type'] && !$values[$property] instanceof $type['type']) { + throw AnnotationException::attributeTypeError($property, $originalName, $this->context, 'a(n) '.$type['value'], $values[$property]); + } + } + + // check if the annotation expects values via the constructor, + // or directly injected into public properties + if (self::$annotationMetadata[$name]['has_constructor'] === true) { + return new $name($values); + } + + $instance = new $name(); + + foreach ($values as $property => $value) { + if (!isset(self::$annotationMetadata[$name]['properties'][$property])) { + if ('value' !== $property) { + throw AnnotationException::creationError(sprintf('The annotation @%s declared on %s does not have a property named "%s". Available properties: %s', $originalName, $this->context, $property, implode(', ', self::$annotationMetadata[$name]['properties']))); + } + + // handle the case if the property has no annotations + if ( ! $property = self::$annotationMetadata[$name]['default_property']) { + throw AnnotationException::creationError(sprintf('The annotation @%s declared on %s does not accept any values, but got %s.', $originalName, $this->context, json_encode($values))); + } + } + + $instance->{$property} = $value; + } + + return $instance; + } + + /** + * MethodCall ::= ["(" [Values] ")"] + * + * @return array + */ + private function MethodCall() + { + $values = []; + + if ( ! $this->lexer->isNextToken(DocLexer::T_OPEN_PARENTHESIS)) { + return $values; + } + + $this->match(DocLexer::T_OPEN_PARENTHESIS); + + if ( ! $this->lexer->isNextToken(DocLexer::T_CLOSE_PARENTHESIS)) { + $values = $this->Values(); + } + + $this->match(DocLexer::T_CLOSE_PARENTHESIS); + + return $values; + } + + /** + * Values ::= Array | Value {"," Value}* [","] + * + * @return array + */ + private function Values() + { + $values = [$this->Value()]; + + while ($this->lexer->isNextToken(DocLexer::T_COMMA)) { + $this->match(DocLexer::T_COMMA); + + if ($this->lexer->isNextToken(DocLexer::T_CLOSE_PARENTHESIS)) { + break; + } + + $token = $this->lexer->lookahead; + $value = $this->Value(); + + if ( ! is_object($value) && ! is_array($value)) { + $this->syntaxError('Value', $token); + } + + $values[] = $value; + } + + foreach ($values as $k => $value) { + if (is_object($value) && $value instanceof \stdClass) { + $values[$value->name] = $value->value; + } else if ( ! isset($values['value'])){ + $values['value'] = $value; + } else { + if ( ! is_array($values['value'])) { + $values['value'] = [$values['value']]; + } + + $values['value'][] = $value; + } + + unset($values[$k]); + } + + return $values; + } + + /** + * Constant ::= integer | string | float | boolean + * + * @return mixed + * + * @throws AnnotationException + */ + private function Constant() + { + $identifier = $this->Identifier(); + + if ( ! defined($identifier) && false !== strpos($identifier, '::') && '\\' !== $identifier[0]) { + list($className, $const) = explode('::', $identifier); + + $pos = strpos($className, '\\'); + $alias = (false === $pos) ? $className : substr($className, 0, $pos); + $found = false; + $loweredAlias = strtolower($alias); + + switch (true) { + case !empty ($this->namespaces): + foreach ($this->namespaces as $ns) { + if (class_exists($ns.'\\'.$className) || interface_exists($ns.'\\'.$className)) { + $className = $ns.'\\'.$className; + $found = true; + break; + } + } + break; + + case isset($this->imports[$loweredAlias]): + $found = true; + $className = (false !== $pos) + ? $this->imports[$loweredAlias] . substr($className, $pos) + : $this->imports[$loweredAlias]; + break; + + default: + if(isset($this->imports['__NAMESPACE__'])) { + $ns = $this->imports['__NAMESPACE__']; + + if (class_exists($ns.'\\'.$className) || interface_exists($ns.'\\'.$className)) { + $className = $ns.'\\'.$className; + $found = true; + } + } + break; + } + + if ($found) { + $identifier = $className . '::' . $const; + } + } + + /** + * Checks if identifier ends with ::class and remove the leading backslash if it exists. + */ + if ($this->identifierEndsWithClassConstant($identifier) && ! $this->identifierStartsWithBackslash($identifier)) { + return substr($identifier, 0, $this->getClassConstantPositionInIdentifier($identifier)); + } + if ($this->identifierEndsWithClassConstant($identifier) && $this->identifierStartsWithBackslash($identifier)) { + return substr($identifier, 1, $this->getClassConstantPositionInIdentifier($identifier) - 1); + } + + if (!defined($identifier)) { + throw AnnotationException::semanticalErrorConstants($identifier, $this->context); + } + + return constant($identifier); + } + + private function identifierStartsWithBackslash(string $identifier) : bool + { + return '\\' === $identifier[0]; + } + + private function identifierEndsWithClassConstant(string $identifier) : bool + { + return $this->getClassConstantPositionInIdentifier($identifier) === strlen($identifier) - strlen('::class'); + } + + /** + * @return int|false + */ + private function getClassConstantPositionInIdentifier(string $identifier) + { + return stripos($identifier, '::class'); + } + + /** + * Identifier ::= string + * + * @return string + */ + private function Identifier() + { + // check if we have an annotation + if ( ! $this->lexer->isNextTokenAny(self::$classIdentifiers)) { + $this->syntaxError('namespace separator or identifier'); + } + + $this->lexer->moveNext(); + + $className = $this->lexer->token['value']; + + while ( + null !== $this->lexer->lookahead && + $this->lexer->lookahead['position'] === ($this->lexer->token['position'] + strlen($this->lexer->token['value'])) && + $this->lexer->isNextToken(DocLexer::T_NAMESPACE_SEPARATOR) + ) { + $this->match(DocLexer::T_NAMESPACE_SEPARATOR); + $this->matchAny(self::$classIdentifiers); + + $className .= '\\' . $this->lexer->token['value']; + } + + return $className; + } + + /** + * Value ::= PlainValue | FieldAssignment + * + * @return mixed + */ + private function Value() + { + $peek = $this->lexer->glimpse(); + + if (DocLexer::T_EQUALS === $peek['type']) { + return $this->FieldAssignment(); + } + + return $this->PlainValue(); + } + + /** + * PlainValue ::= integer | string | float | boolean | Array | Annotation + * + * @return mixed + */ + private function PlainValue() + { + if ($this->lexer->isNextToken(DocLexer::T_OPEN_CURLY_BRACES)) { + return $this->Arrayx(); + } + + if ($this->lexer->isNextToken(DocLexer::T_AT)) { + return $this->Annotation(); + } + + if ($this->lexer->isNextToken(DocLexer::T_IDENTIFIER)) { + return $this->Constant(); + } + + switch ($this->lexer->lookahead['type']) { + case DocLexer::T_STRING: + $this->match(DocLexer::T_STRING); + return $this->lexer->token['value']; + + case DocLexer::T_INTEGER: + $this->match(DocLexer::T_INTEGER); + return (int)$this->lexer->token['value']; + + case DocLexer::T_FLOAT: + $this->match(DocLexer::T_FLOAT); + return (float)$this->lexer->token['value']; + + case DocLexer::T_TRUE: + $this->match(DocLexer::T_TRUE); + return true; + + case DocLexer::T_FALSE: + $this->match(DocLexer::T_FALSE); + return false; + + case DocLexer::T_NULL: + $this->match(DocLexer::T_NULL); + return null; + + default: + $this->syntaxError('PlainValue'); + } + } + + /** + * FieldAssignment ::= FieldName "=" PlainValue + * FieldName ::= identifier + * + * @return \stdClass + */ + private function FieldAssignment() + { + $this->match(DocLexer::T_IDENTIFIER); + $fieldName = $this->lexer->token['value']; + + $this->match(DocLexer::T_EQUALS); + + $item = new \stdClass(); + $item->name = $fieldName; + $item->value = $this->PlainValue(); + + return $item; + } + + /** + * Array ::= "{" ArrayEntry {"," ArrayEntry}* [","] "}" + * + * @return array + */ + private function Arrayx() + { + $array = $values = []; + + $this->match(DocLexer::T_OPEN_CURLY_BRACES); + + // If the array is empty, stop parsing and return. + if ($this->lexer->isNextToken(DocLexer::T_CLOSE_CURLY_BRACES)) { + $this->match(DocLexer::T_CLOSE_CURLY_BRACES); + + return $array; + } + + $values[] = $this->ArrayEntry(); + + while ($this->lexer->isNextToken(DocLexer::T_COMMA)) { + $this->match(DocLexer::T_COMMA); + + // optional trailing comma + if ($this->lexer->isNextToken(DocLexer::T_CLOSE_CURLY_BRACES)) { + break; + } + + $values[] = $this->ArrayEntry(); + } + + $this->match(DocLexer::T_CLOSE_CURLY_BRACES); + + foreach ($values as $value) { + list ($key, $val) = $value; + + if ($key !== null) { + $array[$key] = $val; + } else { + $array[] = $val; + } + } + + return $array; + } + + /** + * ArrayEntry ::= Value | KeyValuePair + * KeyValuePair ::= Key ("=" | ":") PlainValue | Constant + * Key ::= string | integer | Constant + * + * @return array + */ + private function ArrayEntry() + { + $peek = $this->lexer->glimpse(); + + if (DocLexer::T_EQUALS === $peek['type'] + || DocLexer::T_COLON === $peek['type']) { + + if ($this->lexer->isNextToken(DocLexer::T_IDENTIFIER)) { + $key = $this->Constant(); + } else { + $this->matchAny([DocLexer::T_INTEGER, DocLexer::T_STRING]); + $key = $this->lexer->token['value']; + } + + $this->matchAny([DocLexer::T_EQUALS, DocLexer::T_COLON]); + + return [$key, $this->PlainValue()]; + } + + return [null, $this->Value()]; + } + + /** + * Checks whether the given $name matches any ignored annotation name or namespace + * + * @param string $name + * + * @return bool + */ + private function isIgnoredAnnotation($name) + { + if ($this->ignoreNotImportedAnnotations || isset($this->ignoredAnnotationNames[$name])) { + return true; + } + + foreach (array_keys($this->ignoredAnnotationNamespaces) as $ignoredAnnotationNamespace) { + $ignoredAnnotationNamespace = rtrim($ignoredAnnotationNamespace, '\\') . '\\'; + + if (0 === stripos(rtrim($name, '\\') . '\\', $ignoredAnnotationNamespace)) { + return true; + } + } + + return false; + } +} diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/FileCacheReader.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/FileCacheReader.php new file mode 100644 index 0000000000..40141af28e --- /dev/null +++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/FileCacheReader.php @@ -0,0 +1,290 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +/** + * File cache reader for annotations. + * + * @author Johannes M. Schmitt + * @author Benjamin Eberlei + * + * @deprecated the FileCacheReader is deprecated and will be removed + * in version 2.0.0 of doctrine/annotations. Please use the + * {@see \Doctrine\Common\Annotations\CachedReader} instead. + */ +class FileCacheReader implements Reader +{ + /** + * @var Reader + */ + private $reader; + + /** + * @var string + */ + private $dir; + + /** + * @var bool + */ + private $debug; + + /** + * @var array + */ + private $loadedAnnotations = []; + + /** + * @var array + */ + private $classNameHashes = []; + + /** + * @var int + */ + private $umask; + + /** + * Constructor. + * + * @param Reader $reader + * @param string $cacheDir + * @param boolean $debug + * + * @throws \InvalidArgumentException + */ + public function __construct(Reader $reader, $cacheDir, $debug = false, $umask = 0002) + { + if ( ! is_int($umask)) { + throw new \InvalidArgumentException(sprintf( + 'The parameter umask must be an integer, was: %s', + gettype($umask) + )); + } + + $this->reader = $reader; + $this->umask = $umask; + + if (!is_dir($cacheDir) && !@mkdir($cacheDir, 0777 & (~$this->umask), true)) { + throw new \InvalidArgumentException(sprintf('The directory "%s" does not exist and could not be created.', $cacheDir)); + } + + $this->dir = rtrim($cacheDir, '\\/'); + $this->debug = $debug; + } + + /** + * {@inheritDoc} + */ + public function getClassAnnotations(\ReflectionClass $class) + { + if ( ! isset($this->classNameHashes[$class->name])) { + $this->classNameHashes[$class->name] = sha1($class->name); + } + $key = $this->classNameHashes[$class->name]; + + if (isset($this->loadedAnnotations[$key])) { + return $this->loadedAnnotations[$key]; + } + + $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php'; + if (!is_file($path)) { + $annot = $this->reader->getClassAnnotations($class); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + if ($this->debug + && (false !== $filename = $class->getFileName()) + && filemtime($path) < filemtime($filename)) { + @unlink($path); + + $annot = $this->reader->getClassAnnotations($class); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + return $this->loadedAnnotations[$key] = include $path; + } + + /** + * {@inheritDoc} + */ + public function getPropertyAnnotations(\ReflectionProperty $property) + { + $class = $property->getDeclaringClass(); + if ( ! isset($this->classNameHashes[$class->name])) { + $this->classNameHashes[$class->name] = sha1($class->name); + } + $key = $this->classNameHashes[$class->name].'$'.$property->getName(); + + if (isset($this->loadedAnnotations[$key])) { + return $this->loadedAnnotations[$key]; + } + + $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php'; + if (!is_file($path)) { + $annot = $this->reader->getPropertyAnnotations($property); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + if ($this->debug + && (false !== $filename = $class->getFilename()) + && filemtime($path) < filemtime($filename)) { + @unlink($path); + + $annot = $this->reader->getPropertyAnnotations($property); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + return $this->loadedAnnotations[$key] = include $path; + } + + /** + * {@inheritDoc} + */ + public function getMethodAnnotations(\ReflectionMethod $method) + { + $class = $method->getDeclaringClass(); + if ( ! isset($this->classNameHashes[$class->name])) { + $this->classNameHashes[$class->name] = sha1($class->name); + } + $key = $this->classNameHashes[$class->name].'#'.$method->getName(); + + if (isset($this->loadedAnnotations[$key])) { + return $this->loadedAnnotations[$key]; + } + + $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php'; + if (!is_file($path)) { + $annot = $this->reader->getMethodAnnotations($method); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + if ($this->debug + && (false !== $filename = $class->getFilename()) + && filemtime($path) < filemtime($filename)) { + @unlink($path); + + $annot = $this->reader->getMethodAnnotations($method); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + return $this->loadedAnnotations[$key] = include $path; + } + + /** + * Saves the cache file. + * + * @param string $path + * @param mixed $data + * + * @return void + */ + private function saveCacheFile($path, $data) + { + if (!is_writable($this->dir)) { + throw new \InvalidArgumentException(sprintf('The directory "%s" is not writable. Both, the webserver and the console user need access. You can manage access rights for multiple users with "chmod +a". If your system does not support this, check out the acl package.', $this->dir)); + } + + $tempfile = tempnam($this->dir, uniqid('', true)); + + if (false === $tempfile) { + throw new \RuntimeException(sprintf('Unable to create tempfile in directory: %s', $this->dir)); + } + + @chmod($tempfile, 0666 & (~$this->umask)); + + $written = file_put_contents($tempfile, 'umask)); + + if (false === rename($tempfile, $path)) { + @unlink($tempfile); + throw new \RuntimeException(sprintf('Unable to rename %s to %s', $tempfile, $path)); + } + } + + /** + * {@inheritDoc} + */ + public function getClassAnnotation(\ReflectionClass $class, $annotationName) + { + $annotations = $this->getClassAnnotations($class); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * {@inheritDoc} + */ + public function getMethodAnnotation(\ReflectionMethod $method, $annotationName) + { + $annotations = $this->getMethodAnnotations($method); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * {@inheritDoc} + */ + public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName) + { + $annotations = $this->getPropertyAnnotations($property); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Clears loaded annotations. + * + * @return void + */ + public function clearLoadedAnnotations() + { + $this->loadedAnnotations = []; + } +} diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/IndexedReader.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/IndexedReader.php new file mode 100644 index 0000000000..4e8c3c8c3c --- /dev/null +++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/IndexedReader.php @@ -0,0 +1,119 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +/** + * Allows the reader to be used in-place of Doctrine's reader. + * + * @author Johannes M. Schmitt + */ +class IndexedReader implements Reader +{ + /** + * @var Reader + */ + private $delegate; + + /** + * Constructor. + * + * @param Reader $reader + */ + public function __construct(Reader $reader) + { + $this->delegate = $reader; + } + + /** + * {@inheritDoc} + */ + public function getClassAnnotations(\ReflectionClass $class) + { + $annotations = []; + foreach ($this->delegate->getClassAnnotations($class) as $annot) { + $annotations[get_class($annot)] = $annot; + } + + return $annotations; + } + + /** + * {@inheritDoc} + */ + public function getClassAnnotation(\ReflectionClass $class, $annotation) + { + return $this->delegate->getClassAnnotation($class, $annotation); + } + + /** + * {@inheritDoc} + */ + public function getMethodAnnotations(\ReflectionMethod $method) + { + $annotations = []; + foreach ($this->delegate->getMethodAnnotations($method) as $annot) { + $annotations[get_class($annot)] = $annot; + } + + return $annotations; + } + + /** + * {@inheritDoc} + */ + public function getMethodAnnotation(\ReflectionMethod $method, $annotation) + { + return $this->delegate->getMethodAnnotation($method, $annotation); + } + + /** + * {@inheritDoc} + */ + public function getPropertyAnnotations(\ReflectionProperty $property) + { + $annotations = []; + foreach ($this->delegate->getPropertyAnnotations($property) as $annot) { + $annotations[get_class($annot)] = $annot; + } + + return $annotations; + } + + /** + * {@inheritDoc} + */ + public function getPropertyAnnotation(\ReflectionProperty $property, $annotation) + { + return $this->delegate->getPropertyAnnotation($property, $annotation); + } + + /** + * Proxies all methods to the delegate. + * + * @param string $method + * @param array $args + * + * @return mixed + */ + public function __call($method, $args) + { + return call_user_func_array([$this->delegate, $method], $args); + } +} diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/PhpParser.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/PhpParser.php new file mode 100644 index 0000000000..ec871813ba --- /dev/null +++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/PhpParser.php @@ -0,0 +1,91 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use SplFileObject; + +/** + * Parses a file for namespaces/use/class declarations. + * + * @author Fabien Potencier + * @author Christian Kaps + */ +final class PhpParser +{ + /** + * Parses a class. + * + * @param \ReflectionClass $class A ReflectionClass object. + * + * @return array A list with use statements in the form (Alias => FQN). + */ + public function parseClass(\ReflectionClass $class) + { + if (method_exists($class, 'getUseStatements')) { + return $class->getUseStatements(); + } + + if (false === $filename = $class->getFileName()) { + return []; + } + + $content = $this->getFileContent($filename, $class->getStartLine()); + + if (null === $content) { + return []; + } + + $namespace = preg_quote($class->getNamespaceName()); + $content = preg_replace('/^.*?(\bnamespace\s+' . $namespace . '\s*[;{].*)$/s', '\\1', $content); + $tokenizer = new TokenParser('parseUseStatements($class->getNamespaceName()); + + return $statements; + } + + /** + * Gets the content of the file right up to the given line number. + * + * @param string $filename The name of the file to load. + * @param integer $lineNumber The number of lines to read from file. + * + * @return string|null The content of the file or null if the file does not exist. + */ + private function getFileContent($filename, $lineNumber) + { + if ( ! is_file($filename)) { + return null; + } + + $content = ''; + $lineCnt = 0; + $file = new SplFileObject($filename); + while (!$file->eof()) { + if ($lineCnt++ == $lineNumber) { + break; + } + + $content .= $file->fgets(); + } + + return $content; + } +} diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Reader.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Reader.php new file mode 100644 index 0000000000..4774f87312 --- /dev/null +++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Reader.php @@ -0,0 +1,89 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +/** + * Interface for annotation readers. + * + * @author Johannes M. Schmitt + */ +interface Reader +{ + /** + * Gets the annotations applied to a class. + * + * @param \ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * + * @return array An array of Annotations. + */ + function getClassAnnotations(\ReflectionClass $class); + + /** + * Gets a class annotation. + * + * @param \ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * @param string $annotationName The name of the annotation. + * + * @return object|null The Annotation or NULL, if the requested annotation does not exist. + */ + function getClassAnnotation(\ReflectionClass $class, $annotationName); + + /** + * Gets the annotations applied to a method. + * + * @param \ReflectionMethod $method The ReflectionMethod of the method from which + * the annotations should be read. + * + * @return array An array of Annotations. + */ + function getMethodAnnotations(\ReflectionMethod $method); + + /** + * Gets a method annotation. + * + * @param \ReflectionMethod $method The ReflectionMethod to read the annotations from. + * @param string $annotationName The name of the annotation. + * + * @return object|null The Annotation or NULL, if the requested annotation does not exist. + */ + function getMethodAnnotation(\ReflectionMethod $method, $annotationName); + + /** + * Gets the annotations applied to a property. + * + * @param \ReflectionProperty $property The ReflectionProperty of the property + * from which the annotations should be read. + * + * @return array An array of Annotations. + */ + function getPropertyAnnotations(\ReflectionProperty $property); + + /** + * Gets a property annotation. + * + * @param \ReflectionProperty $property The ReflectionProperty to read the annotations from. + * @param string $annotationName The name of the annotation. + * + * @return object|null The Annotation or NULL, if the requested annotation does not exist. + */ + function getPropertyAnnotation(\ReflectionProperty $property, $annotationName); +} diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php new file mode 100644 index 0000000000..d4757eea2f --- /dev/null +++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php @@ -0,0 +1,127 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +/** + * Simple Annotation Reader. + * + * This annotation reader is intended to be used in projects where you have + * full-control over all annotations that are available. + * + * @since 2.2 + * @author Johannes M. Schmitt + * @author Fabio B. Silva + */ +class SimpleAnnotationReader implements Reader +{ + /** + * @var DocParser + */ + private $parser; + + /** + * Constructor. + * + * Initializes a new SimpleAnnotationReader. + */ + public function __construct() + { + $this->parser = new DocParser(); + $this->parser->setIgnoreNotImportedAnnotations(true); + } + + /** + * Adds a namespace in which we will look for annotations. + * + * @param string $namespace + * + * @return void + */ + public function addNamespace($namespace) + { + $this->parser->addNamespace($namespace); + } + + /** + * {@inheritDoc} + */ + public function getClassAnnotations(\ReflectionClass $class) + { + return $this->parser->parse($class->getDocComment(), 'class '.$class->getName()); + } + + /** + * {@inheritDoc} + */ + public function getMethodAnnotations(\ReflectionMethod $method) + { + return $this->parser->parse($method->getDocComment(), 'method '.$method->getDeclaringClass()->name.'::'.$method->getName().'()'); + } + + /** + * {@inheritDoc} + */ + public function getPropertyAnnotations(\ReflectionProperty $property) + { + return $this->parser->parse($property->getDocComment(), 'property '.$property->getDeclaringClass()->name.'::$'.$property->getName()); + } + + /** + * {@inheritDoc} + */ + public function getClassAnnotation(\ReflectionClass $class, $annotationName) + { + foreach ($this->getClassAnnotations($class) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + /** + * {@inheritDoc} + */ + public function getMethodAnnotation(\ReflectionMethod $method, $annotationName) + { + foreach ($this->getMethodAnnotations($method) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + /** + * {@inheritDoc} + */ + public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName) + { + foreach ($this->getPropertyAnnotations($property) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } +} diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/TokenParser.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/TokenParser.php new file mode 100644 index 0000000000..03d9320ab0 --- /dev/null +++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/TokenParser.php @@ -0,0 +1,194 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +/** + * Parses a file for namespaces/use/class declarations. + * + * @author Fabien Potencier + * @author Christian Kaps + */ +class TokenParser +{ + /** + * The token list. + * + * @var array + */ + private $tokens; + + /** + * The number of tokens. + * + * @var int + */ + private $numTokens; + + /** + * The current array pointer. + * + * @var int + */ + private $pointer = 0; + + /** + * @param string $contents + */ + public function __construct($contents) + { + $this->tokens = token_get_all($contents); + + // The PHP parser sets internal compiler globals for certain things. Annoyingly, the last docblock comment it + // saw gets stored in doc_comment. When it comes to compile the next thing to be include()d this stored + // doc_comment becomes owned by the first thing the compiler sees in the file that it considers might have a + // docblock. If the first thing in the file is a class without a doc block this would cause calls to + // getDocBlock() on said class to return our long lost doc_comment. Argh. + // To workaround, cause the parser to parse an empty docblock. Sure getDocBlock() will return this, but at least + // it's harmless to us. + token_get_all("numTokens = count($this->tokens); + } + + /** + * Gets the next non whitespace and non comment token. + * + * @param boolean $docCommentIsComment If TRUE then a doc comment is considered a comment and skipped. + * If FALSE then only whitespace and normal comments are skipped. + * + * @return array|null The token if exists, null otherwise. + */ + public function next($docCommentIsComment = TRUE) + { + for ($i = $this->pointer; $i < $this->numTokens; $i++) { + $this->pointer++; + if ($this->tokens[$i][0] === T_WHITESPACE || + $this->tokens[$i][0] === T_COMMENT || + ($docCommentIsComment && $this->tokens[$i][0] === T_DOC_COMMENT)) { + + continue; + } + + return $this->tokens[$i]; + } + + return null; + } + + /** + * Parses a single use statement. + * + * @return array A list with all found class names for a use statement. + */ + public function parseUseStatement() + { + + $groupRoot = ''; + $class = ''; + $alias = ''; + $statements = []; + $explicitAlias = false; + while (($token = $this->next())) { + $isNameToken = $token[0] === T_STRING || $token[0] === T_NS_SEPARATOR; + if (!$explicitAlias && $isNameToken) { + $class .= $token[1]; + $alias = $token[1]; + } else if ($explicitAlias && $isNameToken) { + $alias .= $token[1]; + } else if ($token[0] === T_AS) { + $explicitAlias = true; + $alias = ''; + } else if ($token === ',') { + $statements[strtolower($alias)] = $groupRoot . $class; + $class = ''; + $alias = ''; + $explicitAlias = false; + } else if ($token === ';') { + $statements[strtolower($alias)] = $groupRoot . $class; + break; + } else if ($token === '{' ) { + $groupRoot = $class; + $class = ''; + } else if ($token === '}' ) { + continue; + } else { + break; + } + } + + return $statements; + } + + /** + * Gets all use statements. + * + * @param string $namespaceName The namespace name of the reflected class. + * + * @return array A list with all found use statements. + */ + public function parseUseStatements($namespaceName) + { + $statements = []; + while (($token = $this->next())) { + if ($token[0] === T_USE) { + $statements = array_merge($statements, $this->parseUseStatement()); + continue; + } + if ($token[0] !== T_NAMESPACE || $this->parseNamespace() != $namespaceName) { + continue; + } + + // Get fresh array for new namespace. This is to prevent the parser to collect the use statements + // for a previous namespace with the same name. This is the case if a namespace is defined twice + // or if a namespace with the same name is commented out. + $statements = []; + } + + return $statements; + } + + /** + * Gets the namespace. + * + * @return string The found namespace. + */ + public function parseNamespace() + { + $name = ''; + while (($token = $this->next()) && ($token[0] === T_STRING || $token[0] === T_NS_SEPARATOR)) { + $name .= $token[1]; + } + + return $name; + } + + /** + * Gets the class name. + * + * @return string The found class name. + */ + public function parseClass() + { + // Namespaces and class names are tokenized the same: T_STRINGs + // separated by T_NS_SEPARATOR so we can use one function to provide + // both. + return $this->parseNamespace(); + } +} diff --git a/vendor/doctrine/annotations/phpbench.json.dist b/vendor/doctrine/annotations/phpbench.json.dist new file mode 100644 index 0000000000..35edde9500 --- /dev/null +++ b/vendor/doctrine/annotations/phpbench.json.dist @@ -0,0 +1,4 @@ +{ + "bootstrap": "tests/Doctrine/Performance/Common/bootstrap.php", + "path": "tests/Doctrine/Performance/Common/Annotations" +} diff --git a/vendor/doctrine/annotations/phpstan.neon b/vendor/doctrine/annotations/phpstan.neon new file mode 100644 index 0000000000..bac7f83c4d --- /dev/null +++ b/vendor/doctrine/annotations/phpstan.neon @@ -0,0 +1,14 @@ +parameters: + autoload_files: + - %currentWorkingDirectory%/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php + excludes_analyse: + - %currentWorkingDirectory%/tests/*/Fixtures/* + - %currentWorkingDirectory%/tests/Doctrine/Tests/Common/Annotations/ReservedKeywordsClasses.php + - %currentWorkingDirectory%/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php + - %currentWorkingDirectory%/tests/Doctrine/Tests/DoctrineTestCase.php + polluteScopeWithLoopInitialAssignments: true + ignoreErrors: + - '#Class Doctrine_Tests_Common_Annotations_Fixtures_ClassNoNamespaceNoComment not found#' + - '#Instantiated class Doctrine_Tests_Common_Annotations_Fixtures_ClassNoNamespaceNoComment not found#' + - '#Property Doctrine\\Tests\\Common\\Annotations\\DummyClassNonAnnotationProblem::\$foo has unknown class#' + - '#Call to an undefined method ReflectionClass::getUseStatements\(\)#' diff --git a/vendor/doctrine/cache/LICENSE b/vendor/doctrine/cache/LICENSE new file mode 100644 index 0000000000..8c38cc1bc2 --- /dev/null +++ b/vendor/doctrine/cache/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2006-2015 Doctrine Project + +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/doctrine/cache/README.md b/vendor/doctrine/cache/README.md new file mode 100644 index 0000000000..c795a05842 --- /dev/null +++ b/vendor/doctrine/cache/README.md @@ -0,0 +1,9 @@ +# Doctrine Cache + +[![Build Status](https://img.shields.io/travis/doctrine/cache/master.svg?style=flat-square)](http://travis-ci.org/doctrine/cache) +[![Code Coverage](https://codecov.io/gh/doctrine/dbal/branch/cache/graph/badge.svg)](https://codecov.io/gh/doctrine/dbal/branch/master) + +[![Latest Stable Version](https://img.shields.io/packagist/v/doctrine/cache.svg?style=flat-square)](https://packagist.org/packages/doctrine/cache) +[![Total Downloads](https://img.shields.io/packagist/dt/doctrine/cache.svg?style=flat-square)](https://packagist.org/packages/doctrine/cache) + +Cache component extracted from the Doctrine Common project. [Documentation](https://www.doctrine-project.org/projects/doctrine-cache/en/current/index.html) diff --git a/vendor/doctrine/cache/UPGRADE.md b/vendor/doctrine/cache/UPGRADE.md new file mode 100644 index 0000000000..e1f8a503ee --- /dev/null +++ b/vendor/doctrine/cache/UPGRADE.md @@ -0,0 +1,16 @@ +# Upgrade to 1.4 + +## Minor BC Break: `Doctrine\Common\Cache\FileCache#$extension` is now `private`. + +If you need to override the value of `Doctrine\Common\Cache\FileCache#$extension`, then use the +second parameter of `Doctrine\Common\Cache\FileCache#__construct()` instead of overriding +the property in your own implementation. + +## Minor BC Break: file based caches paths changed + +`Doctrine\Common\Cache\FileCache`, `Doctrine\Common\Cache\PhpFileCache` and +`Doctrine\Common\Cache\FilesystemCache` are using a different cache paths structure. + +If you rely on warmed up caches for deployments, consider that caches generated +with `doctrine/cache` `<1.4` are not compatible with the new directory structure, +and will be ignored. diff --git a/vendor/doctrine/cache/composer.json b/vendor/doctrine/cache/composer.json new file mode 100644 index 0000000000..b889aa37da --- /dev/null +++ b/vendor/doctrine/cache/composer.json @@ -0,0 +1,52 @@ +{ + "name": "doctrine/cache", + "type": "library", + "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", + "keywords": [ + "php", + "cache", + "caching", + "abstraction", + "redis", + "memcached", + "couchdb", + "xcache", + "apcu" + ], + "homepage": "https://www.doctrine-project.org/projects/cache.html", + "license": "MIT", + "authors": [ + {"name": "Guilherme Blanco", "email": "guilhermeblanco@gmail.com"}, + {"name": "Roman Borschel", "email": "roman@code-factory.org"}, + {"name": "Benjamin Eberlei", "email": "kontakt@beberlei.de"}, + {"name": "Jonathan Wage", "email": "jonwage@gmail.com"}, + {"name": "Johannes Schmitt", "email": "schmittjoh@gmail.com"} + ], + "require": { + "php": "~7.1 || ^8.0" + }, + "require-dev": { + "alcaeus/mongo-php-adapter": "^1.1", + "mongodb/mongodb": "^1.1", + "phpunit/phpunit": "^7.0", + "predis/predis": "~1.0", + "doctrine/coding-standard": "^6.0" + }, + "suggest": { + "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "autoload": { + "psr-4": { "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" } + }, + "autoload-dev": { + "psr-4": { "Doctrine\\Tests\\": "tests/Doctrine/Tests" } + }, + "extra": { + "branch-alias": { + "dev-master": "1.9.x-dev" + } + } +} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ApcCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ApcCache.php new file mode 100644 index 0000000000..138d49a535 --- /dev/null +++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ApcCache.php @@ -0,0 +1,105 @@ += 50500) { + $info['num_hits'] = $info['num_hits'] ?? $info['nhits']; + $info['num_misses'] = $info['num_misses'] ?? $info['nmisses']; + $info['start_time'] = $info['start_time'] ?? $info['stime']; + } + + return [ + Cache::STATS_HITS => $info['num_hits'], + Cache::STATS_MISSES => $info['num_misses'], + Cache::STATS_UPTIME => $info['start_time'], + Cache::STATS_MEMORY_USAGE => $info['mem_size'], + Cache::STATS_MEMORY_AVAILABLE => $sma['avail_mem'], + ]; + } +} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ApcuCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ApcuCache.php new file mode 100644 index 0000000000..a725213616 --- /dev/null +++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ApcuCache.php @@ -0,0 +1,106 @@ + $info['num_hits'], + Cache::STATS_MISSES => $info['num_misses'], + Cache::STATS_UPTIME => $info['start_time'], + Cache::STATS_MEMORY_USAGE => $info['mem_size'], + Cache::STATS_MEMORY_AVAILABLE => $sma['avail_mem'], + ]; + } +} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ArrayCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ArrayCache.php new file mode 100644 index 0000000000..1beb7098fc --- /dev/null +++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ArrayCache.php @@ -0,0 +1,113 @@ +upTime = time(); + } + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + if (! $this->doContains($id)) { + $this->missesCount += 1; + + return false; + } + + $this->hitsCount += 1; + + return $this->data[$id][0]; + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + if (! isset($this->data[$id])) { + return false; + } + + $expiration = $this->data[$id][1]; + + if ($expiration && $expiration < time()) { + $this->doDelete($id); + + return false; + } + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + $this->data[$id] = [$data, $lifeTime ? time() + $lifeTime : false]; + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + unset($this->data[$id]); + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + $this->data = []; + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + return [ + Cache::STATS_HITS => $this->hitsCount, + Cache::STATS_MISSES => $this->missesCount, + Cache::STATS_UPTIME => $this->upTime, + Cache::STATS_MEMORY_USAGE => null, + Cache::STATS_MEMORY_AVAILABLE => null, + ]; + } +} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/Cache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/Cache.php new file mode 100644 index 0000000000..4569744271 --- /dev/null +++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/Cache.php @@ -0,0 +1,90 @@ +hits + * Number of keys that have been requested and found present. + * + * - misses + * Number of items that have been requested and not found. + * + * - uptime + * Time that the server is running. + * + * - memory_usage + * Memory used by this server to store items. + * + * - memory_available + * Memory allowed to use for storage. + * + * @return array|null An associative array with server's statistics if available, NULL otherwise. + */ + public function getStats(); +} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/CacheProvider.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/CacheProvider.php new file mode 100644 index 0000000000..43d414f3c7 --- /dev/null +++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/CacheProvider.php @@ -0,0 +1,325 @@ +namespace = (string) $namespace; + $this->namespaceVersion = null; + } + + /** + * Retrieves the namespace that prefixes all cache ids. + * + * @return string + */ + public function getNamespace() + { + return $this->namespace; + } + + /** + * {@inheritdoc} + */ + public function fetch($id) + { + return $this->doFetch($this->getNamespacedId($id)); + } + + /** + * {@inheritdoc} + */ + public function fetchMultiple(array $keys) + { + if (empty($keys)) { + return []; + } + + // note: the array_combine() is in place to keep an association between our $keys and the $namespacedKeys + $namespacedKeys = array_combine($keys, array_map([$this, 'getNamespacedId'], $keys)); + $items = $this->doFetchMultiple($namespacedKeys); + $foundItems = []; + + // no internal array function supports this sort of mapping: needs to be iterative + // this filters and combines keys in one pass + foreach ($namespacedKeys as $requestedKey => $namespacedKey) { + if (! isset($items[$namespacedKey]) && ! array_key_exists($namespacedKey, $items)) { + continue; + } + + $foundItems[$requestedKey] = $items[$namespacedKey]; + } + + return $foundItems; + } + + /** + * {@inheritdoc} + */ + public function saveMultiple(array $keysAndValues, $lifetime = 0) + { + $namespacedKeysAndValues = []; + foreach ($keysAndValues as $key => $value) { + $namespacedKeysAndValues[$this->getNamespacedId($key)] = $value; + } + + return $this->doSaveMultiple($namespacedKeysAndValues, $lifetime); + } + + /** + * {@inheritdoc} + */ + public function contains($id) + { + return $this->doContains($this->getNamespacedId($id)); + } + + /** + * {@inheritdoc} + */ + public function save($id, $data, $lifeTime = 0) + { + return $this->doSave($this->getNamespacedId($id), $data, $lifeTime); + } + + /** + * {@inheritdoc} + */ + public function deleteMultiple(array $keys) + { + return $this->doDeleteMultiple(array_map([$this, 'getNamespacedId'], $keys)); + } + + /** + * {@inheritdoc} + */ + public function delete($id) + { + return $this->doDelete($this->getNamespacedId($id)); + } + + /** + * {@inheritdoc} + */ + public function getStats() + { + return $this->doGetStats(); + } + + /** + * {@inheritDoc} + */ + public function flushAll() + { + return $this->doFlush(); + } + + /** + * {@inheritDoc} + */ + public function deleteAll() + { + $namespaceCacheKey = $this->getNamespaceCacheKey(); + $namespaceVersion = $this->getNamespaceVersion() + 1; + + if ($this->doSave($namespaceCacheKey, $namespaceVersion)) { + $this->namespaceVersion = $namespaceVersion; + + return true; + } + + return false; + } + + /** + * Prefixes the passed id with the configured namespace value. + * + * @param string $id The id to namespace. + * + * @return string The namespaced id. + */ + private function getNamespacedId(string $id) : string + { + $namespaceVersion = $this->getNamespaceVersion(); + + return sprintf('%s[%s][%s]', $this->namespace, $id, $namespaceVersion); + } + + /** + * Returns the namespace cache key. + */ + private function getNamespaceCacheKey() : string + { + return sprintf(self::DOCTRINE_NAMESPACE_CACHEKEY, $this->namespace); + } + + /** + * Returns the namespace version. + */ + private function getNamespaceVersion() : int + { + if ($this->namespaceVersion !== null) { + return $this->namespaceVersion; + } + + $namespaceCacheKey = $this->getNamespaceCacheKey(); + $this->namespaceVersion = (int) $this->doFetch($namespaceCacheKey) ?: 1; + + return $this->namespaceVersion; + } + + /** + * Default implementation of doFetchMultiple. Each driver that supports multi-get should owerwrite it. + * + * @param array $keys Array of keys to retrieve from cache + * + * @return array Array of values retrieved for the given keys. + */ + protected function doFetchMultiple(array $keys) + { + $returnValues = []; + + foreach ($keys as $key) { + $item = $this->doFetch($key); + if ($item === false && ! $this->doContains($key)) { + continue; + } + + $returnValues[$key] = $item; + } + + return $returnValues; + } + + /** + * Fetches an entry from the cache. + * + * @param string $id The id of the cache entry to fetch. + * + * @return mixed|false The cached data or FALSE, if no cache entry exists for the given id. + */ + abstract protected function doFetch($id); + + /** + * Tests if an entry exists in the cache. + * + * @param string $id The cache id of the entry to check for. + * + * @return bool TRUE if a cache entry exists for the given cache id, FALSE otherwise. + */ + abstract protected function doContains($id); + + /** + * Default implementation of doSaveMultiple. Each driver that supports multi-put should override it. + * + * @param array $keysAndValues Array of keys and values to save in cache + * @param int $lifetime The lifetime. If != 0, sets a specific lifetime for these + * cache entries (0 => infinite lifeTime). + * + * @return bool TRUE if the operation was successful, FALSE if it wasn't. + */ + protected function doSaveMultiple(array $keysAndValues, $lifetime = 0) + { + $success = true; + + foreach ($keysAndValues as $key => $value) { + if ($this->doSave($key, $value, $lifetime)) { + continue; + } + + $success = false; + } + + return $success; + } + + /** + * Puts data into the cache. + * + * @param string $id The cache id. + * @param string $data The cache entry/data. + * @param int $lifeTime The lifetime. If != 0, sets a specific lifetime for this + * cache entry (0 => infinite lifeTime). + * + * @return bool TRUE if the entry was successfully stored in the cache, FALSE otherwise. + */ + abstract protected function doSave($id, $data, $lifeTime = 0); + + /** + * Default implementation of doDeleteMultiple. Each driver that supports multi-delete should override it. + * + * @param array $keys Array of keys to delete from cache + * + * @return bool TRUE if the operation was successful, FALSE if it wasn't + */ + protected function doDeleteMultiple(array $keys) + { + $success = true; + + foreach ($keys as $key) { + if ($this->doDelete($key)) { + continue; + } + + $success = false; + } + + return $success; + } + + /** + * Deletes a cache entry. + * + * @param string $id The cache id. + * + * @return bool TRUE if the cache entry was successfully deleted, FALSE otherwise. + */ + abstract protected function doDelete($id); + + /** + * Flushes all cache entries. + * + * @return bool TRUE if the cache entries were successfully flushed, FALSE otherwise. + */ + abstract protected function doFlush(); + + /** + * Retrieves cached information from the data store. + * + * @return array|null An associative array with server's statistics if available, NULL otherwise. + */ + abstract protected function doGetStats(); +} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ChainCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ChainCache.php new file mode 100644 index 0000000000..8f85845c70 --- /dev/null +++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ChainCache.php @@ -0,0 +1,195 @@ +cacheProviders = $cacheProviders instanceof Traversable + ? iterator_to_array($cacheProviders, false) + : array_values($cacheProviders); + } + + public function setDefaultLifeTimeForDownstreamCacheProviders(int $defaultLifeTimeForDownstreamCacheProviders) : void + { + $this->defaultLifeTimeForDownstreamCacheProviders = $defaultLifeTimeForDownstreamCacheProviders; + } + + /** + * {@inheritDoc} + */ + public function setNamespace($namespace) + { + parent::setNamespace($namespace); + + foreach ($this->cacheProviders as $cacheProvider) { + $cacheProvider->setNamespace($namespace); + } + } + + /** + * {@inheritDoc} + */ + protected function doFetch($id) + { + foreach ($this->cacheProviders as $key => $cacheProvider) { + if ($cacheProvider->doContains($id)) { + $value = $cacheProvider->doFetch($id); + + // We populate all the previous cache layers (that are assumed to be faster) + for ($subKey = $key - 1; $subKey >= 0; $subKey--) { + $this->cacheProviders[$subKey]->doSave($id, $value, $this->defaultLifeTimeForDownstreamCacheProviders); + } + + return $value; + } + } + + return false; + } + + /** + * {@inheritdoc} + */ + protected function doFetchMultiple(array $keys) + { + /** @var CacheProvider[] $traversedProviders */ + $traversedProviders = []; + $keysCount = count($keys); + $fetchedValues = []; + + foreach ($this->cacheProviders as $key => $cacheProvider) { + $fetchedValues = $cacheProvider->doFetchMultiple($keys); + + // We populate all the previous cache layers (that are assumed to be faster) + if (count($fetchedValues) === $keysCount) { + foreach ($traversedProviders as $previousCacheProvider) { + $previousCacheProvider->doSaveMultiple($fetchedValues, $this->defaultLifeTimeForDownstreamCacheProviders); + } + + return $fetchedValues; + } + + $traversedProviders[] = $cacheProvider; + } + + return $fetchedValues; + } + + /** + * {@inheritDoc} + */ + protected function doContains($id) + { + foreach ($this->cacheProviders as $cacheProvider) { + if ($cacheProvider->doContains($id)) { + return true; + } + } + + return false; + } + + /** + * {@inheritDoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + $stored = true; + + foreach ($this->cacheProviders as $cacheProvider) { + $stored = $cacheProvider->doSave($id, $data, $lifeTime) && $stored; + } + + return $stored; + } + + /** + * {@inheritdoc} + */ + protected function doSaveMultiple(array $keysAndValues, $lifetime = 0) + { + $stored = true; + + foreach ($this->cacheProviders as $cacheProvider) { + $stored = $cacheProvider->doSaveMultiple($keysAndValues, $lifetime) && $stored; + } + + return $stored; + } + + /** + * {@inheritDoc} + */ + protected function doDelete($id) + { + $deleted = true; + + foreach ($this->cacheProviders as $cacheProvider) { + $deleted = $cacheProvider->doDelete($id) && $deleted; + } + + return $deleted; + } + + /** + * {@inheritdoc} + */ + protected function doDeleteMultiple(array $keys) + { + $deleted = true; + + foreach ($this->cacheProviders as $cacheProvider) { + $deleted = $cacheProvider->doDeleteMultiple($keys) && $deleted; + } + + return $deleted; + } + + /** + * {@inheritDoc} + */ + protected function doFlush() + { + $flushed = true; + + foreach ($this->cacheProviders as $cacheProvider) { + $flushed = $cacheProvider->doFlush() && $flushed; + } + + return $flushed; + } + + /** + * {@inheritDoc} + */ + protected function doGetStats() + { + // We return all the stats from all adapters + $stats = []; + + foreach ($this->cacheProviders as $cacheProvider) { + $stats[] = $cacheProvider->doGetStats(); + } + + return $stats; + } +} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ClearableCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ClearableCache.php new file mode 100644 index 0000000000..b94618e461 --- /dev/null +++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ClearableCache.php @@ -0,0 +1,21 @@ +bucket = $bucket; + } + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + $id = $this->normalizeKey($id); + + try { + $document = $this->bucket->get($id); + } catch (Exception $e) { + return false; + } + + if ($document instanceof Document && $document->value !== false) { + return unserialize($document->value); + } + + return false; + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + $id = $this->normalizeKey($id); + + try { + $document = $this->bucket->get($id); + } catch (Exception $e) { + return false; + } + + if ($document instanceof Document) { + return ! $document->error; + } + + return false; + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + $id = $this->normalizeKey($id); + + $lifeTime = $this->normalizeExpiry($lifeTime); + + try { + $encoded = serialize($data); + + $document = $this->bucket->upsert($id, $encoded, [ + 'expiry' => (int) $lifeTime, + ]); + } catch (Exception $e) { + return false; + } + + if ($document instanceof Document) { + return ! $document->error; + } + + return false; + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + $id = $this->normalizeKey($id); + + try { + $document = $this->bucket->remove($id); + } catch (Exception $e) { + return $e->getCode() === self::KEY_NOT_FOUND; + } + + if ($document instanceof Document) { + return ! $document->error; + } + + return false; + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + $manager = $this->bucket->manager(); + + // Flush does not return with success or failure, and must be enabled per bucket on the server. + // Store a marker item so that we will know if it was successful. + $this->doSave(__METHOD__, true, 60); + + $manager->flush(); + + if ($this->doContains(__METHOD__)) { + $this->doDelete(__METHOD__); + + return false; + } + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $manager = $this->bucket->manager(); + $stats = $manager->info(); + $nodes = $stats['nodes']; + $node = $nodes[0]; + $interestingStats = $node['interestingStats']; + + return [ + Cache::STATS_HITS => $interestingStats['get_hits'], + Cache::STATS_MISSES => $interestingStats['cmd_get'] - $interestingStats['get_hits'], + Cache::STATS_UPTIME => $node['uptime'], + Cache::STATS_MEMORY_USAGE => $interestingStats['mem_used'], + Cache::STATS_MEMORY_AVAILABLE => $node['memoryFree'], + ]; + } + + private function normalizeKey(string $id) : string + { + $normalized = substr($id, 0, self::MAX_KEY_LENGTH); + + if ($normalized === false) { + return $id; + } + + return $normalized; + } + + /** + * Expiry treated as a unix timestamp instead of an offset if expiry is greater than 30 days. + * + * @src https://developer.couchbase.com/documentation/server/4.1/developer-guide/expiry.html + */ + private function normalizeExpiry(int $expiry) : int + { + if ($expiry > self::THIRTY_DAYS_IN_SECONDS) { + return time() + $expiry; + } + + return $expiry; + } +} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/CouchbaseCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/CouchbaseCache.php new file mode 100644 index 0000000000..2c62c2ea8b --- /dev/null +++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/CouchbaseCache.php @@ -0,0 +1,105 @@ +couchbase = $couchbase; + } + + /** + * Gets the Couchbase instance used by the cache. + * + * @return Couchbase|null + */ + public function getCouchbase() + { + return $this->couchbase; + } + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return $this->couchbase->get($id) ?: false; + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return $this->couchbase->get($id) !== null; + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + if ($lifeTime > 30 * 24 * 3600) { + $lifeTime = time() + $lifeTime; + } + + return $this->couchbase->set($id, $data, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return $this->couchbase->delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return $this->couchbase->flush(); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $stats = $this->couchbase->getStats(); + $servers = $this->couchbase->getServers(); + $server = explode(':', $servers[0]); + $key = $server[0] . ':11210'; + $stats = $stats[$key]; + + return [ + Cache::STATS_HITS => $stats['get_hits'], + Cache::STATS_MISSES => $stats['get_misses'], + Cache::STATS_UPTIME => $stats['uptime'], + Cache::STATS_MEMORY_USAGE => $stats['bytes'], + Cache::STATS_MEMORY_AVAILABLE => $stats['limit_maxbytes'], + ]; + } +} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ExtMongoDBCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ExtMongoDBCache.php new file mode 100644 index 0000000000..b06f862328 --- /dev/null +++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ExtMongoDBCache.php @@ -0,0 +1,198 @@ +collection = $collection->withOptions(['typeMap' => null]); + $this->database = new Database($collection->getManager(), $collection->getDatabaseName()); + } + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + $document = $this->collection->findOne(['_id' => $id], [MongoDBCache::DATA_FIELD, MongoDBCache::EXPIRATION_FIELD]); + + if ($document === null) { + return false; + } + + if ($this->isExpired($document)) { + $this->createExpirationIndex(); + $this->doDelete($id); + + return false; + } + + return unserialize($document[MongoDBCache::DATA_FIELD]->getData()); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + $document = $this->collection->findOne(['_id' => $id], [MongoDBCache::EXPIRATION_FIELD]); + + if ($document === null) { + return false; + } + + if ($this->isExpired($document)) { + $this->createExpirationIndex(); + $this->doDelete($id); + + return false; + } + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + try { + $this->collection->updateOne( + ['_id' => $id], + [ + '$set' => [ + MongoDBCache::EXPIRATION_FIELD => ($lifeTime > 0 ? new UTCDateTime((time() + $lifeTime) * 1000): null), + MongoDBCache::DATA_FIELD => new Binary(serialize($data), Binary::TYPE_GENERIC), + ], + ], + ['upsert' => true] + ); + } catch (Exception $e) { + return false; + } + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + try { + $this->collection->deleteOne(['_id' => $id]); + } catch (Exception $e) { + return false; + } + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + try { + // Use remove() in lieu of drop() to maintain any collection indexes + $this->collection->deleteMany([]); + } catch (Exception $e) { + return false; + } + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $uptime = null; + $memoryUsage = null; + + try { + $serverStatus = $this->database->command([ + 'serverStatus' => 1, + 'locks' => 0, + 'metrics' => 0, + 'recordStats' => 0, + 'repl' => 0, + ])->toArray()[0]; + $uptime = $serverStatus['uptime'] ?? null; + } catch (Exception $e) { + } + + try { + $collStats = $this->database->command(['collStats' => $this->collection->getCollectionName()])->toArray()[0]; + $memoryUsage = $collStats['size'] ?? null; + } catch (Exception $e) { + } + + return [ + Cache::STATS_HITS => null, + Cache::STATS_MISSES => null, + Cache::STATS_UPTIME => $uptime, + Cache::STATS_MEMORY_USAGE => $memoryUsage, + Cache::STATS_MEMORY_AVAILABLE => null, + ]; + } + + /** + * Check if the document is expired. + */ + private function isExpired(BSONDocument $document) : bool + { + return isset($document[MongoDBCache::EXPIRATION_FIELD]) && + $document[MongoDBCache::EXPIRATION_FIELD] instanceof UTCDateTime && + $document[MongoDBCache::EXPIRATION_FIELD]->toDateTime() < new DateTime(); + } + + private function createExpirationIndex() : void + { + if ($this->expirationIndexCreated) { + return; + } + + $this->collection->createIndex([MongoDBCache::EXPIRATION_FIELD => 1], ['background' => true, 'expireAfterSeconds' => 0]); + } +} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FileCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FileCache.php new file mode 100644 index 0000000000..4b485205c5 --- /dev/null +++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FileCache.php @@ -0,0 +1,281 @@ +umask = $umask; + + if (! $this->createPathIfNeeded($directory)) { + throw new InvalidArgumentException(sprintf( + 'The directory "%s" does not exist and could not be created.', + $directory + )); + } + + if (! is_writable($directory)) { + throw new InvalidArgumentException(sprintf( + 'The directory "%s" is not writable.', + $directory + )); + } + + // YES, this needs to be *after* createPathIfNeeded() + $this->directory = realpath($directory); + $this->extension = (string) $extension; + + $this->directoryStringLength = strlen($this->directory); + $this->extensionStringLength = strlen($this->extension); + $this->isRunningOnWindows = defined('PHP_WINDOWS_VERSION_BUILD'); + } + + /** + * Gets the cache directory. + * + * @return string + */ + public function getDirectory() + { + return $this->directory; + } + + /** + * Gets the cache file extension. + * + * @return string + */ + public function getExtension() + { + return $this->extension; + } + + /** + * @param string $id + * + * @return string + */ + protected function getFilename($id) + { + $hash = hash('sha256', $id); + + // This ensures that the filename is unique and that there are no invalid chars in it. + if ($id === '' + || ((strlen($id) * 2 + $this->extensionStringLength) > 255) + || ($this->isRunningOnWindows && ($this->directoryStringLength + 4 + strlen($id) * 2 + $this->extensionStringLength) > 258) + ) { + // Most filesystems have a limit of 255 chars for each path component. On Windows the the whole path is limited + // to 260 chars (including terminating null char). Using long UNC ("\\?\" prefix) does not work with the PHP API. + // And there is a bug in PHP (https://bugs.php.net/bug.php?id=70943) with path lengths of 259. + // So if the id in hex representation would surpass the limit, we use the hash instead. The prefix prevents + // collisions between the hash and bin2hex. + $filename = '_' . $hash; + } else { + $filename = bin2hex($id); + } + + return $this->directory + . DIRECTORY_SEPARATOR + . substr($hash, 0, 2) + . DIRECTORY_SEPARATOR + . $filename + . $this->extension; + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + $filename = $this->getFilename($id); + + return @unlink($filename) || ! file_exists($filename); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + foreach ($this->getIterator() as $name => $file) { + if ($file->isDir()) { + // Remove the intermediate directories which have been created to balance the tree. It only takes effect + // if the directory is empty. If several caches share the same directory but with different file extensions, + // the other ones are not removed. + @rmdir($name); + } elseif ($this->isFilenameEndingWithExtension($name)) { + // If an extension is set, only remove files which end with the given extension. + // If no extension is set, we have no other choice than removing everything. + @unlink($name); + } + } + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $usage = 0; + foreach ($this->getIterator() as $name => $file) { + if ($file->isDir() || ! $this->isFilenameEndingWithExtension($name)) { + continue; + } + + $usage += $file->getSize(); + } + + $free = disk_free_space($this->directory); + + return [ + Cache::STATS_HITS => null, + Cache::STATS_MISSES => null, + Cache::STATS_UPTIME => null, + Cache::STATS_MEMORY_USAGE => $usage, + Cache::STATS_MEMORY_AVAILABLE => $free, + ]; + } + + /** + * Create path if needed. + * + * @return bool TRUE on success or if path already exists, FALSE if path cannot be created. + */ + private function createPathIfNeeded(string $path) : bool + { + if (! is_dir($path)) { + if (@mkdir($path, 0777 & (~$this->umask), true) === false && ! is_dir($path)) { + return false; + } + } + + return true; + } + + /** + * Writes a string content to file in an atomic way. + * + * @param string $filename Path to the file where to write the data. + * @param string $content The content to write + * + * @return bool TRUE on success, FALSE if path cannot be created, if path is not writable or an any other error. + */ + protected function writeFile(string $filename, string $content) : bool + { + $filepath = pathinfo($filename, PATHINFO_DIRNAME); + + if (! $this->createPathIfNeeded($filepath)) { + return false; + } + + if (! is_writable($filepath)) { + return false; + } + + $tmpFile = tempnam($filepath, 'swap'); + @chmod($tmpFile, 0666 & (~$this->umask)); + + if (file_put_contents($tmpFile, $content) !== false) { + @chmod($tmpFile, 0666 & (~$this->umask)); + if (@rename($tmpFile, $filename)) { + return true; + } + + @unlink($tmpFile); + } + + return false; + } + + private function getIterator() : Iterator + { + return new RecursiveIteratorIterator( + new RecursiveDirectoryIterator($this->directory, FilesystemIterator::SKIP_DOTS), + RecursiveIteratorIterator::CHILD_FIRST + ); + } + + /** + * @param string $name The filename + */ + private function isFilenameEndingWithExtension(string $name) : bool + { + return $this->extension === '' + || strrpos($name, $this->extension) === (strlen($name) - $this->extensionStringLength); + } +} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FilesystemCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FilesystemCache.php new file mode 100644 index 0000000000..8f34c9cb4c --- /dev/null +++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FilesystemCache.php @@ -0,0 +1,102 @@ +getFilename($id); + + if (! is_file($filename)) { + return false; + } + + $resource = fopen($filename, 'r'); + $line = fgets($resource); + + if ($line !== false) { + $lifetime = (int) $line; + } + + if ($lifetime !== 0 && $lifetime < time()) { + fclose($resource); + + return false; + } + + while (($line = fgets($resource)) !== false) { + $data .= $line; + } + + fclose($resource); + + return unserialize($data); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + $lifetime = -1; + $filename = $this->getFilename($id); + + if (! is_file($filename)) { + return false; + } + + $resource = fopen($filename, 'r'); + $line = fgets($resource); + + if ($line !== false) { + $lifetime = (int) $line; + } + + fclose($resource); + + return $lifetime === 0 || $lifetime > time(); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + if ($lifeTime > 0) { + $lifeTime = time() + $lifeTime; + } + + $data = serialize($data); + $filename = $this->getFilename($id); + + return $this->writeFile($filename, $lifeTime . PHP_EOL . $data); + } +} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FlushableCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FlushableCache.php new file mode 100644 index 0000000000..ee7ce984e6 --- /dev/null +++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FlushableCache.php @@ -0,0 +1,18 @@ +collection = $collection; + } + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + $document = $this->collection->findOne(['_id' => $id], [MongoDBCache::DATA_FIELD, MongoDBCache::EXPIRATION_FIELD]); + + if ($document === null) { + return false; + } + + if ($this->isExpired($document)) { + $this->createExpirationIndex(); + $this->doDelete($id); + + return false; + } + + return unserialize($document[MongoDBCache::DATA_FIELD]->bin); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + $document = $this->collection->findOne(['_id' => $id], [MongoDBCache::EXPIRATION_FIELD]); + + if ($document === null) { + return false; + } + + if ($this->isExpired($document)) { + $this->createExpirationIndex(); + $this->doDelete($id); + + return false; + } + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + try { + $result = $this->collection->update( + ['_id' => $id], + [ + '$set' => [ + MongoDBCache::EXPIRATION_FIELD => ($lifeTime > 0 ? new MongoDate(time() + $lifeTime) : null), + MongoDBCache::DATA_FIELD => new MongoBinData(serialize($data), MongoBinData::BYTE_ARRAY), + ], + ], + ['upsert' => true, 'multiple' => false] + ); + } catch (MongoCursorException $e) { + return false; + } + + return ($result['ok'] ?? 1) == 1; + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + $result = $this->collection->remove(['_id' => $id]); + + return ($result['ok'] ?? 1) == 1; + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + // Use remove() in lieu of drop() to maintain any collection indexes + $result = $this->collection->remove(); + + return ($result['ok'] ?? 1) == 1; + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $serverStatus = $this->collection->db->command([ + 'serverStatus' => 1, + 'locks' => 0, + 'metrics' => 0, + 'recordStats' => 0, + 'repl' => 0, + ]); + + $collStats = $this->collection->db->command(['collStats' => 1]); + + return [ + Cache::STATS_HITS => null, + Cache::STATS_MISSES => null, + Cache::STATS_UPTIME => $serverStatus['uptime'] ?? null, + Cache::STATS_MEMORY_USAGE => $collStats['size'] ?? null, + Cache::STATS_MEMORY_AVAILABLE => null, + ]; + } + + /** + * Check if the document is expired. + * + * @param array $document + */ + private function isExpired(array $document) : bool + { + return isset($document[MongoDBCache::EXPIRATION_FIELD]) && + $document[MongoDBCache::EXPIRATION_FIELD] instanceof MongoDate && + $document[MongoDBCache::EXPIRATION_FIELD]->sec < time(); + } + + private function createExpirationIndex() : void + { + if ($this->expirationIndexCreated) { + return; + } + + $this->expirationIndexCreated = true; + $this->collection->createIndex([MongoDBCache::EXPIRATION_FIELD => 1], ['background' => true, 'expireAfterSeconds' => 0]); + } +} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MemcacheCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MemcacheCache.php new file mode 100644 index 0000000000..42bbd2cea9 --- /dev/null +++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MemcacheCache.php @@ -0,0 +1,104 @@ +memcache = $memcache; + } + + /** + * Gets the memcache instance used by the cache. + * + * @return Memcache|null + */ + public function getMemcache() + { + return $this->memcache; + } + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return $this->memcache->get($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + $flags = null; + $this->memcache->get($id, $flags); + + //if memcache has changed the value of "flags", it means the value exists + return $flags !== null; + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + if ($lifeTime > 30 * 24 * 3600) { + $lifeTime = time() + $lifeTime; + } + + return $this->memcache->set($id, $data, 0, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + // Memcache::delete() returns false if entry does not exist + return $this->memcache->delete($id) || ! $this->doContains($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return $this->memcache->flush(); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $stats = $this->memcache->getStats(); + + return [ + Cache::STATS_HITS => $stats['get_hits'], + Cache::STATS_MISSES => $stats['get_misses'], + Cache::STATS_UPTIME => $stats['uptime'], + Cache::STATS_MEMORY_USAGE => $stats['bytes'], + Cache::STATS_MEMORY_AVAILABLE => $stats['limit_maxbytes'], + ]; + } +} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MemcachedCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MemcachedCache.php new file mode 100644 index 0000000000..da966ae265 --- /dev/null +++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MemcachedCache.php @@ -0,0 +1,170 @@ +memcached = $memcached; + } + + /** + * Gets the memcached instance used by the cache. + * + * @return Memcached|null + */ + public function getMemcached() + { + return $this->memcached; + } + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return $this->memcached->get($id); + } + + /** + * {@inheritdoc} + */ + protected function doFetchMultiple(array $keys) + { + return $this->memcached->getMulti($keys) ?: []; + } + + /** + * {@inheritdoc} + */ + protected function doSaveMultiple(array $keysAndValues, $lifetime = 0) + { + foreach (array_keys($keysAndValues) as $id) { + $this->validateCacheId($id); + } + + if ($lifetime > 30 * 24 * 3600) { + $lifetime = time() + $lifetime; + } + + return $this->memcached->setMulti($keysAndValues, $lifetime); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + $this->memcached->get($id); + + return $this->memcached->getResultCode() === Memcached::RES_SUCCESS; + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + $this->validateCacheId($id); + + if ($lifeTime > 30 * 24 * 3600) { + $lifeTime = time() + $lifeTime; + } + + return $this->memcached->set($id, $data, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDeleteMultiple(array $keys) + { + return $this->memcached->deleteMulti($keys) + || $this->memcached->getResultCode() === Memcached::RES_NOTFOUND; + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return $this->memcached->delete($id) + || $this->memcached->getResultCode() === Memcached::RES_NOTFOUND; + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return $this->memcached->flush(); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $stats = $this->memcached->getStats(); + $servers = $this->memcached->getServerList(); + $key = $servers[0]['host'] . ':' . $servers[0]['port']; + $stats = $stats[$key]; + + return [ + Cache::STATS_HITS => $stats['get_hits'], + Cache::STATS_MISSES => $stats['get_misses'], + Cache::STATS_UPTIME => $stats['uptime'], + Cache::STATS_MEMORY_USAGE => $stats['bytes'], + Cache::STATS_MEMORY_AVAILABLE => $stats['limit_maxbytes'], + ]; + } + + /** + * Validate the cache id + * + * @see https://github.com/memcached/memcached/blob/1.5.12/doc/protocol.txt#L41-L49 + * + * @param string $id + * + * @return void + * + * @throws InvalidCacheId + */ + private function validateCacheId($id) + { + if (strlen($id) > self::CACHE_ID_MAX_LENGTH) { + throw InvalidCacheId::exceedsMaxLength($id, self::CACHE_ID_MAX_LENGTH); + } + + if (strpos($id, ' ') !== false) { + throw InvalidCacheId::containsUnauthorizedCharacter($id, ' '); + } + + if (preg_match('/[\t\r\n]/', $id) === 1) { + throw InvalidCacheId::containsControlCharacter($id); + } + } +} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MongoDBCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MongoDBCache.php new file mode 100644 index 0000000000..861e4dda35 --- /dev/null +++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MongoDBCache.php @@ -0,0 +1,112 @@ +provider = new LegacyMongoDBCache($collection); + } elseif ($collection instanceof Collection) { + $this->provider = new ExtMongoDBCache($collection); + } else { + throw new InvalidArgumentException('Invalid collection given - expected a MongoCollection or MongoDB\Collection instance'); + } + } + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return $this->provider->doFetch($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return $this->provider->doContains($id); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return $this->provider->doSave($id, $data, $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return $this->provider->doDelete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return $this->provider->doFlush(); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + return $this->provider->doGetStats(); + } +} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MultiDeleteCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MultiDeleteCache.php new file mode 100644 index 0000000000..d099d47b80 --- /dev/null +++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MultiDeleteCache.php @@ -0,0 +1,22 @@ + infinite lifeTime). + * + * @return bool TRUE if the operation was successful, FALSE if it wasn't. + */ + public function saveMultiple(array $keysAndValues, $lifetime = 0); +} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/PhpFileCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/PhpFileCache.php new file mode 100644 index 0000000000..c0619991ce --- /dev/null +++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/PhpFileCache.php @@ -0,0 +1,118 @@ +includeFileForId($id); + + if ($value === null) { + return false; + } + + if ($value['lifetime'] !== 0 && $value['lifetime'] < time()) { + return false; + } + + return $value['data']; + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + $value = $this->includeFileForId($id); + + if ($value === null) { + return false; + } + + return $value['lifetime'] === 0 || $value['lifetime'] > time(); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + if ($lifeTime > 0) { + $lifeTime = time() + $lifeTime; + } + + $filename = $this->getFilename($id); + + $value = [ + 'lifetime' => $lifeTime, + 'data' => $data, + ]; + + if (is_object($data) && method_exists($data, '__set_state')) { + $value = var_export($value, true); + $code = sprintf('writeFile($filename, $code); + } + + /** + * @return array|null + */ + private function includeFileForId(string $id) : ?array + { + $fileName = $this->getFilename($id); + + // note: error suppression is still faster than `file_exists`, `is_file` and `is_readable` + set_error_handler(self::$emptyErrorHandler); + + $value = include $fileName; + + restore_error_handler(); + + if (! isset($value['lifetime'])) { + return null; + } + + return $value; + } +} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/PredisCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/PredisCache.php new file mode 100644 index 0000000000..6430d52d7f --- /dev/null +++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/PredisCache.php @@ -0,0 +1,143 @@ +client = $client; + } + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + $result = $this->client->get($id); + if ($result === null) { + return false; + } + + return unserialize($result); + } + + /** + * {@inheritdoc} + */ + protected function doFetchMultiple(array $keys) + { + $fetchedItems = call_user_func_array([$this->client, 'mget'], $keys); + + return array_map('unserialize', array_filter(array_combine($keys, $fetchedItems))); + } + + /** + * {@inheritdoc} + */ + protected function doSaveMultiple(array $keysAndValues, $lifetime = 0) + { + if ($lifetime) { + $success = true; + + // Keys have lifetime, use SETEX for each of them + foreach ($keysAndValues as $key => $value) { + $response = (string) $this->client->setex($key, $lifetime, serialize($value)); + + if ($response == 'OK') { + continue; + } + + $success = false; + } + + return $success; + } + + // No lifetime, use MSET + $response = $this->client->mset(array_map(static function ($value) { + return serialize($value); + }, $keysAndValues)); + + return (string) $response == 'OK'; + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return (bool) $this->client->exists($id); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + $data = serialize($data); + if ($lifeTime > 0) { + $response = $this->client->setex($id, $lifeTime, $data); + } else { + $response = $this->client->set($id, $data); + } + + return $response === true || $response == 'OK'; + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return $this->client->del($id) >= 0; + } + + /** + * {@inheritdoc} + */ + protected function doDeleteMultiple(array $keys) + { + return $this->client->del($keys) >= 0; + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + $response = $this->client->flushdb(); + + return $response === true || $response == 'OK'; + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $info = $this->client->info(); + + return [ + Cache::STATS_HITS => $info['Stats']['keyspace_hits'], + Cache::STATS_MISSES => $info['Stats']['keyspace_misses'], + Cache::STATS_UPTIME => $info['Server']['uptime_in_seconds'], + Cache::STATS_MEMORY_USAGE => $info['Memory']['used_memory'], + Cache::STATS_MEMORY_AVAILABLE => false, + ]; + } +} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/RedisCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/RedisCache.php new file mode 100644 index 0000000000..3245705834 --- /dev/null +++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/RedisCache.php @@ -0,0 +1,181 @@ +setOption(Redis::OPT_SERIALIZER, $this->getSerializerValue()); + $this->redis = $redis; + } + + /** + * Gets the redis instance used by the cache. + * + * @return Redis|null + */ + public function getRedis() + { + return $this->redis; + } + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return $this->redis->get($id); + } + + /** + * {@inheritdoc} + */ + protected function doFetchMultiple(array $keys) + { + $fetchedItems = array_combine($keys, $this->redis->mget($keys)); + + // Redis mget returns false for keys that do not exist. So we need to filter those out unless it's the real data. + $keysToFilter = array_keys(array_filter($fetchedItems, static function ($item) : bool { + return $item === false; + })); + + if ($keysToFilter) { + $multi = $this->redis->multi(Redis::PIPELINE); + foreach ($keysToFilter as $key) { + $multi->exists($key); + } + $existItems = array_filter($multi->exec()); + $missedItemKeys = array_diff_key($keysToFilter, $existItems); + $fetchedItems = array_diff_key($fetchedItems, array_fill_keys($missedItemKeys, true)); + } + + return $fetchedItems; + } + + /** + * {@inheritdoc} + */ + protected function doSaveMultiple(array $keysAndValues, $lifetime = 0) + { + if ($lifetime) { + // Keys have lifetime, use SETEX for each of them + $multi = $this->redis->multi(Redis::PIPELINE); + foreach ($keysAndValues as $key => $value) { + $multi->setex($key, $lifetime, $value); + } + $succeeded = array_filter($multi->exec()); + + return count($succeeded) == count($keysAndValues); + } + + // No lifetime, use MSET + return (bool) $this->redis->mset($keysAndValues); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + $exists = $this->redis->exists($id); + + if (is_bool($exists)) { + return $exists; + } + + return $exists > 0; + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + if ($lifeTime > 0) { + return $this->redis->setex($id, $lifeTime, $data); + } + + return $this->redis->set($id, $data); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return $this->redis->del($id) >= 0; + } + + /** + * {@inheritdoc} + */ + protected function doDeleteMultiple(array $keys) + { + return $this->redis->del($keys) >= 0; + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return $this->redis->flushDB(); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $info = $this->redis->info(); + + return [ + Cache::STATS_HITS => $info['keyspace_hits'], + Cache::STATS_MISSES => $info['keyspace_misses'], + Cache::STATS_UPTIME => $info['uptime_in_seconds'], + Cache::STATS_MEMORY_USAGE => $info['used_memory'], + Cache::STATS_MEMORY_AVAILABLE => false, + ]; + } + + /** + * Returns the serializer constant to use. If Redis is compiled with + * igbinary support, that is used. Otherwise the default PHP serializer is + * used. + * + * @return int One of the Redis::SERIALIZER_* constants + */ + protected function getSerializerValue() + { + if (defined('Redis::SERIALIZER_IGBINARY') && extension_loaded('igbinary')) { + return Redis::SERIALIZER_IGBINARY; + } + + return Redis::SERIALIZER_PHP; + } +} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/SQLite3Cache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/SQLite3Cache.php new file mode 100644 index 0000000000..56deb07740 --- /dev/null +++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/SQLite3Cache.php @@ -0,0 +1,206 @@ +sqlite = $sqlite; + $this->table = (string) $table; + + $this->ensureTableExists(); + } + + private function ensureTableExists() : void + { + $this->sqlite->exec( + sprintf( + 'CREATE TABLE IF NOT EXISTS %s(%s TEXT PRIMARY KEY NOT NULL, %s BLOB, %s INTEGER)', + $this->table, + static::ID_FIELD, + static::DATA_FIELD, + static::EXPIRATION_FIELD + ) + ); + } + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + $item = $this->findById($id); + + if (! $item) { + return false; + } + + return unserialize($item[self::DATA_FIELD]); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return $this->findById($id, false) !== null; + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + $statement = $this->sqlite->prepare(sprintf( + 'INSERT OR REPLACE INTO %s (%s) VALUES (:id, :data, :expire)', + $this->table, + implode(',', $this->getFields()) + )); + + $statement->bindValue(':id', $id); + $statement->bindValue(':data', serialize($data), SQLITE3_BLOB); + $statement->bindValue(':expire', $lifeTime > 0 ? time() + $lifeTime : null); + + return $statement->execute() instanceof SQLite3Result; + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + [$idField] = $this->getFields(); + + $statement = $this->sqlite->prepare(sprintf( + 'DELETE FROM %s WHERE %s = :id', + $this->table, + $idField + )); + + $statement->bindValue(':id', $id); + + return $statement->execute() instanceof SQLite3Result; + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return $this->sqlite->exec(sprintf('DELETE FROM %s', $this->table)); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + // no-op. + } + + /** + * Find a single row by ID. + * + * @param mixed $id + * + * @return array|null + */ + private function findById($id, bool $includeData = true) : ?array + { + [$idField] = $fields = $this->getFields(); + + if (! $includeData) { + $key = array_search(static::DATA_FIELD, $fields); + unset($fields[$key]); + } + + $statement = $this->sqlite->prepare(sprintf( + 'SELECT %s FROM %s WHERE %s = :id LIMIT 1', + implode(',', $fields), + $this->table, + $idField + )); + + $statement->bindValue(':id', $id, SQLITE3_TEXT); + + $item = $statement->execute()->fetchArray(SQLITE3_ASSOC); + + if ($item === false) { + return null; + } + + if ($this->isExpired($item)) { + $this->doDelete($id); + + return null; + } + + return $item; + } + + /** + * Gets an array of the fields in our table. + * + * @return array + */ + private function getFields() : array + { + return [static::ID_FIELD, static::DATA_FIELD, static::EXPIRATION_FIELD]; + } + + /** + * Check if the item is expired. + * + * @param array $item + */ + private function isExpired(array $item) : bool + { + return isset($item[static::EXPIRATION_FIELD]) && + $item[self::EXPIRATION_FIELD] !== null && + $item[self::EXPIRATION_FIELD] < time(); + } +} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/Version.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/Version.php new file mode 100644 index 0000000000..834b5b7d4b --- /dev/null +++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/Version.php @@ -0,0 +1,8 @@ + $info['total_hit_count'], + Cache::STATS_MISSES => $info['total_miss_count'], + Cache::STATS_UPTIME => $info['total_cache_uptime'], + Cache::STATS_MEMORY_USAGE => $meminfo['memory_total'], + Cache::STATS_MEMORY_AVAILABLE => $meminfo['memory_free'], + ]; + } +} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/XcacheCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/XcacheCache.php new file mode 100644 index 0000000000..9b3a485ed2 --- /dev/null +++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/XcacheCache.php @@ -0,0 +1,104 @@ +doContains($id) ? unserialize(xcache_get($id)) : false; + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return xcache_isset($id); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return xcache_set($id, serialize($data), (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return xcache_unset($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + $this->checkAuthorization(); + + xcache_clear_cache(XC_TYPE_VAR); + + return true; + } + + /** + * Checks that xcache.admin.enable_auth is Off. + * + * @return void + * + * @throws BadMethodCallException When xcache.admin.enable_auth is On. + */ + protected function checkAuthorization() + { + if (ini_get('xcache.admin.enable_auth')) { + throw new BadMethodCallException( + 'To use all features of \Doctrine\Common\Cache\XcacheCache, ' + . 'you must set "xcache.admin.enable_auth" to "Off" in your php.ini.' + ); + } + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $this->checkAuthorization(); + + $info = xcache_info(XC_TYPE_VAR, 0); + + return [ + Cache::STATS_HITS => $info['hits'], + Cache::STATS_MISSES => $info['misses'], + Cache::STATS_UPTIME => null, + Cache::STATS_MEMORY_USAGE => $info['size'], + Cache::STATS_MEMORY_AVAILABLE => $info['avail'], + ]; + } +} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ZendDataCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ZendDataCache.php new file mode 100644 index 0000000000..a6b67ef8bf --- /dev/null +++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ZendDataCache.php @@ -0,0 +1,69 @@ +getNamespace(); + if (empty($namespace)) { + return zend_shm_cache_clear(); + } + + return zend_shm_cache_clear($namespace); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + return null; + } +} diff --git a/vendor/doctrine/instantiator/.doctrine-project.json b/vendor/doctrine/instantiator/.doctrine-project.json new file mode 100644 index 0000000000..4fe86ee83e --- /dev/null +++ b/vendor/doctrine/instantiator/.doctrine-project.json @@ -0,0 +1,26 @@ +{ + "active": true, + "name": "Instantiator", + "slug": "instantiator", + "docsSlug": "doctrine-instantiator", + "codePath": "/src", + "versions": [ + { + "name": "1.1", + "branchName": "master", + "slug": "latest", + "aliases": [ + "current", + "stable" + ], + "maintained": true, + "current": true + }, + { + "name": "1.0", + "branchName": "1.0.x", + "slug": "1.0" + } + ] +} + diff --git a/vendor/doctrine/instantiator/.github/FUNDING.yml b/vendor/doctrine/instantiator/.github/FUNDING.yml new file mode 100644 index 0000000000..9a35064fe5 --- /dev/null +++ b/vendor/doctrine/instantiator/.github/FUNDING.yml @@ -0,0 +1,3 @@ +patreon: phpdoctrine +tidelift: packagist/doctrine%2Finstantiator +custom: https://www.doctrine-project.org/sponsorship.html diff --git a/vendor/doctrine/instantiator/CONTRIBUTING.md b/vendor/doctrine/instantiator/CONTRIBUTING.md new file mode 100644 index 0000000000..c1a2c42ee0 --- /dev/null +++ b/vendor/doctrine/instantiator/CONTRIBUTING.md @@ -0,0 +1,35 @@ +# Contributing + + * Follow the [Doctrine Coding Standard](https://github.com/doctrine/coding-standard) + * The project will follow strict [object calisthenics](http://www.slideshare.net/guilhermeblanco/object-calisthenics-applied-to-php) + * Any contribution must provide tests for additional introduced conditions + * Any un-confirmed issue needs a failing test case before being accepted + * Pull requests must be sent from a new hotfix/feature branch, not from `master`. + +## Installation + +To install the project and run the tests, you need to clone it first: + +```sh +$ git clone git://github.com/doctrine/instantiator.git +``` + +You will then need to run a composer installation: + +```sh +$ cd Instantiator +$ curl -s https://getcomposer.org/installer | php +$ php composer.phar update +``` + +## Testing + +The PHPUnit version to be used is the one installed as a dev- dependency via composer: + +```sh +$ ./vendor/bin/phpunit +``` + +Accepted coverage for new contributions is 80%. Any contribution not satisfying this requirement +won't be merged. + diff --git a/vendor/doctrine/instantiator/LICENSE b/vendor/doctrine/instantiator/LICENSE new file mode 100644 index 0000000000..4d983d1ac7 --- /dev/null +++ b/vendor/doctrine/instantiator/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2014 Doctrine Project + +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/doctrine/instantiator/README.md b/vendor/doctrine/instantiator/README.md new file mode 100644 index 0000000000..eff5a0ca98 --- /dev/null +++ b/vendor/doctrine/instantiator/README.md @@ -0,0 +1,39 @@ +# Instantiator + +This library provides a way of avoiding usage of constructors when instantiating PHP classes. + +[![Build Status](https://travis-ci.org/doctrine/instantiator.svg?branch=master)](https://travis-ci.org/doctrine/instantiator) +[![Code Coverage](https://scrutinizer-ci.com/g/doctrine/instantiator/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/doctrine/instantiator/?branch=master) +[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/doctrine/instantiator/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/doctrine/instantiator/?branch=master) +[![Dependency Status](https://www.versioneye.com/package/php--doctrine--instantiator/badge.svg)](https://www.versioneye.com/package/php--doctrine--instantiator) + +[![Latest Stable Version](https://poser.pugx.org/doctrine/instantiator/v/stable.png)](https://packagist.org/packages/doctrine/instantiator) +[![Latest Unstable Version](https://poser.pugx.org/doctrine/instantiator/v/unstable.png)](https://packagist.org/packages/doctrine/instantiator) + +## Installation + +The suggested installation method is via [composer](https://getcomposer.org/): + +```sh +php composer.phar require "doctrine/instantiator:~1.0.3" +``` + +## Usage + +The instantiator is able to create new instances of any class without using the constructor or any API of the class +itself: + +```php +$instantiator = new \Doctrine\Instantiator\Instantiator(); + +$instance = $instantiator->instantiate(\My\ClassName\Here::class); +``` + +## Contributing + +Please read the [CONTRIBUTING.md](CONTRIBUTING.md) contents if you wish to help out! + +## Credits + +This library was migrated from [ocramius/instantiator](https://github.com/Ocramius/Instantiator), which +has been donated to the doctrine organization, and which is now deprecated in favour of this package. diff --git a/vendor/doctrine/instantiator/composer.json b/vendor/doctrine/instantiator/composer.json new file mode 100644 index 0000000000..a84baa714f --- /dev/null +++ b/vendor/doctrine/instantiator/composer.json @@ -0,0 +1,52 @@ +{ + "name": "doctrine/instantiator", + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "type": "library", + "license": "MIT", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "instantiate", + "constructor" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "config": { + "platform": { + "php": "7.1.27" + } + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "ext-phar": "*", + "ext-pdo": "*", + "doctrine/coding-standard": "^6.0", + "phpbench/phpbench": "^0.13", + "phpstan/phpstan-phpunit": "^0.11", + "phpstan/phpstan-shim": "^0.11", + "phpunit/phpunit": "^7.0" + }, + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "autoload-dev": { + "psr-0": { + "DoctrineTest\\InstantiatorPerformance\\": "tests", + "DoctrineTest\\InstantiatorTest\\": "tests", + "DoctrineTest\\InstantiatorTestAsset\\": "tests" + } + }, + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + } +} diff --git a/vendor/doctrine/instantiator/docs/en/index.rst b/vendor/doctrine/instantiator/docs/en/index.rst new file mode 100644 index 0000000000..0c85da0bc9 --- /dev/null +++ b/vendor/doctrine/instantiator/docs/en/index.rst @@ -0,0 +1,68 @@ +Introduction +============ + +This library provides a way of avoiding usage of constructors when instantiating PHP classes. + +Installation +============ + +The suggested installation method is via `composer`_: + +.. code-block:: console + + $ composer require doctrine/instantiator + +Usage +===== + +The instantiator is able to create new instances of any class without +using the constructor or any API of the class itself: + +.. code-block:: php + + instantiate(User::class); + +Contributing +============ + +- Follow the `Doctrine Coding Standard`_ +- The project will follow strict `object calisthenics`_ +- Any contribution must provide tests for additional introduced + conditions +- Any un-confirmed issue needs a failing test case before being + accepted +- Pull requests must be sent from a new hotfix/feature branch, not from + ``master``. + +Testing +======= + +The PHPUnit version to be used is the one installed as a dev- dependency +via composer: + +.. code-block:: console + + $ ./vendor/bin/phpunit + +Accepted coverage for new contributions is 80%. Any contribution not +satisfying this requirement won’t be merged. + +Credits +======= + +This library was migrated from `ocramius/instantiator`_, which has been +donated to the doctrine organization, and which is now deprecated in +favour of this package. + +.. _composer: https://getcomposer.org/ +.. _CONTRIBUTING.md: CONTRIBUTING.md +.. _ocramius/instantiator: https://github.com/Ocramius/Instantiator +.. _Doctrine Coding Standard: https://github.com/doctrine/coding-standard +.. _object calisthenics: http://www.slideshare.net/guilhermeblanco/object-calisthenics-applied-to-php diff --git a/vendor/doctrine/instantiator/docs/en/sidebar.rst b/vendor/doctrine/instantiator/docs/en/sidebar.rst new file mode 100644 index 0000000000..0c36479143 --- /dev/null +++ b/vendor/doctrine/instantiator/docs/en/sidebar.rst @@ -0,0 +1,4 @@ +.. toctree:: + :depth: 3 + + index diff --git a/vendor/doctrine/instantiator/phpbench.json b/vendor/doctrine/instantiator/phpbench.json new file mode 100644 index 0000000000..fce5dd600d --- /dev/null +++ b/vendor/doctrine/instantiator/phpbench.json @@ -0,0 +1,4 @@ +{ + "bootstrap": "vendor/autoload.php", + "path": "tests/DoctrineTest/InstantiatorPerformance" +} diff --git a/vendor/doctrine/instantiator/phpcs.xml.dist b/vendor/doctrine/instantiator/phpcs.xml.dist new file mode 100644 index 0000000000..1fcac4ab62 --- /dev/null +++ b/vendor/doctrine/instantiator/phpcs.xml.dist @@ -0,0 +1,35 @@ + + + + + + + + + + + + src + tests + + + + + + + + + + tests/DoctrineTest/InstantiatorTestAsset/AbstractClassAsset.php + + + + src/Doctrine/Instantiator/Exception/UnexpectedValueException.php + src/Doctrine/Instantiator/Exception/InvalidArgumentException.php + + + + src/Doctrine/Instantiator/Exception/ExceptionInterface.php + src/Doctrine/Instantiator/InstantiatorInterface.php + + diff --git a/vendor/doctrine/instantiator/phpstan.neon.dist b/vendor/doctrine/instantiator/phpstan.neon.dist new file mode 100644 index 0000000000..ecc38effb2 --- /dev/null +++ b/vendor/doctrine/instantiator/phpstan.neon.dist @@ -0,0 +1,19 @@ +includes: + - vendor/phpstan/phpstan-phpunit/extension.neon + - vendor/phpstan/phpstan-phpunit/rules.neon + +parameters: + level: max + paths: + - src + - tests + + ignoreErrors: + - + message: '#::__construct\(\) does not call parent constructor from#' + path: '*/tests/DoctrineTest/InstantiatorTestAsset/*.php' + + # dynamic properties confuse static analysis + - + message: '#Access to an undefined property object::\$foo\.#' + path: '*/tests/DoctrineTest/InstantiatorTest/InstantiatorTest.php' diff --git a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php new file mode 100644 index 0000000000..e6a5195f21 --- /dev/null +++ b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php @@ -0,0 +1,12 @@ += 50400 && trait_exists($className)) { + return new self(sprintf('The provided type "%s" is a trait, and can not be instantiated', $className)); + } + + return new self(sprintf('The provided class "%s" does not exist', $className)); + } + + public static function fromAbstractClass(ReflectionClass $reflectionClass) : self + { + return new self(sprintf( + 'The provided class "%s" is abstract, and can not be instantiated', + $reflectionClass->getName() + )); + } +} diff --git a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php new file mode 100644 index 0000000000..d946731b8f --- /dev/null +++ b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php @@ -0,0 +1,48 @@ +getName() + ), + 0, + $exception + ); + } + + public static function fromUncleanUnSerialization( + ReflectionClass $reflectionClass, + string $errorString, + int $errorCode, + string $errorFile, + int $errorLine + ) : self { + return new self( + sprintf( + 'Could not produce an instance of "%s" via un-serialization, since an error was triggered ' + . 'in file "%s" at line "%d"', + $reflectionClass->getName(), + $errorFile, + $errorLine + ), + 0, + new Exception($errorString, $errorCode) + ); + } +} diff --git a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php new file mode 100644 index 0000000000..9c67862493 --- /dev/null +++ b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php @@ -0,0 +1,203 @@ +buildAndCacheFromFactory($className); + } + + /** + * Builds the requested object and caches it in static properties for performance + * + * @return object + */ + private function buildAndCacheFromFactory(string $className) + { + $factory = self::$cachedInstantiators[$className] = $this->buildFactory($className); + $instance = $factory(); + + if ($this->isSafeToClone(new ReflectionClass($instance))) { + self::$cachedCloneables[$className] = clone $instance; + } + + return $instance; + } + + /** + * Builds a callable capable of instantiating the given $className without + * invoking its constructor. + * + * @throws InvalidArgumentException + * @throws UnexpectedValueException + * @throws ReflectionException + */ + private function buildFactory(string $className) : callable + { + $reflectionClass = $this->getReflectionClass($className); + + if ($this->isInstantiableViaReflection($reflectionClass)) { + return [$reflectionClass, 'newInstanceWithoutConstructor']; + } + + $serializedString = sprintf( + '%s:%d:"%s":0:{}', + is_subclass_of($className, Serializable::class) ? self::SERIALIZATION_FORMAT_USE_UNSERIALIZER : self::SERIALIZATION_FORMAT_AVOID_UNSERIALIZER, + strlen($className), + $className + ); + + $this->checkIfUnSerializationIsSupported($reflectionClass, $serializedString); + + return static function () use ($serializedString) { + return unserialize($serializedString); + }; + } + + /** + * @throws InvalidArgumentException + * @throws ReflectionException + */ + private function getReflectionClass(string $className) : ReflectionClass + { + if (! class_exists($className)) { + throw InvalidArgumentException::fromNonExistingClass($className); + } + + $reflection = new ReflectionClass($className); + + if ($reflection->isAbstract()) { + throw InvalidArgumentException::fromAbstractClass($reflection); + } + + return $reflection; + } + + /** + * @throws UnexpectedValueException + */ + private function checkIfUnSerializationIsSupported(ReflectionClass $reflectionClass, string $serializedString) : void + { + set_error_handler(static function (int $code, string $message, string $file, int $line) use ($reflectionClass, &$error) : bool { + $error = UnexpectedValueException::fromUncleanUnSerialization( + $reflectionClass, + $message, + $code, + $file, + $line + ); + + return true; + }); + + try { + $this->attemptInstantiationViaUnSerialization($reflectionClass, $serializedString); + } finally { + restore_error_handler(); + } + + if ($error) { + throw $error; + } + } + + /** + * @throws UnexpectedValueException + */ + private function attemptInstantiationViaUnSerialization(ReflectionClass $reflectionClass, string $serializedString) : void + { + try { + unserialize($serializedString); + } catch (Exception $exception) { + throw UnexpectedValueException::fromSerializationTriggeredException($reflectionClass, $exception); + } + } + + private function isInstantiableViaReflection(ReflectionClass $reflectionClass) : bool + { + return ! ($this->hasInternalAncestors($reflectionClass) && $reflectionClass->isFinal()); + } + + /** + * Verifies whether the given class is to be considered internal + */ + private function hasInternalAncestors(ReflectionClass $reflectionClass) : bool + { + do { + if ($reflectionClass->isInternal()) { + return true; + } + + $reflectionClass = $reflectionClass->getParentClass(); + } while ($reflectionClass); + + return false; + } + + /** + * Checks if a class is cloneable + * + * Classes implementing `__clone` cannot be safely cloned, as that may cause side-effects. + */ + private function isSafeToClone(ReflectionClass $reflection) : bool + { + return $reflection->isCloneable() + && ! $reflection->hasMethod('__clone') + && ! $reflection->isSubclassOf(ArrayIterator::class); + } +} diff --git a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php new file mode 100644 index 0000000000..95299f4a99 --- /dev/null +++ b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php @@ -0,0 +1,20 @@ +input = $input; + $this->tokens = []; + + $this->reset(); + $this->scan($input); + } + + /** + * Resets the lexer. + * + * @return void + */ + public function reset() + { + $this->lookahead = null; + $this->token = null; + $this->peek = 0; + $this->position = 0; + } + + /** + * Resets the peek pointer to 0. + * + * @return void + */ + public function resetPeek() + { + $this->peek = 0; + } + + /** + * Resets the lexer position on the input to the given position. + * + * @param int $position Position to place the lexical scanner. + * + * @return void + */ + public function resetPosition($position = 0) + { + $this->position = $position; + } + + /** + * Retrieve the original lexer's input until a given position. + * + * @param int $position + * + * @return string + */ + public function getInputUntilPosition($position) + { + return substr($this->input, 0, $position); + } + + /** + * Checks whether a given token matches the current lookahead. + * + * @param int|string $token + * + * @return bool + */ + public function isNextToken($token) + { + return $this->lookahead !== null && $this->lookahead['type'] === $token; + } + + /** + * Checks whether any of the given tokens matches the current lookahead. + * + * @param array $tokens + * + * @return bool + */ + public function isNextTokenAny(array $tokens) + { + return $this->lookahead !== null && in_array($this->lookahead['type'], $tokens, true); + } + + /** + * Moves to the next token in the input string. + * + * @return bool + */ + public function moveNext() + { + $this->peek = 0; + $this->token = $this->lookahead; + $this->lookahead = isset($this->tokens[$this->position]) + ? $this->tokens[$this->position++] : null; + + return $this->lookahead !== null; + } + + /** + * Tells the lexer to skip input tokens until it sees a token with the given value. + * + * @param string $type The token type to skip until. + * + * @return void + */ + public function skipUntil($type) + { + while ($this->lookahead !== null && $this->lookahead['type'] !== $type) { + $this->moveNext(); + } + } + + /** + * Checks if given value is identical to the given token. + * + * @param mixed $value + * @param int|string $token + * + * @return bool + */ + public function isA($value, $token) + { + return $this->getType($value) === $token; + } + + /** + * Moves the lookahead token forward. + * + * @return array|null The next token or NULL if there are no more tokens ahead. + */ + public function peek() + { + if (isset($this->tokens[$this->position + $this->peek])) { + return $this->tokens[$this->position + $this->peek++]; + } + + return null; + } + + /** + * Peeks at the next token, returns it and immediately resets the peek. + * + * @return array|null The next token or NULL if there are no more tokens ahead. + */ + public function glimpse() + { + $peek = $this->peek(); + $this->peek = 0; + + return $peek; + } + + /** + * Scans the input string for tokens. + * + * @param string $input A query string. + * + * @return void + */ + protected function scan($input) + { + if (! isset($this->regex)) { + $this->regex = sprintf( + '/(%s)|%s/%s', + implode(')|(', $this->getCatchablePatterns()), + implode('|', $this->getNonCatchablePatterns()), + $this->getModifiers() + ); + } + + $flags = PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_OFFSET_CAPTURE; + $matches = preg_split($this->regex, $input, -1, $flags); + + if ($matches === false) { + // Work around https://bugs.php.net/78122 + $matches = [[$input, 0]]; + } + + foreach ($matches as $match) { + // Must remain before 'value' assignment since it can change content + $type = $this->getType($match[0]); + + $this->tokens[] = [ + 'value' => $match[0], + 'type' => $type, + 'position' => $match[1], + ]; + } + } + + /** + * Gets the literal for a given token. + * + * @param int|string $token + * + * @return int|string + */ + public function getLiteral($token) + { + $className = static::class; + $reflClass = new ReflectionClass($className); + $constants = $reflClass->getConstants(); + + foreach ($constants as $name => $value) { + if ($value === $token) { + return $className . '::' . $name; + } + } + + return $token; + } + + /** + * Regex modifiers + * + * @return string + */ + protected function getModifiers() + { + return 'iu'; + } + + /** + * Lexical catchable patterns. + * + * @return array + */ + abstract protected function getCatchablePatterns(); + + /** + * Lexical non-catchable patterns. + * + * @return array + */ + abstract protected function getNonCatchablePatterns(); + + /** + * Retrieve token type. Also processes the token value if necessary. + * + * @param string $value + * + * @return int|string|null + */ + abstract protected function getType(&$value); +} diff --git a/vendor/erusev/parsedown/LICENSE.txt b/vendor/erusev/parsedown/LICENSE.txt new file mode 100644 index 0000000000..8e7c764d16 --- /dev/null +++ b/vendor/erusev/parsedown/LICENSE.txt @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2013-2018 Emanuil Rusev, erusev.com + +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/erusev/parsedown/Parsedown.php b/vendor/erusev/parsedown/Parsedown.php new file mode 100644 index 0000000000..1b9d6d5bc2 --- /dev/null +++ b/vendor/erusev/parsedown/Parsedown.php @@ -0,0 +1,1712 @@ +DefinitionData = array(); + + # standardize line breaks + $text = str_replace(array("\r\n", "\r"), "\n", $text); + + # remove surrounding line breaks + $text = trim($text, "\n"); + + # split text into lines + $lines = explode("\n", $text); + + # iterate through lines to identify blocks + $markup = $this->lines($lines); + + # trim line breaks + $markup = trim($markup, "\n"); + + return $markup; + } + + # + # Setters + # + + function setBreaksEnabled($breaksEnabled) + { + $this->breaksEnabled = $breaksEnabled; + + return $this; + } + + protected $breaksEnabled; + + function setMarkupEscaped($markupEscaped) + { + $this->markupEscaped = $markupEscaped; + + return $this; + } + + protected $markupEscaped; + + function setUrlsLinked($urlsLinked) + { + $this->urlsLinked = $urlsLinked; + + return $this; + } + + protected $urlsLinked = true; + + function setSafeMode($safeMode) + { + $this->safeMode = (bool) $safeMode; + + return $this; + } + + protected $safeMode; + + protected $safeLinksWhitelist = array( + 'http://', + 'https://', + 'ftp://', + 'ftps://', + 'mailto:', + 'data:image/png;base64,', + 'data:image/gif;base64,', + 'data:image/jpeg;base64,', + 'irc:', + 'ircs:', + 'git:', + 'ssh:', + 'news:', + 'steam:', + ); + + # + # Lines + # + + protected $BlockTypes = array( + '#' => array('Header'), + '*' => array('Rule', 'List'), + '+' => array('List'), + '-' => array('SetextHeader', 'Table', 'Rule', 'List'), + '0' => array('List'), + '1' => array('List'), + '2' => array('List'), + '3' => array('List'), + '4' => array('List'), + '5' => array('List'), + '6' => array('List'), + '7' => array('List'), + '8' => array('List'), + '9' => array('List'), + ':' => array('Table'), + '<' => array('Comment', 'Markup'), + '=' => array('SetextHeader'), + '>' => array('Quote'), + '[' => array('Reference'), + '_' => array('Rule'), + '`' => array('FencedCode'), + '|' => array('Table'), + '~' => array('FencedCode'), + ); + + # ~ + + protected $unmarkedBlockTypes = array( + 'Code', + ); + + # + # Blocks + # + + protected function lines(array $lines) + { + $CurrentBlock = null; + + foreach ($lines as $line) + { + if (chop($line) === '') + { + if (isset($CurrentBlock)) + { + $CurrentBlock['interrupted'] = true; + } + + continue; + } + + if (strpos($line, "\t") !== false) + { + $parts = explode("\t", $line); + + $line = $parts[0]; + + unset($parts[0]); + + foreach ($parts as $part) + { + $shortage = 4 - mb_strlen($line, 'utf-8') % 4; + + $line .= str_repeat(' ', $shortage); + $line .= $part; + } + } + + $indent = 0; + + while (isset($line[$indent]) and $line[$indent] === ' ') + { + $indent ++; + } + + $text = $indent > 0 ? substr($line, $indent) : $line; + + # ~ + + $Line = array('body' => $line, 'indent' => $indent, 'text' => $text); + + # ~ + + if (isset($CurrentBlock['continuable'])) + { + $Block = $this->{'block'.$CurrentBlock['type'].'Continue'}($Line, $CurrentBlock); + + if (isset($Block)) + { + $CurrentBlock = $Block; + + continue; + } + else + { + if ($this->isBlockCompletable($CurrentBlock['type'])) + { + $CurrentBlock = $this->{'block'.$CurrentBlock['type'].'Complete'}($CurrentBlock); + } + } + } + + # ~ + + $marker = $text[0]; + + # ~ + + $blockTypes = $this->unmarkedBlockTypes; + + if (isset($this->BlockTypes[$marker])) + { + foreach ($this->BlockTypes[$marker] as $blockType) + { + $blockTypes []= $blockType; + } + } + + # + # ~ + + foreach ($blockTypes as $blockType) + { + $Block = $this->{'block'.$blockType}($Line, $CurrentBlock); + + if (isset($Block)) + { + $Block['type'] = $blockType; + + if ( ! isset($Block['identified'])) + { + $Blocks []= $CurrentBlock; + + $Block['identified'] = true; + } + + if ($this->isBlockContinuable($blockType)) + { + $Block['continuable'] = true; + } + + $CurrentBlock = $Block; + + continue 2; + } + } + + # ~ + + if (isset($CurrentBlock) and ! isset($CurrentBlock['type']) and ! isset($CurrentBlock['interrupted'])) + { + $CurrentBlock['element']['text'] .= "\n".$text; + } + else + { + $Blocks []= $CurrentBlock; + + $CurrentBlock = $this->paragraph($Line); + + $CurrentBlock['identified'] = true; + } + } + + # ~ + + if (isset($CurrentBlock['continuable']) and $this->isBlockCompletable($CurrentBlock['type'])) + { + $CurrentBlock = $this->{'block'.$CurrentBlock['type'].'Complete'}($CurrentBlock); + } + + # ~ + + $Blocks []= $CurrentBlock; + + unset($Blocks[0]); + + # ~ + + $markup = ''; + + foreach ($Blocks as $Block) + { + if (isset($Block['hidden'])) + { + continue; + } + + $markup .= "\n"; + $markup .= isset($Block['markup']) ? $Block['markup'] : $this->element($Block['element']); + } + + $markup .= "\n"; + + # ~ + + return $markup; + } + + protected function isBlockContinuable($Type) + { + return method_exists($this, 'block'.$Type.'Continue'); + } + + protected function isBlockCompletable($Type) + { + return method_exists($this, 'block'.$Type.'Complete'); + } + + # + # Code + + protected function blockCode($Line, $Block = null) + { + if (isset($Block) and ! isset($Block['type']) and ! isset($Block['interrupted'])) + { + return; + } + + if ($Line['indent'] >= 4) + { + $text = substr($Line['body'], 4); + + $Block = array( + 'element' => array( + 'name' => 'pre', + 'handler' => 'element', + 'text' => array( + 'name' => 'code', + 'text' => $text, + ), + ), + ); + + return $Block; + } + } + + protected function blockCodeContinue($Line, $Block) + { + if ($Line['indent'] >= 4) + { + if (isset($Block['interrupted'])) + { + $Block['element']['text']['text'] .= "\n"; + + unset($Block['interrupted']); + } + + $Block['element']['text']['text'] .= "\n"; + + $text = substr($Line['body'], 4); + + $Block['element']['text']['text'] .= $text; + + return $Block; + } + } + + protected function blockCodeComplete($Block) + { + $text = $Block['element']['text']['text']; + + $Block['element']['text']['text'] = $text; + + return $Block; + } + + # + # Comment + + protected function blockComment($Line) + { + if ($this->markupEscaped or $this->safeMode) + { + return; + } + + if (isset($Line['text'][3]) and $Line['text'][3] === '-' and $Line['text'][2] === '-' and $Line['text'][1] === '!') + { + $Block = array( + 'markup' => $Line['body'], + ); + + if (preg_match('/-->$/', $Line['text'])) + { + $Block['closed'] = true; + } + + return $Block; + } + } + + protected function blockCommentContinue($Line, array $Block) + { + if (isset($Block['closed'])) + { + return; + } + + $Block['markup'] .= "\n" . $Line['body']; + + if (preg_match('/-->$/', $Line['text'])) + { + $Block['closed'] = true; + } + + return $Block; + } + + # + # Fenced Code + + protected function blockFencedCode($Line) + { + if (preg_match('/^['.$Line['text'][0].']{3,}[ ]*([^`]+)?[ ]*$/', $Line['text'], $matches)) + { + $Element = array( + 'name' => 'code', + 'text' => '', + ); + + if (isset($matches[1])) + { + /** + * https://www.w3.org/TR/2011/WD-html5-20110525/elements.html#classes + * Every HTML element may have a class attribute specified. + * The attribute, if specified, must have a value that is a set + * of space-separated tokens representing the various classes + * that the element belongs to. + * [...] + * The space characters, for the purposes of this specification, + * are U+0020 SPACE, U+0009 CHARACTER TABULATION (tab), + * U+000A LINE FEED (LF), U+000C FORM FEED (FF), and + * U+000D CARRIAGE RETURN (CR). + */ + $language = substr($matches[1], 0, strcspn($matches[1], " \t\n\f\r")); + + $class = 'language-'.$language; + + $Element['attributes'] = array( + 'class' => $class, + ); + } + + $Block = array( + 'char' => $Line['text'][0], + 'element' => array( + 'name' => 'pre', + 'handler' => 'element', + 'text' => $Element, + ), + ); + + return $Block; + } + } + + protected function blockFencedCodeContinue($Line, $Block) + { + if (isset($Block['complete'])) + { + return; + } + + if (isset($Block['interrupted'])) + { + $Block['element']['text']['text'] .= "\n"; + + unset($Block['interrupted']); + } + + if (preg_match('/^'.$Block['char'].'{3,}[ ]*$/', $Line['text'])) + { + $Block['element']['text']['text'] = substr($Block['element']['text']['text'], 1); + + $Block['complete'] = true; + + return $Block; + } + + $Block['element']['text']['text'] .= "\n".$Line['body']; + + return $Block; + } + + protected function blockFencedCodeComplete($Block) + { + $text = $Block['element']['text']['text']; + + $Block['element']['text']['text'] = $text; + + return $Block; + } + + # + # Header + + protected function blockHeader($Line) + { + if (isset($Line['text'][1])) + { + $level = 1; + + while (isset($Line['text'][$level]) and $Line['text'][$level] === '#') + { + $level ++; + } + + if ($level > 6) + { + return; + } + + $text = trim($Line['text'], '# '); + + $Block = array( + 'element' => array( + 'name' => 'h' . min(6, $level), + 'text' => $text, + 'handler' => 'line', + ), + ); + + return $Block; + } + } + + # + # List + + protected function blockList($Line) + { + list($name, $pattern) = $Line['text'][0] <= '-' ? array('ul', '[*+-]') : array('ol', '[0-9]+[.]'); + + if (preg_match('/^('.$pattern.'[ ]+)(.*)/', $Line['text'], $matches)) + { + $Block = array( + 'indent' => $Line['indent'], + 'pattern' => $pattern, + 'element' => array( + 'name' => $name, + 'handler' => 'elements', + ), + ); + + if($name === 'ol') + { + $listStart = stristr($matches[0], '.', true); + + if($listStart !== '1') + { + $Block['element']['attributes'] = array('start' => $listStart); + } + } + + $Block['li'] = array( + 'name' => 'li', + 'handler' => 'li', + 'text' => array( + $matches[2], + ), + ); + + $Block['element']['text'] []= & $Block['li']; + + return $Block; + } + } + + protected function blockListContinue($Line, array $Block) + { + if ($Block['indent'] === $Line['indent'] and preg_match('/^'.$Block['pattern'].'(?:[ ]+(.*)|$)/', $Line['text'], $matches)) + { + if (isset($Block['interrupted'])) + { + $Block['li']['text'] []= ''; + + $Block['loose'] = true; + + unset($Block['interrupted']); + } + + unset($Block['li']); + + $text = isset($matches[1]) ? $matches[1] : ''; + + $Block['li'] = array( + 'name' => 'li', + 'handler' => 'li', + 'text' => array( + $text, + ), + ); + + $Block['element']['text'] []= & $Block['li']; + + return $Block; + } + + if ($Line['text'][0] === '[' and $this->blockReference($Line)) + { + return $Block; + } + + if ( ! isset($Block['interrupted'])) + { + $text = preg_replace('/^[ ]{0,4}/', '', $Line['body']); + + $Block['li']['text'] []= $text; + + return $Block; + } + + if ($Line['indent'] > 0) + { + $Block['li']['text'] []= ''; + + $text = preg_replace('/^[ ]{0,4}/', '', $Line['body']); + + $Block['li']['text'] []= $text; + + unset($Block['interrupted']); + + return $Block; + } + } + + protected function blockListComplete(array $Block) + { + if (isset($Block['loose'])) + { + foreach ($Block['element']['text'] as &$li) + { + if (end($li['text']) !== '') + { + $li['text'] []= ''; + } + } + } + + return $Block; + } + + # + # Quote + + protected function blockQuote($Line) + { + if (preg_match('/^>[ ]?(.*)/', $Line['text'], $matches)) + { + $Block = array( + 'element' => array( + 'name' => 'blockquote', + 'handler' => 'lines', + 'text' => (array) $matches[1], + ), + ); + + return $Block; + } + } + + protected function blockQuoteContinue($Line, array $Block) + { + if ($Line['text'][0] === '>' and preg_match('/^>[ ]?(.*)/', $Line['text'], $matches)) + { + if (isset($Block['interrupted'])) + { + $Block['element']['text'] []= ''; + + unset($Block['interrupted']); + } + + $Block['element']['text'] []= $matches[1]; + + return $Block; + } + + if ( ! isset($Block['interrupted'])) + { + $Block['element']['text'] []= $Line['text']; + + return $Block; + } + } + + # + # Rule + + protected function blockRule($Line) + { + if (preg_match('/^(['.$Line['text'][0].'])([ ]*\1){2,}[ ]*$/', $Line['text'])) + { + $Block = array( + 'element' => array( + 'name' => 'hr' + ), + ); + + return $Block; + } + } + + # + # Setext + + protected function blockSetextHeader($Line, array $Block = null) + { + if ( ! isset($Block) or isset($Block['type']) or isset($Block['interrupted'])) + { + return; + } + + if (chop($Line['text'], $Line['text'][0]) === '') + { + $Block['element']['name'] = $Line['text'][0] === '=' ? 'h1' : 'h2'; + + return $Block; + } + } + + # + # Markup + + protected function blockMarkup($Line) + { + if ($this->markupEscaped or $this->safeMode) + { + return; + } + + if (preg_match('/^<(\w[\w-]*)(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*(\/)?>/', $Line['text'], $matches)) + { + $element = strtolower($matches[1]); + + if (in_array($element, $this->textLevelElements)) + { + return; + } + + $Block = array( + 'name' => $matches[1], + 'depth' => 0, + 'markup' => $Line['text'], + ); + + $length = strlen($matches[0]); + + $remainder = substr($Line['text'], $length); + + if (trim($remainder) === '') + { + if (isset($matches[2]) or in_array($matches[1], $this->voidElements)) + { + $Block['closed'] = true; + + $Block['void'] = true; + } + } + else + { + if (isset($matches[2]) or in_array($matches[1], $this->voidElements)) + { + return; + } + + if (preg_match('/<\/'.$matches[1].'>[ ]*$/i', $remainder)) + { + $Block['closed'] = true; + } + } + + return $Block; + } + } + + protected function blockMarkupContinue($Line, array $Block) + { + if (isset($Block['closed'])) + { + return; + } + + if (preg_match('/^<'.$Block['name'].'(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*>/i', $Line['text'])) # open + { + $Block['depth'] ++; + } + + if (preg_match('/(.*?)<\/'.$Block['name'].'>[ ]*$/i', $Line['text'], $matches)) # close + { + if ($Block['depth'] > 0) + { + $Block['depth'] --; + } + else + { + $Block['closed'] = true; + } + } + + if (isset($Block['interrupted'])) + { + $Block['markup'] .= "\n"; + + unset($Block['interrupted']); + } + + $Block['markup'] .= "\n".$Line['body']; + + return $Block; + } + + # + # Reference + + protected function blockReference($Line) + { + if (preg_match('/^\[(.+?)\]:[ ]*?(?:[ ]+["\'(](.+)["\')])?[ ]*$/', $Line['text'], $matches)) + { + $id = strtolower($matches[1]); + + $Data = array( + 'url' => $matches[2], + 'title' => null, + ); + + if (isset($matches[3])) + { + $Data['title'] = $matches[3]; + } + + $this->DefinitionData['Reference'][$id] = $Data; + + $Block = array( + 'hidden' => true, + ); + + return $Block; + } + } + + # + # Table + + protected function blockTable($Line, array $Block = null) + { + if ( ! isset($Block) or isset($Block['type']) or isset($Block['interrupted'])) + { + return; + } + + if (strpos($Block['element']['text'], '|') !== false and chop($Line['text'], ' -:|') === '') + { + $alignments = array(); + + $divider = $Line['text']; + + $divider = trim($divider); + $divider = trim($divider, '|'); + + $dividerCells = explode('|', $divider); + + foreach ($dividerCells as $dividerCell) + { + $dividerCell = trim($dividerCell); + + if ($dividerCell === '') + { + continue; + } + + $alignment = null; + + if ($dividerCell[0] === ':') + { + $alignment = 'left'; + } + + if (substr($dividerCell, - 1) === ':') + { + $alignment = $alignment === 'left' ? 'center' : 'right'; + } + + $alignments []= $alignment; + } + + # ~ + + $HeaderElements = array(); + + $header = $Block['element']['text']; + + $header = trim($header); + $header = trim($header, '|'); + + $headerCells = explode('|', $header); + + foreach ($headerCells as $index => $headerCell) + { + $headerCell = trim($headerCell); + + $HeaderElement = array( + 'name' => 'th', + 'text' => $headerCell, + 'handler' => 'line', + ); + + if (isset($alignments[$index])) + { + $alignment = $alignments[$index]; + + $HeaderElement['attributes'] = array( + 'style' => 'text-align: '.$alignment.';', + ); + } + + $HeaderElements []= $HeaderElement; + } + + # ~ + + $Block = array( + 'alignments' => $alignments, + 'identified' => true, + 'element' => array( + 'name' => 'table', + 'handler' => 'elements', + ), + ); + + $Block['element']['text'] []= array( + 'name' => 'thead', + 'handler' => 'elements', + ); + + $Block['element']['text'] []= array( + 'name' => 'tbody', + 'handler' => 'elements', + 'text' => array(), + ); + + $Block['element']['text'][0]['text'] []= array( + 'name' => 'tr', + 'handler' => 'elements', + 'text' => $HeaderElements, + ); + + return $Block; + } + } + + protected function blockTableContinue($Line, array $Block) + { + if (isset($Block['interrupted'])) + { + return; + } + + if ($Line['text'][0] === '|' or strpos($Line['text'], '|')) + { + $Elements = array(); + + $row = $Line['text']; + + $row = trim($row); + $row = trim($row, '|'); + + preg_match_all('/(?:(\\\\[|])|[^|`]|`[^`]+`|`)+/', $row, $matches); + + foreach ($matches[0] as $index => $cell) + { + $cell = trim($cell); + + $Element = array( + 'name' => 'td', + 'handler' => 'line', + 'text' => $cell, + ); + + if (isset($Block['alignments'][$index])) + { + $Element['attributes'] = array( + 'style' => 'text-align: '.$Block['alignments'][$index].';', + ); + } + + $Elements []= $Element; + } + + $Element = array( + 'name' => 'tr', + 'handler' => 'elements', + 'text' => $Elements, + ); + + $Block['element']['text'][1]['text'] []= $Element; + + return $Block; + } + } + + # + # ~ + # + + protected function paragraph($Line) + { + $Block = array( + 'element' => array( + 'name' => 'p', + 'text' => $Line['text'], + 'handler' => 'line', + ), + ); + + return $Block; + } + + # + # Inline Elements + # + + protected $InlineTypes = array( + '"' => array('SpecialCharacter'), + '!' => array('Image'), + '&' => array('SpecialCharacter'), + '*' => array('Emphasis'), + ':' => array('Url'), + '<' => array('UrlTag', 'EmailTag', 'Markup', 'SpecialCharacter'), + '>' => array('SpecialCharacter'), + '[' => array('Link'), + '_' => array('Emphasis'), + '`' => array('Code'), + '~' => array('Strikethrough'), + '\\' => array('EscapeSequence'), + ); + + # ~ + + protected $inlineMarkerList = '!"*_&[:<>`~\\'; + + # + # ~ + # + + public function line($text, $nonNestables=array()) + { + $markup = ''; + + # $excerpt is based on the first occurrence of a marker + + while ($excerpt = strpbrk($text, $this->inlineMarkerList)) + { + $marker = $excerpt[0]; + + $markerPosition = strpos($text, $marker); + + $Excerpt = array('text' => $excerpt, 'context' => $text); + + foreach ($this->InlineTypes[$marker] as $inlineType) + { + # check to see if the current inline type is nestable in the current context + + if ( ! empty($nonNestables) and in_array($inlineType, $nonNestables)) + { + continue; + } + + $Inline = $this->{'inline'.$inlineType}($Excerpt); + + if ( ! isset($Inline)) + { + continue; + } + + # makes sure that the inline belongs to "our" marker + + if (isset($Inline['position']) and $Inline['position'] > $markerPosition) + { + continue; + } + + # sets a default inline position + + if ( ! isset($Inline['position'])) + { + $Inline['position'] = $markerPosition; + } + + # cause the new element to 'inherit' our non nestables + + foreach ($nonNestables as $non_nestable) + { + $Inline['element']['nonNestables'][] = $non_nestable; + } + + # the text that comes before the inline + $unmarkedText = substr($text, 0, $Inline['position']); + + # compile the unmarked text + $markup .= $this->unmarkedText($unmarkedText); + + # compile the inline + $markup .= isset($Inline['markup']) ? $Inline['markup'] : $this->element($Inline['element']); + + # remove the examined text + $text = substr($text, $Inline['position'] + $Inline['extent']); + + continue 2; + } + + # the marker does not belong to an inline + + $unmarkedText = substr($text, 0, $markerPosition + 1); + + $markup .= $this->unmarkedText($unmarkedText); + + $text = substr($text, $markerPosition + 1); + } + + $markup .= $this->unmarkedText($text); + + return $markup; + } + + # + # ~ + # + + protected function inlineCode($Excerpt) + { + $marker = $Excerpt['text'][0]; + + if (preg_match('/^('.$marker.'+)[ ]*(.+?)[ ]*(? strlen($matches[0]), + 'element' => array( + 'name' => 'code', + 'text' => $text, + ), + ); + } + } + + protected function inlineEmailTag($Excerpt) + { + if (strpos($Excerpt['text'], '>') !== false and preg_match('/^<((mailto:)?\S+?@\S+?)>/i', $Excerpt['text'], $matches)) + { + $url = $matches[1]; + + if ( ! isset($matches[2])) + { + $url = 'mailto:' . $url; + } + + return array( + 'extent' => strlen($matches[0]), + 'element' => array( + 'name' => 'a', + 'text' => $matches[1], + 'attributes' => array( + 'href' => $url, + ), + ), + ); + } + } + + protected function inlineEmphasis($Excerpt) + { + if ( ! isset($Excerpt['text'][1])) + { + return; + } + + $marker = $Excerpt['text'][0]; + + if ($Excerpt['text'][1] === $marker and preg_match($this->StrongRegex[$marker], $Excerpt['text'], $matches)) + { + $emphasis = 'strong'; + } + elseif (preg_match($this->EmRegex[$marker], $Excerpt['text'], $matches)) + { + $emphasis = 'em'; + } + else + { + return; + } + + return array( + 'extent' => strlen($matches[0]), + 'element' => array( + 'name' => $emphasis, + 'handler' => 'line', + 'text' => $matches[1], + ), + ); + } + + protected function inlineEscapeSequence($Excerpt) + { + if (isset($Excerpt['text'][1]) and in_array($Excerpt['text'][1], $this->specialCharacters)) + { + return array( + 'markup' => $Excerpt['text'][1], + 'extent' => 2, + ); + } + } + + protected function inlineImage($Excerpt) + { + if ( ! isset($Excerpt['text'][1]) or $Excerpt['text'][1] !== '[') + { + return; + } + + $Excerpt['text']= substr($Excerpt['text'], 1); + + $Link = $this->inlineLink($Excerpt); + + if ($Link === null) + { + return; + } + + $Inline = array( + 'extent' => $Link['extent'] + 1, + 'element' => array( + 'name' => 'img', + 'attributes' => array( + 'src' => $Link['element']['attributes']['href'], + 'alt' => $Link['element']['text'], + ), + ), + ); + + $Inline['element']['attributes'] += $Link['element']['attributes']; + + unset($Inline['element']['attributes']['href']); + + return $Inline; + } + + protected function inlineLink($Excerpt) + { + $Element = array( + 'name' => 'a', + 'handler' => 'line', + 'nonNestables' => array('Url', 'Link'), + 'text' => null, + 'attributes' => array( + 'href' => null, + 'title' => null, + ), + ); + + $extent = 0; + + $remainder = $Excerpt['text']; + + if (preg_match('/\[((?:[^][]++|(?R))*+)\]/', $remainder, $matches)) + { + $Element['text'] = $matches[1]; + + $extent += strlen($matches[0]); + + $remainder = substr($remainder, $extent); + } + else + { + return; + } + + if (preg_match('/^[(]\s*+((?:[^ ()]++|[(][^ )]+[)])++)(?:[ ]+("[^"]*"|\'[^\']*\'))?\s*[)]/', $remainder, $matches)) + { + $Element['attributes']['href'] = $matches[1]; + + if (isset($matches[2])) + { + $Element['attributes']['title'] = substr($matches[2], 1, - 1); + } + + $extent += strlen($matches[0]); + } + else + { + if (preg_match('/^\s*\[(.*?)\]/', $remainder, $matches)) + { + $definition = strlen($matches[1]) ? $matches[1] : $Element['text']; + $definition = strtolower($definition); + + $extent += strlen($matches[0]); + } + else + { + $definition = strtolower($Element['text']); + } + + if ( ! isset($this->DefinitionData['Reference'][$definition])) + { + return; + } + + $Definition = $this->DefinitionData['Reference'][$definition]; + + $Element['attributes']['href'] = $Definition['url']; + $Element['attributes']['title'] = $Definition['title']; + } + + return array( + 'extent' => $extent, + 'element' => $Element, + ); + } + + protected function inlineMarkup($Excerpt) + { + if ($this->markupEscaped or $this->safeMode or strpos($Excerpt['text'], '>') === false) + { + return; + } + + if ($Excerpt['text'][1] === '/' and preg_match('/^<\/\w[\w-]*[ ]*>/s', $Excerpt['text'], $matches)) + { + return array( + 'markup' => $matches[0], + 'extent' => strlen($matches[0]), + ); + } + + if ($Excerpt['text'][1] === '!' and preg_match('/^/s', $Excerpt['text'], $matches)) + { + return array( + 'markup' => $matches[0], + 'extent' => strlen($matches[0]), + ); + } + + if ($Excerpt['text'][1] !== ' ' and preg_match('/^<\w[\w-]*(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*\/?>/s', $Excerpt['text'], $matches)) + { + return array( + 'markup' => $matches[0], + 'extent' => strlen($matches[0]), + ); + } + } + + protected function inlineSpecialCharacter($Excerpt) + { + if ($Excerpt['text'][0] === '&' and ! preg_match('/^&#?\w+;/', $Excerpt['text'])) + { + return array( + 'markup' => '&', + 'extent' => 1, + ); + } + + $SpecialCharacter = array('>' => 'gt', '<' => 'lt', '"' => 'quot'); + + if (isset($SpecialCharacter[$Excerpt['text'][0]])) + { + return array( + 'markup' => '&'.$SpecialCharacter[$Excerpt['text'][0]].';', + 'extent' => 1, + ); + } + } + + protected function inlineStrikethrough($Excerpt) + { + if ( ! isset($Excerpt['text'][1])) + { + return; + } + + if ($Excerpt['text'][1] === '~' and preg_match('/^~~(?=\S)(.+?)(?<=\S)~~/', $Excerpt['text'], $matches)) + { + return array( + 'extent' => strlen($matches[0]), + 'element' => array( + 'name' => 'del', + 'text' => $matches[1], + 'handler' => 'line', + ), + ); + } + } + + protected function inlineUrl($Excerpt) + { + if ($this->urlsLinked !== true or ! isset($Excerpt['text'][2]) or $Excerpt['text'][2] !== '/') + { + return; + } + + if (preg_match('/\bhttps?:[\/]{2}[^\s<]+\b\/*/ui', $Excerpt['context'], $matches, PREG_OFFSET_CAPTURE)) + { + $url = $matches[0][0]; + + $Inline = array( + 'extent' => strlen($matches[0][0]), + 'position' => $matches[0][1], + 'element' => array( + 'name' => 'a', + 'text' => $url, + 'attributes' => array( + 'href' => $url, + ), + ), + ); + + return $Inline; + } + } + + protected function inlineUrlTag($Excerpt) + { + if (strpos($Excerpt['text'], '>') !== false and preg_match('/^<(\w+:\/{2}[^ >]+)>/i', $Excerpt['text'], $matches)) + { + $url = $matches[1]; + + return array( + 'extent' => strlen($matches[0]), + 'element' => array( + 'name' => 'a', + 'text' => $url, + 'attributes' => array( + 'href' => $url, + ), + ), + ); + } + } + + # ~ + + protected function unmarkedText($text) + { + if ($this->breaksEnabled) + { + $text = preg_replace('/[ ]*\n/', "
\n", $text); + } + else + { + $text = preg_replace('/(?:[ ][ ]+|[ ]*\\\\)\n/', "
\n", $text); + $text = str_replace(" \n", "\n", $text); + } + + return $text; + } + + # + # Handlers + # + + protected function element(array $Element) + { + if ($this->safeMode) + { + $Element = $this->sanitiseElement($Element); + } + + $markup = '<'.$Element['name']; + + if (isset($Element['attributes'])) + { + foreach ($Element['attributes'] as $name => $value) + { + if ($value === null) + { + continue; + } + + $markup .= ' '.$name.'="'.self::escape($value).'"'; + } + } + + $permitRawHtml = false; + + if (isset($Element['text'])) + { + $text = $Element['text']; + } + // very strongly consider an alternative if you're writing an + // extension + elseif (isset($Element['rawHtml'])) + { + $text = $Element['rawHtml']; + $allowRawHtmlInSafeMode = isset($Element['allowRawHtmlInSafeMode']) && $Element['allowRawHtmlInSafeMode']; + $permitRawHtml = !$this->safeMode || $allowRawHtmlInSafeMode; + } + + if (isset($text)) + { + $markup .= '>'; + + if (!isset($Element['nonNestables'])) + { + $Element['nonNestables'] = array(); + } + + if (isset($Element['handler'])) + { + $markup .= $this->{$Element['handler']}($text, $Element['nonNestables']); + } + elseif (!$permitRawHtml) + { + $markup .= self::escape($text, true); + } + else + { + $markup .= $text; + } + + $markup .= ''; + } + else + { + $markup .= ' />'; + } + + return $markup; + } + + protected function elements(array $Elements) + { + $markup = ''; + + foreach ($Elements as $Element) + { + $markup .= "\n" . $this->element($Element); + } + + $markup .= "\n"; + + return $markup; + } + + # ~ + + protected function li($lines) + { + $markup = $this->lines($lines); + + $trimmedMarkup = trim($markup); + + if ( ! in_array('', $lines) and substr($trimmedMarkup, 0, 3) === '

') + { + $markup = $trimmedMarkup; + $markup = substr($markup, 3); + + $position = strpos($markup, "

"); + + $markup = substr_replace($markup, '', $position, 4); + } + + return $markup; + } + + # + # Deprecated Methods + # + + function parse($text) + { + $markup = $this->text($text); + + return $markup; + } + + protected function sanitiseElement(array $Element) + { + static $goodAttribute = '/^[a-zA-Z0-9][a-zA-Z0-9-_]*+$/'; + static $safeUrlNameToAtt = array( + 'a' => 'href', + 'img' => 'src', + ); + + if (isset($safeUrlNameToAtt[$Element['name']])) + { + $Element = $this->filterUnsafeUrlInAttribute($Element, $safeUrlNameToAtt[$Element['name']]); + } + + if ( ! empty($Element['attributes'])) + { + foreach ($Element['attributes'] as $att => $val) + { + # filter out badly parsed attribute + if ( ! preg_match($goodAttribute, $att)) + { + unset($Element['attributes'][$att]); + } + # dump onevent attribute + elseif (self::striAtStart($att, 'on')) + { + unset($Element['attributes'][$att]); + } + } + } + + return $Element; + } + + protected function filterUnsafeUrlInAttribute(array $Element, $attribute) + { + foreach ($this->safeLinksWhitelist as $scheme) + { + if (self::striAtStart($Element['attributes'][$attribute], $scheme)) + { + return $Element; + } + } + + $Element['attributes'][$attribute] = str_replace(':', '%3A', $Element['attributes'][$attribute]); + + return $Element; + } + + # + # Static Methods + # + + protected static function escape($text, $allowQuotes = false) + { + return htmlspecialchars($text, $allowQuotes ? ENT_NOQUOTES : ENT_QUOTES, 'UTF-8'); + } + + protected static function striAtStart($string, $needle) + { + $len = strlen($needle); + + if ($len > strlen($string)) + { + return false; + } + else + { + return strtolower(substr($string, 0, $len)) === strtolower($needle); + } + } + + static function instance($name = 'default') + { + if (isset(self::$instances[$name])) + { + return self::$instances[$name]; + } + + $instance = new static(); + + self::$instances[$name] = $instance; + + return $instance; + } + + private static $instances = array(); + + # + # Fields + # + + protected $DefinitionData; + + # + # Read-Only + + protected $specialCharacters = array( + '\\', '`', '*', '_', '{', '}', '[', ']', '(', ')', '>', '#', '+', '-', '.', '!', '|', + ); + + protected $StrongRegex = array( + '*' => '/^[*]{2}((?:\\\\\*|[^*]|[*][^*]*[*])+?)[*]{2}(?![*])/s', + '_' => '/^__((?:\\\\_|[^_]|_[^_]*_)+?)__(?!_)/us', + ); + + protected $EmRegex = array( + '*' => '/^[*]((?:\\\\\*|[^*]|[*][*][^*]+?[*][*])+?)[*](?![*])/s', + '_' => '/^_((?:\\\\_|[^_]|__[^_]*__)+?)_(?!_)\b/us', + ); + + protected $regexHtmlAttribute = '[a-zA-Z_:][\w:.-]*(?:\s*=\s*(?:[^"\'=<>`\s]+|"[^"]*"|\'[^\']*\'))?'; + + protected $voidElements = array( + 'area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', + ); + + protected $textLevelElements = array( + 'a', 'br', 'bdo', 'abbr', 'blink', 'nextid', 'acronym', 'basefont', + 'b', 'em', 'big', 'cite', 'small', 'spacer', 'listing', + 'i', 'rp', 'del', 'code', 'strike', 'marquee', + 'q', 'rt', 'ins', 'font', 'strong', + 's', 'tt', 'kbd', 'mark', + 'u', 'xm', 'sub', 'nobr', + 'sup', 'ruby', + 'var', 'span', + 'wbr', 'time', + ); +} diff --git a/vendor/erusev/parsedown/README.md b/vendor/erusev/parsedown/README.md new file mode 100644 index 0000000000..b5d9ed2ee3 --- /dev/null +++ b/vendor/erusev/parsedown/README.md @@ -0,0 +1,86 @@ +> I also make [Caret](https://caret.io?ref=parsedown) - a Markdown editor for Mac and PC. + +## Parsedown + +[![Build Status](https://img.shields.io/travis/erusev/parsedown/master.svg?style=flat-square)](https://travis-ci.org/erusev/parsedown) + + +Better Markdown Parser in PHP + +[Demo](http://parsedown.org/demo) | +[Benchmarks](http://parsedown.org/speed) | +[Tests](http://parsedown.org/tests/) | +[Documentation](https://github.com/erusev/parsedown/wiki/) + +### Features + +* One File +* No Dependencies +* Super Fast +* Extensible +* [GitHub flavored](https://help.github.com/articles/github-flavored-markdown) +* Tested in 5.3 to 7.1 and in HHVM +* [Markdown Extra extension](https://github.com/erusev/parsedown-extra) + +### Installation + +Include `Parsedown.php` or install [the composer package](https://packagist.org/packages/erusev/parsedown). + +### Example + +``` php +$Parsedown = new Parsedown(); + +echo $Parsedown->text('Hello _Parsedown_!'); # prints:

Hello Parsedown!

+``` + +More examples in [the wiki](https://github.com/erusev/parsedown/wiki/) and in [this video tutorial](http://youtu.be/wYZBY8DEikI). + +### Security + +Parsedown is capable of escaping user-input within the HTML that it generates. Additionally Parsedown will apply sanitisation to additional scripting vectors (such as scripting link destinations) that are introduced by the markdown syntax itself. + +To tell Parsedown that it is processing untrusted user-input, use the following: +```php +$parsedown = new Parsedown; +$parsedown->setSafeMode(true); +``` + +If instead, you wish to allow HTML within untrusted user-input, but still want output to be free from XSS it is recommended that you make use of a HTML sanitiser that allows HTML tags to be whitelisted, like [HTML Purifier](http://htmlpurifier.org/). + +In both cases you should strongly consider employing defence-in-depth measures, like [deploying a Content-Security-Policy](https://scotthelme.co.uk/content-security-policy-an-introduction/) (a browser security feature) so that your page is likely to be safe even if an attacker finds a vulnerability in one of the first lines of defence above. + +#### Security of Parsedown Extensions + +Safe mode does not necessarily yield safe results when using extensions to Parsedown. Extensions should be evaluated on their own to determine their specific safety against XSS. + +### Escaping HTML +> ⚠️  **WARNING:** This method isn't safe from XSS! + +If you wish to escape HTML **in trusted input**, you can use the following: +```php +$parsedown = new Parsedown; +$parsedown->setMarkupEscaped(true); +``` + +Beware that this still allows users to insert unsafe scripting vectors, such as links like `[xss](javascript:alert%281%29)`. + +### Questions + +**How does Parsedown work?** + +It tries to read Markdown like a human. First, it looks at the lines. It’s interested in how the lines start. This helps it recognise blocks. It knows, for example, that if a line starts with a `-` then perhaps it belongs to a list. Once it recognises the blocks, it continues to the content. As it reads, it watches out for special characters. This helps it recognise inline elements (or inlines). + +We call this approach "line based". We believe that Parsedown is the first Markdown parser to use it. Since the release of Parsedown, other developers have used the same approach to develop other Markdown parsers in PHP and in other languages. + +**Is it compliant with CommonMark?** + +It passes most of the CommonMark tests. Most of the tests that don't pass deal with cases that are quite uncommon. Still, as CommonMark matures, compliance should improve. + +**Who uses it?** + +[Laravel Framework](https://laravel.com/), [Bolt CMS](http://bolt.cm/), [Grav CMS](http://getgrav.org/), [Herbie CMS](http://www.getherbie.org/), [Kirby CMS](http://getkirby.com/), [October CMS](http://octobercms.com/), [Pico CMS](http://picocms.org), [Statamic CMS](http://www.statamic.com/), [phpDocumentor](http://www.phpdoc.org/), [RaspberryPi.org](http://www.raspberrypi.org/), [Symfony demo](https://github.com/symfony/symfony-demo) and [more](https://packagist.org/packages/erusev/parsedown/dependents). + +**How can I help?** + +Use it, star it, share it and if you feel generous, [donate](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=528P3NZQMP8N2). diff --git a/vendor/erusev/parsedown/composer.json b/vendor/erusev/parsedown/composer.json new file mode 100644 index 0000000000..f8b40f8ce8 --- /dev/null +++ b/vendor/erusev/parsedown/composer.json @@ -0,0 +1,33 @@ +{ + "name": "erusev/parsedown", + "description": "Parser for Markdown.", + "keywords": ["markdown", "parser"], + "homepage": "http://parsedown.org", + "type": "library", + "license": "MIT", + "authors": [ + { + "name": "Emanuil Rusev", + "email": "hello@erusev.com", + "homepage": "http://erusev.com" + } + ], + "require": { + "php": ">=5.3.0", + "ext-mbstring": "*" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35" + }, + "autoload": { + "psr-0": {"Parsedown": ""} + }, + "autoload-dev": { + "psr-0": { + "TestParsedown": "test/", + "ParsedownTest": "test/", + "CommonMarkTest": "test/", + "CommonMarkTestWeak": "test/" + } + } +} diff --git a/vendor/evenement/evenement/.gitignore b/vendor/evenement/evenement/.gitignore new file mode 100644 index 0000000000..987e2a253c --- /dev/null +++ b/vendor/evenement/evenement/.gitignore @@ -0,0 +1,2 @@ +composer.lock +vendor diff --git a/vendor/evenement/evenement/.travis.yml b/vendor/evenement/evenement/.travis.yml new file mode 100644 index 0000000000..65ba0ced9c --- /dev/null +++ b/vendor/evenement/evenement/.travis.yml @@ -0,0 +1,24 @@ +language: php + +php: + - 7.0 + - 7.1 + - hhvm + - nightly + +matrix: + allow_failures: + - php: hhvm + - php: nightly + +before_script: + - wget http://getcomposer.org/composer.phar + - php composer.phar install + +script: + - ./vendor/bin/phpunit --coverage-text + - php -n examples/benchmark-emit-no-arguments.php + - php -n examples/benchmark-emit-one-argument.php + - php -n examples/benchmark-emit.php + - php -n examples/benchmark-emit-once.php + - php -n examples/benchmark-remove-listener-once.php diff --git a/vendor/evenement/evenement/CHANGELOG.md b/vendor/evenement/evenement/CHANGELOG.md new file mode 100644 index 0000000000..568f2295a5 --- /dev/null +++ b/vendor/evenement/evenement/CHANGELOG.md @@ -0,0 +1,35 @@ +CHANGELOG +========= + + +* v3.0.1 (2017-07-23) + + * Resolved regression introduced in once listeners in v3.0.0 [#49](https://github.com/igorw/evenement/pull/49) + +* v3.0.0 (2017-07-23) + + * Passing null as event name throw exception [#46](https://github.com/igorw/evenement/pull/46), and [#47](https://github.com/igorw/evenement/pull/47) + * Performance improvements [#39](https://github.com/igorw/evenement/pull/39), and [#45](https://github.com/igorw/evenement/pull/45) + * Remove once listeners [#44](https://github.com/igorw/evenement/pull/44), [#45](https://github.com/igorw/evenement/pull/45) + +* v2.1.0 (2017-07-17) + + * Chaining for "on" method [#30](https://github.com/igorw/evenement/pull/30) + * Unit tests (on Travis) improvements [#33](https://github.com/igorw/evenement/pull/33), [#36](https://github.com/igorw/evenement/pull/36), and [#37](https://github.com/igorw/evenement/pull/37) + * Benchmarks added [#35](https://github.com/igorw/evenement/pull/35), and [#40](https://github.com/igorw/evenement/pull/40) + * Minor performance improvements [#42](https://github.com/igorw/evenement/pull/42), and [#38](https://github.com/igorw/evenement/pull/38) + +* v2.0.0 (2012-11-02) + + * Require PHP >=5.4.0 + * Added EventEmitterTrait + * Removed EventEmitter2 + +* v1.1.0 (2017-07-17) + + * Chaining for "on" method [#29](https://github.com/igorw/evenement/pull/29) + * Minor performance improvements [#43](https://github.com/igorw/evenement/pull/43) + +* v1.0.0 (2012-05-30) + + * Inital stable release diff --git a/vendor/evenement/evenement/LICENSE b/vendor/evenement/evenement/LICENSE new file mode 100644 index 0000000000..d9a37d0a04 --- /dev/null +++ b/vendor/evenement/evenement/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2011 Igor Wiedler + +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/evenement/evenement/README.md b/vendor/evenement/evenement/README.md new file mode 100644 index 0000000000..94430119b1 --- /dev/null +++ b/vendor/evenement/evenement/README.md @@ -0,0 +1,83 @@ +# Événement + +Événement is a very simple event dispatching library for PHP. + +It has the same design goals as [Silex](http://silex-project.org) and +[Pimple](http://pimple-project.org), to empower the user while staying concise +and simple. + +It is very strongly inspired by the EventEmitter API found in +[node.js](http://nodejs.org). + +[![Build Status](https://secure.travis-ci.org/igorw/evenement.png?branch=master)](http://travis-ci.org/igorw/evenement) + +## Fetch + +The recommended way to install Événement is [through composer](http://getcomposer.org). + +Just create a composer.json file for your project: + +```JSON +{ + "require": { + "evenement/evenement": "^3.0 || ^2.0" + } +} +``` + +**Note:** The `3.x` version of Événement requires PHP 7 and the `2.x` version requires PHP 5.4. If you are +using PHP 5.3, please use the `1.x` version: + +```JSON +{ + "require": { + "evenement/evenement": "^1.0" + } +} +``` + +And run these two commands to install it: + + $ curl -s http://getcomposer.org/installer | php + $ php composer.phar install + +Now you can add the autoloader, and you will have access to the library: + +```php +on('user.created', function (User $user) use ($logger) { + $logger->log(sprintf("User '%s' was created.", $user->getLogin())); +}); +``` + +### Emitting Events + +```php +emit('user.created', [$user]); +``` + +Tests +----- + + $ ./vendor/bin/phpunit + +License +------- +MIT, see LICENSE. diff --git a/vendor/evenement/evenement/composer.json b/vendor/evenement/evenement/composer.json new file mode 100644 index 0000000000..cbb4827b69 --- /dev/null +++ b/vendor/evenement/evenement/composer.json @@ -0,0 +1,29 @@ +{ + "name": "evenement/evenement", + "description": "Événement is a very simple event dispatching library for PHP", + "keywords": ["event-dispatcher", "event-emitter"], + "license": "MIT", + "authors": [ + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + } + ], + "require": { + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "autoload": { + "psr-0": { + "Evenement": "src" + } + }, + "autoload-dev": { + "psr-0": { + "Evenement": "tests" + }, + "files": ["tests/Evenement/Tests/functions.php"] + } +} diff --git a/vendor/evenement/evenement/doc/00-intro.md b/vendor/evenement/evenement/doc/00-intro.md new file mode 100644 index 0000000000..6c28a2ab2c --- /dev/null +++ b/vendor/evenement/evenement/doc/00-intro.md @@ -0,0 +1,28 @@ +# Introduction + +Événement is is French and means "event". The événement library aims to +provide a simple way of subscribing to events and notifying those subscribers +whenever an event occurs. + +The API that it exposes is almost a direct port of the EventEmitter API found +in node.js. It also includes an "EventEmitter". There are some minor +differences however. + +The EventEmitter is an implementation of the publish-subscribe pattern, which +is a generalized version of the observer pattern. The observer pattern +specifies an observable subject, which observers can register themselves to. +Once something interesting happens, the subject notifies its observers. + +Pub/sub takes the same idea but encapsulates the observation logic inside a +separate object which manages all of its subscribers or listeners. Subscribers +are bound to an event name, and will only receive notifications of the events +they subscribed to. + +**TLDR: What does evenement do, in short? It provides a mapping from event +names to a list of listener functions and triggers each listener for a given +event when it is emitted.** + +Why do we do this, you ask? To achieve decoupling. + +It allows you to design a system where the core will emit events, and modules +are able to subscribe to these events. And respond to them. diff --git a/vendor/evenement/evenement/doc/01-api.md b/vendor/evenement/evenement/doc/01-api.md new file mode 100644 index 0000000000..17ba333ecc --- /dev/null +++ b/vendor/evenement/evenement/doc/01-api.md @@ -0,0 +1,91 @@ +# API + +The API that événement exposes is defined by the +`Evenement\EventEmitterInterface`. The interface is useful if you want to +define an interface that extends the emitter and implicitly defines certain +events to be emitted, or if you want to type hint an `EventEmitter` to be +passed to a method without coupling to the specific implementation. + +## on($event, callable $listener) + +Allows you to subscribe to an event. + +Example: + +```php +$emitter->on('user.created', function (User $user) use ($logger) { + $logger->log(sprintf("User '%s' was created.", $user->getLogin())); +}); +``` + +Since the listener can be any callable, you could also use an instance method +instead of the anonymous function: + +```php +$loggerSubscriber = new LoggerSubscriber($logger); +$emitter->on('user.created', array($loggerSubscriber, 'onUserCreated')); +``` + +This has the benefit that listener does not even need to know that the emitter +exists. + +You can also accept more than one parameter for the listener: + +```php +$emitter->on('numbers_added', function ($result, $a, $b) {}); +``` + +## once($event, callable $listener) + +Convenience method that adds a listener which is guaranteed to only be called +once. + +Example: + +```php +$conn->once('connected', function () use ($conn, $data) { + $conn->send($data); +}); +``` + +## emit($event, array $arguments = []) + +Emit an event, which will call all listeners. + +Example: + +```php +$conn->emit('data', [$data]); +``` + +The second argument to emit is an array of listener arguments. This is how you +specify more args: + +```php +$result = $a + $b; +$emitter->emit('numbers_added', [$result, $a, $b]); +``` + +## listeners($event) + +Allows you to inspect the listeners attached to an event. Particularly useful +to check if there are any listeners at all. + +Example: + +```php +$e = new \RuntimeException('Everything is broken!'); +if (0 === count($emitter->listeners('error'))) { + throw $e; +} +``` + +## removeListener($event, callable $listener) + +Remove a specific listener for a specific event. + +## removeAllListeners($event = null) + +Remove all listeners for a specific event or all listeners all together. This +is useful for long-running processes, where you want to remove listeners in +order to allow them to get garbage collected. diff --git a/vendor/evenement/evenement/doc/02-plugin-system.md b/vendor/evenement/evenement/doc/02-plugin-system.md new file mode 100644 index 0000000000..6a08371931 --- /dev/null +++ b/vendor/evenement/evenement/doc/02-plugin-system.md @@ -0,0 +1,155 @@ +# Example: Plugin system + +In this example I will show you how to create a generic plugin system with +événement where plugins can alter the behaviour of the app. The app is a blog. +Boring, I know. By using the EventEmitter it will be easy to extend this blog +with additional functionality without modifying the core system. + +The blog is quite basic. Users are able to create blog posts when they log in. +The users are stored in a static config file, so there is no sign up process. +Once logged in they get a "new post" link which gives them a form where they +can create a new blog post with plain HTML. That will store the post in a +document database. The index lists all blog post titles by date descending. +Clicking on the post title will take you to the full post. + +## Plugin structure + +The goal of the plugin system is to allow features to be added to the blog +without modifying any core files of the blog. + +The plugins are managed through a config file, `plugins.json`. This JSON file +contains a JSON-encoded list of class-names for plugin classes. This allows +you to enable and disable plugins in a central location. The initial +`plugins.json` is just an empty array: +```json +[] +``` + +A plugin class must implement the `PluginInterface`: +```php +interface PluginInterface +{ + function attachEvents(EventEmitterInterface $emitter); +} +``` + +The `attachEvents` method allows the plugin to attach any events to the +emitter. For example: +```php +class FooPlugin implements PluginInterface +{ + public function attachEvents(EventEmitterInterface $emitter) + { + $emitter->on('foo', function () { + echo 'bar!'; + }); + } +} +``` + +The blog system creates an emitter instance and loads the plugins: +```php +$emitter = new EventEmitter(); + +$pluginClasses = json_decode(file_get_contents('plugins.json'), true); +foreach ($pluginClasses as $pluginClass) { + $plugin = new $pluginClass(); + $pluginClass->attachEvents($emitter); +} +``` + +This is the base system. There are no plugins yet, and there are no events yet +either. That's because I don't know which extension points will be needed. I +will add them on demand. + +## Feature: Markdown + +Writing blog posts in HTML sucks! Wouldn't it be great if I could write them +in a nice format such as markdown, and have that be converted to HTML for me? + +This feature will need two extension points. I need to be able to mark posts +as markdown, and I need to be able to hook into the rendering of the post body +and convert it from markdown to HTML. So the blog needs two new events: +`post.create` and `post.render`. + +In the code that creates the post, I'll insert the `post.create` event: +```php +class PostEvent +{ + public $post; + + public function __construct(array $post) + { + $this->post = $post; + } +} + +$post = createPostFromRequest($_POST); + +$event = new PostEvent($post); +$emitter->emit('post.create', [$event]); +$post = $event->post; + +$db->save('post', $post); +``` + +This shows that you can wrap a value in an event object to make it mutable, +allowing listeners to change it. + +The same thing for the `post.render` event: +```php +public function renderPostBody(array $post) +{ + $emitter = $this->emitter; + + $event = new PostEvent($post); + $emitter->emit('post.render', [$event]); + $post = $event->post; + + return $post['body']; +} + +

+

+``` + +Ok, the events are in place. It's time to create the first plugin, woohoo! I +will call this the `MarkdownPlugin`, so here's `plugins.json`: +```json +[ + "MarkdownPlugin" +] +``` + +The `MarkdownPlugin` class will be autoloaded, so I don't have to worry about +including any files. I just have to worry about implementing the plugin class. +The `markdown` function represents a markdown to HTML converter. +```php +class MarkdownPlugin implements PluginInterface +{ + public function attachEvents(EventEmitterInterface $emitter) + { + $emitter->on('post.create', function (PostEvent $event) { + $event->post['format'] = 'markdown'; + }); + + $emitter->on('post.render', function (PostEvent $event) { + if (isset($event->post['format']) && 'markdown' === $event->post['format']) { + $event->post['body'] = markdown($event->post['body']); + } + }); + } +} +``` + +There you go, the blog now renders posts as markdown. But all of the previous +posts before the addition of the markdown plugin are still rendered correctly +as raw HTML. + +## Feature: Comments + +TODO + +## Feature: Comment spam control + +TODO diff --git a/vendor/evenement/evenement/examples/benchmark-emit-no-arguments.php b/vendor/evenement/evenement/examples/benchmark-emit-no-arguments.php new file mode 100644 index 0000000000..53d7f4b225 --- /dev/null +++ b/vendor/evenement/evenement/examples/benchmark-emit-no-arguments.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +const ITERATIONS = 10000000; + +use Evenement\EventEmitter; + +require __DIR__.'/../vendor/autoload.php'; + +$emitter = new EventEmitter(); + +$emitter->on('event', function () {}); + +$start = microtime(true); +for ($i = 0; $i < ITERATIONS; $i++) { + $emitter->emit('event'); +} +$time = microtime(true) - $start; + +echo 'Emitting ', number_format(ITERATIONS), ' events took: ', number_format($time, 2), 's', PHP_EOL; diff --git a/vendor/evenement/evenement/examples/benchmark-emit-once.php b/vendor/evenement/evenement/examples/benchmark-emit-once.php new file mode 100644 index 0000000000..74f4d1755e --- /dev/null +++ b/vendor/evenement/evenement/examples/benchmark-emit-once.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +ini_set('memory_limit', '512M'); + +const ITERATIONS = 100000; + +use Evenement\EventEmitter; + +require __DIR__.'/../vendor/autoload.php'; + +$emitter = new EventEmitter(); + +for ($i = 0; $i < ITERATIONS; $i++) { + $emitter->once('event', function ($a, $b, $c) {}); +} + +$start = microtime(true); +$emitter->emit('event', [1, 2, 3]); +$time = microtime(true) - $start; + +echo 'Emitting one event to ', number_format(ITERATIONS), ' once listeners took: ', number_format($time, 2), 's', PHP_EOL; diff --git a/vendor/evenement/evenement/examples/benchmark-emit-one-argument.php b/vendor/evenement/evenement/examples/benchmark-emit-one-argument.php new file mode 100644 index 0000000000..39fc4ba09e --- /dev/null +++ b/vendor/evenement/evenement/examples/benchmark-emit-one-argument.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +const ITERATIONS = 10000000; + +use Evenement\EventEmitter; + +require __DIR__.'/../vendor/autoload.php'; + +$emitter = new EventEmitter(); + +$emitter->on('event', function ($a) {}); + +$start = microtime(true); +for ($i = 0; $i < ITERATIONS; $i++) { + $emitter->emit('event', [1]); +} +$time = microtime(true) - $start; + +echo 'Emitting ', number_format(ITERATIONS), ' events took: ', number_format($time, 2), 's', PHP_EOL; diff --git a/vendor/evenement/evenement/examples/benchmark-emit.php b/vendor/evenement/evenement/examples/benchmark-emit.php new file mode 100644 index 0000000000..3ab639e07a --- /dev/null +++ b/vendor/evenement/evenement/examples/benchmark-emit.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +const ITERATIONS = 10000000; + +use Evenement\EventEmitter; + +require __DIR__.'/../vendor/autoload.php'; + +$emitter = new EventEmitter(); + +$emitter->on('event', function ($a, $b, $c) {}); + +$start = microtime(true); +for ($i = 0; $i < ITERATIONS; $i++) { + $emitter->emit('event', [1, 2, 3]); +} +$time = microtime(true) - $start; + +echo 'Emitting ', number_format(ITERATIONS), ' events took: ', number_format($time, 2), 's', PHP_EOL; diff --git a/vendor/evenement/evenement/examples/benchmark-remove-listener-once.php b/vendor/evenement/evenement/examples/benchmark-remove-listener-once.php new file mode 100644 index 0000000000..414be3bd23 --- /dev/null +++ b/vendor/evenement/evenement/examples/benchmark-remove-listener-once.php @@ -0,0 +1,39 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +ini_set('memory_limit', '512M'); + +const ITERATIONS = 100000; + +use Evenement\EventEmitter; + +require __DIR__.'/../vendor/autoload.php'; + +$emitter = new EventEmitter(); + +$listeners = []; +for ($i = 0; $i < ITERATIONS; $i++) { + $listeners[] = function ($a, $b, $c) {}; +} + +$start = microtime(true); +foreach ($listeners as $listener) { + $emitter->once('event', $listener); +} +$time = microtime(true) - $start; +echo 'Adding ', number_format(ITERATIONS), ' once listeners took: ', number_format($time, 2), 's', PHP_EOL; + +$start = microtime(true); +foreach ($listeners as $listener) { + $emitter->removeListener('event', $listener); +} +$time = microtime(true) - $start; +echo 'Removing ', number_format(ITERATIONS), ' once listeners took: ', number_format($time, 2), 's', PHP_EOL; diff --git a/vendor/evenement/evenement/phpunit.xml.dist b/vendor/evenement/evenement/phpunit.xml.dist new file mode 100644 index 0000000000..70bc693a56 --- /dev/null +++ b/vendor/evenement/evenement/phpunit.xml.dist @@ -0,0 +1,24 @@ + + + + + + ./tests/Evenement/ + + + + + + ./src/ + + + diff --git a/vendor/evenement/evenement/src/Evenement/EventEmitter.php b/vendor/evenement/evenement/src/Evenement/EventEmitter.php new file mode 100644 index 0000000000..db189b972b --- /dev/null +++ b/vendor/evenement/evenement/src/Evenement/EventEmitter.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Evenement; + +class EventEmitter implements EventEmitterInterface +{ + use EventEmitterTrait; +} diff --git a/vendor/evenement/evenement/src/Evenement/EventEmitterInterface.php b/vendor/evenement/evenement/src/Evenement/EventEmitterInterface.php new file mode 100644 index 0000000000..310631a104 --- /dev/null +++ b/vendor/evenement/evenement/src/Evenement/EventEmitterInterface.php @@ -0,0 +1,22 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Evenement; + +interface EventEmitterInterface +{ + public function on($event, callable $listener); + public function once($event, callable $listener); + public function removeListener($event, callable $listener); + public function removeAllListeners($event = null); + public function listeners($event = null); + public function emit($event, array $arguments = []); +} diff --git a/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php b/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php new file mode 100644 index 0000000000..a78e65ca51 --- /dev/null +++ b/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php @@ -0,0 +1,135 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Evenement; + +use InvalidArgumentException; + +trait EventEmitterTrait +{ + protected $listeners = []; + protected $onceListeners = []; + + public function on($event, callable $listener) + { + if ($event === null) { + throw new InvalidArgumentException('event name must not be null'); + } + + if (!isset($this->listeners[$event])) { + $this->listeners[$event] = []; + } + + $this->listeners[$event][] = $listener; + + return $this; + } + + public function once($event, callable $listener) + { + if ($event === null) { + throw new InvalidArgumentException('event name must not be null'); + } + + if (!isset($this->onceListeners[$event])) { + $this->onceListeners[$event] = []; + } + + $this->onceListeners[$event][] = $listener; + + return $this; + } + + public function removeListener($event, callable $listener) + { + if ($event === null) { + throw new InvalidArgumentException('event name must not be null'); + } + + if (isset($this->listeners[$event])) { + $index = \array_search($listener, $this->listeners[$event], true); + if (false !== $index) { + unset($this->listeners[$event][$index]); + if (\count($this->listeners[$event]) === 0) { + unset($this->listeners[$event]); + } + } + } + + if (isset($this->onceListeners[$event])) { + $index = \array_search($listener, $this->onceListeners[$event], true); + if (false !== $index) { + unset($this->onceListeners[$event][$index]); + if (\count($this->onceListeners[$event]) === 0) { + unset($this->onceListeners[$event]); + } + } + } + } + + public function removeAllListeners($event = null) + { + if ($event !== null) { + unset($this->listeners[$event]); + } else { + $this->listeners = []; + } + + if ($event !== null) { + unset($this->onceListeners[$event]); + } else { + $this->onceListeners = []; + } + } + + public function listeners($event = null): array + { + if ($event === null) { + $events = []; + $eventNames = \array_unique( + \array_merge(\array_keys($this->listeners), \array_keys($this->onceListeners)) + ); + foreach ($eventNames as $eventName) { + $events[$eventName] = \array_merge( + isset($this->listeners[$eventName]) ? $this->listeners[$eventName] : [], + isset($this->onceListeners[$eventName]) ? $this->onceListeners[$eventName] : [] + ); + } + return $events; + } + + return \array_merge( + isset($this->listeners[$event]) ? $this->listeners[$event] : [], + isset($this->onceListeners[$event]) ? $this->onceListeners[$event] : [] + ); + } + + public function emit($event, array $arguments = []) + { + if ($event === null) { + throw new InvalidArgumentException('event name must not be null'); + } + + if (isset($this->listeners[$event])) { + foreach ($this->listeners[$event] as $listener) { + $listener(...$arguments); + } + } + + if (isset($this->onceListeners[$event])) { + $listeners = $this->onceListeners[$event]; + unset($this->onceListeners[$event]); + foreach ($listeners as $listener) { + $listener(...$arguments); + } + } + } +} diff --git a/vendor/evenement/evenement/tests/Evenement/Tests/EventEmitterTest.php b/vendor/evenement/evenement/tests/Evenement/Tests/EventEmitterTest.php new file mode 100644 index 0000000000..28f3011d67 --- /dev/null +++ b/vendor/evenement/evenement/tests/Evenement/Tests/EventEmitterTest.php @@ -0,0 +1,438 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Evenement\Tests; + +use Evenement\EventEmitter; +use InvalidArgumentException; +use PHPUnit\Framework\TestCase; + +class EventEmitterTest extends TestCase +{ + private $emitter; + + public function setUp() + { + $this->emitter = new EventEmitter(); + } + + public function testAddListenerWithLambda() + { + $this->emitter->on('foo', function () {}); + } + + public function testAddListenerWithMethod() + { + $listener = new Listener(); + $this->emitter->on('foo', [$listener, 'onFoo']); + } + + public function testAddListenerWithStaticMethod() + { + $this->emitter->on('bar', ['Evenement\Tests\Listener', 'onBar']); + } + + public function testAddListenerWithInvalidListener() + { + try { + $this->emitter->on('foo', 'not a callable'); + $this->fail(); + } catch (\Exception $e) { + } catch (\TypeError $e) { + } + } + + public function testOnce() + { + $listenerCalled = 0; + + $this->emitter->once('foo', function () use (&$listenerCalled) { + $listenerCalled++; + }); + + $this->assertSame(0, $listenerCalled); + + $this->emitter->emit('foo'); + + $this->assertSame(1, $listenerCalled); + + $this->emitter->emit('foo'); + + $this->assertSame(1, $listenerCalled); + } + + public function testOnceWithArguments() + { + $capturedArgs = []; + + $this->emitter->once('foo', function ($a, $b) use (&$capturedArgs) { + $capturedArgs = array($a, $b); + }); + + $this->emitter->emit('foo', array('a', 'b')); + + $this->assertSame(array('a', 'b'), $capturedArgs); + } + + public function testEmitWithoutArguments() + { + $listenerCalled = false; + + $this->emitter->on('foo', function () use (&$listenerCalled) { + $listenerCalled = true; + }); + + $this->assertSame(false, $listenerCalled); + $this->emitter->emit('foo'); + $this->assertSame(true, $listenerCalled); + } + + public function testEmitWithOneArgument() + { + $test = $this; + + $listenerCalled = false; + + $this->emitter->on('foo', function ($value) use (&$listenerCalled, $test) { + $listenerCalled = true; + + $test->assertSame('bar', $value); + }); + + $this->assertSame(false, $listenerCalled); + $this->emitter->emit('foo', ['bar']); + $this->assertSame(true, $listenerCalled); + } + + public function testEmitWithTwoArguments() + { + $test = $this; + + $listenerCalled = false; + + $this->emitter->on('foo', function ($arg1, $arg2) use (&$listenerCalled, $test) { + $listenerCalled = true; + + $test->assertSame('bar', $arg1); + $test->assertSame('baz', $arg2); + }); + + $this->assertSame(false, $listenerCalled); + $this->emitter->emit('foo', ['bar', 'baz']); + $this->assertSame(true, $listenerCalled); + } + + public function testEmitWithNoListeners() + { + $this->emitter->emit('foo'); + $this->emitter->emit('foo', ['bar']); + $this->emitter->emit('foo', ['bar', 'baz']); + } + + public function testEmitWithTwoListeners() + { + $listenersCalled = 0; + + $this->emitter->on('foo', function () use (&$listenersCalled) { + $listenersCalled++; + }); + + $this->emitter->on('foo', function () use (&$listenersCalled) { + $listenersCalled++; + }); + + $this->assertSame(0, $listenersCalled); + $this->emitter->emit('foo'); + $this->assertSame(2, $listenersCalled); + } + + public function testRemoveListenerMatching() + { + $listenersCalled = 0; + + $listener = function () use (&$listenersCalled) { + $listenersCalled++; + }; + + $this->emitter->on('foo', $listener); + $this->emitter->removeListener('foo', $listener); + + $this->assertSame(0, $listenersCalled); + $this->emitter->emit('foo'); + $this->assertSame(0, $listenersCalled); + } + + public function testRemoveListenerNotMatching() + { + $listenersCalled = 0; + + $listener = function () use (&$listenersCalled) { + $listenersCalled++; + }; + + $this->emitter->on('foo', $listener); + $this->emitter->removeListener('bar', $listener); + + $this->assertSame(0, $listenersCalled); + $this->emitter->emit('foo'); + $this->assertSame(1, $listenersCalled); + } + + public function testRemoveAllListenersMatching() + { + $listenersCalled = 0; + + $this->emitter->on('foo', function () use (&$listenersCalled) { + $listenersCalled++; + }); + + $this->emitter->removeAllListeners('foo'); + + $this->assertSame(0, $listenersCalled); + $this->emitter->emit('foo'); + $this->assertSame(0, $listenersCalled); + } + + public function testRemoveAllListenersNotMatching() + { + $listenersCalled = 0; + + $this->emitter->on('foo', function () use (&$listenersCalled) { + $listenersCalled++; + }); + + $this->emitter->removeAllListeners('bar'); + + $this->assertSame(0, $listenersCalled); + $this->emitter->emit('foo'); + $this->assertSame(1, $listenersCalled); + } + + public function testRemoveAllListenersWithoutArguments() + { + $listenersCalled = 0; + + $this->emitter->on('foo', function () use (&$listenersCalled) { + $listenersCalled++; + }); + + $this->emitter->on('bar', function () use (&$listenersCalled) { + $listenersCalled++; + }); + + $this->emitter->removeAllListeners(); + + $this->assertSame(0, $listenersCalled); + $this->emitter->emit('foo'); + $this->emitter->emit('bar'); + $this->assertSame(0, $listenersCalled); + } + + public function testCallablesClosure() + { + $calledWith = null; + + $this->emitter->on('foo', function ($data) use (&$calledWith) { + $calledWith = $data; + }); + + $this->emitter->emit('foo', ['bar']); + + self::assertSame('bar', $calledWith); + } + + public function testCallablesClass() + { + $listener = new Listener(); + $this->emitter->on('foo', [$listener, 'onFoo']); + + $this->emitter->emit('foo', ['bar']); + + self::assertSame(['bar'], $listener->getData()); + } + + + public function testCallablesClassInvoke() + { + $listener = new Listener(); + $this->emitter->on('foo', $listener); + + $this->emitter->emit('foo', ['bar']); + + self::assertSame(['bar'], $listener->getMagicData()); + } + + public function testCallablesStaticClass() + { + $this->emitter->on('foo', '\Evenement\Tests\Listener::onBar'); + + $this->emitter->emit('foo', ['bar']); + + self::assertSame(['bar'], Listener::getStaticData()); + } + + public function testCallablesFunction() + { + $this->emitter->on('foo', '\Evenement\Tests\setGlobalTestData'); + + $this->emitter->emit('foo', ['bar']); + + self::assertSame('bar', $GLOBALS['evenement-evenement-test-data']); + + unset($GLOBALS['evenement-evenement-test-data']); + } + + public function testListeners() + { + $onA = function () {}; + $onB = function () {}; + $onC = function () {}; + $onceA = function () {}; + $onceB = function () {}; + $onceC = function () {}; + + self::assertCount(0, $this->emitter->listeners('event')); + $this->emitter->on('event', $onA); + self::assertCount(1, $this->emitter->listeners('event')); + self::assertSame([$onA], $this->emitter->listeners('event')); + $this->emitter->once('event', $onceA); + self::assertCount(2, $this->emitter->listeners('event')); + self::assertSame([$onA, $onceA], $this->emitter->listeners('event')); + $this->emitter->once('event', $onceB); + self::assertCount(3, $this->emitter->listeners('event')); + self::assertSame([$onA, $onceA, $onceB], $this->emitter->listeners('event')); + $this->emitter->on('event', $onB); + self::assertCount(4, $this->emitter->listeners('event')); + self::assertSame([$onA, $onB, $onceA, $onceB], $this->emitter->listeners('event')); + $this->emitter->removeListener('event', $onceA); + self::assertCount(3, $this->emitter->listeners('event')); + self::assertSame([$onA, $onB, $onceB], $this->emitter->listeners('event')); + $this->emitter->once('event', $onceC); + self::assertCount(4, $this->emitter->listeners('event')); + self::assertSame([$onA, $onB, $onceB, $onceC], $this->emitter->listeners('event')); + $this->emitter->on('event', $onC); + self::assertCount(5, $this->emitter->listeners('event')); + self::assertSame([$onA, $onB, $onC, $onceB, $onceC], $this->emitter->listeners('event')); + $this->emitter->once('event', $onceA); + self::assertCount(6, $this->emitter->listeners('event')); + self::assertSame([$onA, $onB, $onC, $onceB, $onceC, $onceA], $this->emitter->listeners('event')); + $this->emitter->removeListener('event', $onB); + self::assertCount(5, $this->emitter->listeners('event')); + self::assertSame([$onA, $onC, $onceB, $onceC, $onceA], $this->emitter->listeners('event')); + $this->emitter->emit('event'); + self::assertCount(2, $this->emitter->listeners('event')); + self::assertSame([$onA, $onC], $this->emitter->listeners('event')); + } + + public function testOnceCallIsNotRemovedWhenWorkingOverOnceListeners() + { + $aCalled = false; + $aCallable = function () use (&$aCalled) { + $aCalled = true; + }; + $bCalled = false; + $bCallable = function () use (&$bCalled, $aCallable) { + $bCalled = true; + $this->emitter->once('event', $aCallable); + }; + $this->emitter->once('event', $bCallable); + + self::assertFalse($aCalled); + self::assertFalse($bCalled); + $this->emitter->emit('event'); + + self::assertFalse($aCalled); + self::assertTrue($bCalled); + $this->emitter->emit('event'); + + self::assertTrue($aCalled); + self::assertTrue($bCalled); + } + + public function testEventNameMustBeStringOn() + { + self::expectException(InvalidArgumentException::class); + self::expectExceptionMessage('event name must not be null'); + + $this->emitter->on(null, function () {}); + } + + public function testEventNameMustBeStringOnce() + { + self::expectException(InvalidArgumentException::class); + self::expectExceptionMessage('event name must not be null'); + + $this->emitter->once(null, function () {}); + } + + public function testEventNameMustBeStringRemoveListener() + { + self::expectException(InvalidArgumentException::class); + self::expectExceptionMessage('event name must not be null'); + + $this->emitter->removeListener(null, function () {}); + } + + public function testEventNameMustBeStringEmit() + { + self::expectException(InvalidArgumentException::class); + self::expectExceptionMessage('event name must not be null'); + + $this->emitter->emit(null); + } + + public function testListenersGetAll() + { + $a = function () {}; + $b = function () {}; + $c = function () {}; + $d = function () {}; + + $this->emitter->once('event2', $c); + $this->emitter->on('event', $a); + $this->emitter->once('event', $b); + $this->emitter->on('event', $c); + $this->emitter->once('event', $d); + + self::assertSame( + [ + 'event' => [ + $a, + $c, + $b, + $d, + ], + 'event2' => [ + $c, + ], + ], + $this->emitter->listeners() + ); + } + + public function testOnceNestedCallRegression() + { + $first = 0; + $second = 0; + + $this->emitter->once('event', function () use (&$first, &$second) { + $first++; + $this->emitter->once('event', function () use (&$second) { + $second++; + }); + $this->emitter->emit('event'); + }); + $this->emitter->emit('event'); + + self::assertSame(1, $first); + self::assertSame(1, $second); + } +} diff --git a/vendor/evenement/evenement/tests/Evenement/Tests/Listener.php b/vendor/evenement/evenement/tests/Evenement/Tests/Listener.php new file mode 100644 index 0000000000..df17424656 --- /dev/null +++ b/vendor/evenement/evenement/tests/Evenement/Tests/Listener.php @@ -0,0 +1,51 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Evenement\Tests; + +class Listener +{ + private $data = []; + + private $magicData = []; + + private static $staticData = []; + + public function onFoo($data) + { + $this->data[] = $data; + } + + public function __invoke($data) + { + $this->magicData[] = $data; + } + + public static function onBar($data) + { + self::$staticData[] = $data; + } + + public function getData() + { + return $this->data; + } + + public function getMagicData() + { + return $this->magicData; + } + + public static function getStaticData() + { + return self::$staticData; + } +} diff --git a/vendor/evenement/evenement/tests/Evenement/Tests/functions.php b/vendor/evenement/evenement/tests/Evenement/Tests/functions.php new file mode 100644 index 0000000000..7f11f5ba92 --- /dev/null +++ b/vendor/evenement/evenement/tests/Evenement/Tests/functions.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Evenement\Tests; + +function setGlobalTestData($data) +{ + $GLOBALS['evenement-evenement-test-data'] = $data; +} diff --git a/vendor/jakub-onderka/php-console-color/.gitignore b/vendor/jakub-onderka/php-console-color/.gitignore new file mode 100644 index 0000000000..05ab16b84f --- /dev/null +++ b/vendor/jakub-onderka/php-console-color/.gitignore @@ -0,0 +1,3 @@ +build +vendor +composer.lock diff --git a/vendor/jakub-onderka/php-console-color/.travis.yml b/vendor/jakub-onderka/php-console-color/.travis.yml new file mode 100644 index 0000000000..49175a9969 --- /dev/null +++ b/vendor/jakub-onderka/php-console-color/.travis.yml @@ -0,0 +1,24 @@ +language: php + +php: + - 5.4 + - 5.5 + - 5.6 + - 7.0 + - 7.1 + - 7.2 + +sudo: false + +cache: + directories: + - vendor + - $HOME/.composer/cache + +before_script: + - composer install --no-interaction --prefer-source + +script: + - ant phplint + - ant phpcs + - ant phpunit diff --git a/vendor/jakub-onderka/php-console-color/LICENSE b/vendor/jakub-onderka/php-console-color/LICENSE new file mode 100644 index 0000000000..0954fc941f --- /dev/null +++ b/vendor/jakub-onderka/php-console-color/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2014-2018, Jakub Onderka +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. + +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 HOLDER 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/jakub-onderka/php-console-color/README.md b/vendor/jakub-onderka/php-console-color/README.md new file mode 100644 index 0000000000..39e55d9255 --- /dev/null +++ b/vendor/jakub-onderka/php-console-color/README.md @@ -0,0 +1,10 @@ +PHP Console Color +================= + +[![Build Status](https://travis-ci.org/JakubOnderka/PHP-Console-Color.svg?branch=master)](https://travis-ci.org/JakubOnderka/PHP-Console-Color) + +Simple library for creating colored console ouput. + +See `example.php` how to use this library. + +![Example from Windows 10](https://user-images.githubusercontent.com/89590/40762008-687f909a-646c-11e8-88d6-e268a064be4c.png) \ No newline at end of file diff --git a/vendor/jakub-onderka/php-console-color/build.xml b/vendor/jakub-onderka/php-console-color/build.xml new file mode 100644 index 0000000000..bb4ba66d8f --- /dev/null +++ b/vendor/jakub-onderka/php-console-color/build.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vendor/jakub-onderka/php-console-color/composer.json b/vendor/jakub-onderka/php-console-color/composer.json new file mode 100644 index 0000000000..6481cb51d0 --- /dev/null +++ b/vendor/jakub-onderka/php-console-color/composer.json @@ -0,0 +1,23 @@ +{ + "name": "jakub-onderka/php-console-color", + "license": "BSD-2-Clause", + "authors": [ + { + "name": "Jakub Onderka", + "email": "jakub.onderka@gmail.com" + } + ], + "autoload": { + "psr-4": {"JakubOnderka\\PhpConsoleColor\\": "src/"} + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.3", + "jakub-onderka/php-parallel-lint": "1.0", + "jakub-onderka/php-var-dump-check": "0.*", + "squizlabs/php_codesniffer": "1.*", + "jakub-onderka/php-code-style": "1.0" + } +} diff --git a/vendor/jakub-onderka/php-console-color/example.php b/vendor/jakub-onderka/php-console-color/example.php new file mode 100644 index 0000000000..5e698a24ec --- /dev/null +++ b/vendor/jakub-onderka/php-console-color/example.php @@ -0,0 +1,38 @@ +isSupported() ? 'Yes' : 'No') . "\n"; +echo "256 colors are supported: " . ($consoleColor->are256ColorsSupported() ? 'Yes' : 'No') . "\n\n"; + +if ($consoleColor->isSupported()) { + foreach ($consoleColor->getPossibleStyles() as $style) { + echo $consoleColor->apply($style, $style) . "\n"; + } +} + +echo "\n"; + +if ($consoleColor->are256ColorsSupported()) { + echo "Foreground colors:\n"; + for ($i = 1; $i <= 255; $i++) { + echo $consoleColor->apply("color_$i", str_pad($i, 6, ' ', STR_PAD_BOTH)); + + if ($i % 15 === 0) { + echo "\n"; + } + } + + echo "\nBackground colors:\n"; + + for ($i = 1; $i <= 255; $i++) { + echo $consoleColor->apply("bg_color_$i", str_pad($i, 6, ' ', STR_PAD_BOTH)); + + if ($i % 15 === 0) { + echo "\n"; + } + } + + echo "\n"; +} diff --git a/vendor/jakub-onderka/php-console-color/phpunit.xml b/vendor/jakub-onderka/php-console-color/phpunit.xml new file mode 100644 index 0000000000..f1105cc4e2 --- /dev/null +++ b/vendor/jakub-onderka/php-console-color/phpunit.xml @@ -0,0 +1,16 @@ + + + + + tests + + + + + + + vendor + + + diff --git a/vendor/jakub-onderka/php-console-color/src/ConsoleColor.php b/vendor/jakub-onderka/php-console-color/src/ConsoleColor.php new file mode 100644 index 0000000000..90fd125286 --- /dev/null +++ b/vendor/jakub-onderka/php-console-color/src/ConsoleColor.php @@ -0,0 +1,287 @@ + null, + 'bold' => '1', + 'dark' => '2', + 'italic' => '3', + 'underline' => '4', + 'blink' => '5', + 'reverse' => '7', + 'concealed' => '8', + + 'default' => '39', + 'black' => '30', + 'red' => '31', + 'green' => '32', + 'yellow' => '33', + 'blue' => '34', + 'magenta' => '35', + 'cyan' => '36', + 'light_gray' => '37', + + 'dark_gray' => '90', + 'light_red' => '91', + 'light_green' => '92', + 'light_yellow' => '93', + 'light_blue' => '94', + 'light_magenta' => '95', + 'light_cyan' => '96', + 'white' => '97', + + 'bg_default' => '49', + 'bg_black' => '40', + 'bg_red' => '41', + 'bg_green' => '42', + 'bg_yellow' => '43', + 'bg_blue' => '44', + 'bg_magenta' => '45', + 'bg_cyan' => '46', + 'bg_light_gray' => '47', + + 'bg_dark_gray' => '100', + 'bg_light_red' => '101', + 'bg_light_green' => '102', + 'bg_light_yellow' => '103', + 'bg_light_blue' => '104', + 'bg_light_magenta' => '105', + 'bg_light_cyan' => '106', + 'bg_white' => '107', + ); + + /** @var array */ + private $themes = array(); + + public function __construct() + { + $this->isSupported = $this->isSupported(); + } + + /** + * @param string|array $style + * @param string $text + * @return string + * @throws InvalidStyleException + * @throws \InvalidArgumentException + */ + public function apply($style, $text) + { + if (!$this->isStyleForced() && !$this->isSupported()) { + return $text; + } + + if (is_string($style)) { + $style = array($style); + } + if (!is_array($style)) { + throw new \InvalidArgumentException("Style must be string or array."); + } + + $sequences = array(); + + foreach ($style as $s) { + if (isset($this->themes[$s])) { + $sequences = array_merge($sequences, $this->themeSequence($s)); + } else if ($this->isValidStyle($s)) { + $sequences[] = $this->styleSequence($s); + } else { + throw new InvalidStyleException($s); + } + } + + $sequences = array_filter($sequences, function ($val) { + return $val !== null; + }); + + if (empty($sequences)) { + return $text; + } + + return $this->escSequence(implode(';', $sequences)) . $text . $this->escSequence(self::RESET_STYLE); + } + + /** + * @param bool $forceStyle + */ + public function setForceStyle($forceStyle) + { + $this->forceStyle = (bool) $forceStyle; + } + + /** + * @return bool + */ + public function isStyleForced() + { + return $this->forceStyle; + } + + /** + * @param array $themes + * @throws InvalidStyleException + * @throws \InvalidArgumentException + */ + public function setThemes(array $themes) + { + $this->themes = array(); + foreach ($themes as $name => $styles) { + $this->addTheme($name, $styles); + } + } + + /** + * @param string $name + * @param array|string $styles + * @throws \InvalidArgumentException + * @throws InvalidStyleException + */ + public function addTheme($name, $styles) + { + if (is_string($styles)) { + $styles = array($styles); + } + if (!is_array($styles)) { + throw new \InvalidArgumentException("Style must be string or array."); + } + + foreach ($styles as $style) { + if (!$this->isValidStyle($style)) { + throw new InvalidStyleException($style); + } + } + + $this->themes[$name] = $styles; + } + + /** + * @return array + */ + public function getThemes() + { + return $this->themes; + } + + /** + * @param string $name + * @return bool + */ + public function hasTheme($name) + { + return isset($this->themes[$name]); + } + + /** + * @param string $name + */ + public function removeTheme($name) + { + unset($this->themes[$name]); + } + + /** + * @return bool + */ + public function isSupported() + { + if (DIRECTORY_SEPARATOR === '\\') { + if (function_exists('sapi_windows_vt100_support') && @sapi_windows_vt100_support(STDOUT)) { + return true; + } elseif (getenv('ANSICON') !== false || getenv('ConEmuANSI') === 'ON') { + return true; + } + return false; + } else { + return function_exists('posix_isatty') && @posix_isatty(STDOUT); + } + } + + /** + * @return bool + */ + public function are256ColorsSupported() + { + if (DIRECTORY_SEPARATOR === '\\') { + return function_exists('sapi_windows_vt100_support') && @sapi_windows_vt100_support(STDOUT); + } else { + return strpos(getenv('TERM'), '256color') !== false; + } + } + + /** + * @return array + */ + public function getPossibleStyles() + { + return array_keys($this->styles); + } + + /** + * @param string $name + * @return string[] + */ + private function themeSequence($name) + { + $sequences = array(); + foreach ($this->themes[$name] as $style) { + $sequences[] = $this->styleSequence($style); + } + return $sequences; + } + + /** + * @param string $style + * @return string + */ + private function styleSequence($style) + { + if (array_key_exists($style, $this->styles)) { + return $this->styles[$style]; + } + + if (!$this->are256ColorsSupported()) { + return null; + } + + preg_match(self::COLOR256_REGEXP, $style, $matches); + + $type = $matches[1] === 'bg_' ? self::BACKGROUND : self::FOREGROUND; + $value = $matches[2]; + + return "$type;5;$value"; + } + + /** + * @param string $style + * @return bool + */ + private function isValidStyle($style) + { + return array_key_exists($style, $this->styles) || preg_match(self::COLOR256_REGEXP, $style); + } + + /** + * @param string|int $value + * @return string + */ + private function escSequence($value) + { + return "\033[{$value}m"; + } +} diff --git a/vendor/jakub-onderka/php-console-color/src/InvalidStyleException.php b/vendor/jakub-onderka/php-console-color/src/InvalidStyleException.php new file mode 100644 index 0000000000..6f1586f62e --- /dev/null +++ b/vendor/jakub-onderka/php-console-color/src/InvalidStyleException.php @@ -0,0 +1,10 @@ +isSupportedForce = $isSupported; + } + + public function isSupported() + { + return $this->isSupportedForce; + } + + public function setAre256ColorsSupported($are256ColorsSupported) + { + $this->are256ColorsSupportedForce = $are256ColorsSupported; + } + + public function are256ColorsSupported() + { + return $this->are256ColorsSupportedForce; + } +} + +class ConsoleColorTest extends \PHPUnit_Framework_TestCase +{ + /** @var ConsoleColorWithForceSupport */ + private $uut; + + protected function setUp() + { + $this->uut = new ConsoleColorWithForceSupport(); + } + + public function testNone() + { + $output = $this->uut->apply('none', 'text'); + $this->assertEquals("text", $output); + } + + public function testBold() + { + $output = $this->uut->apply('bold', 'text'); + $this->assertEquals("\033[1mtext\033[0m", $output); + } + + public function testBoldColorsAreNotSupported() + { + $this->uut->setIsSupported(false); + + $output = $this->uut->apply('bold', 'text'); + $this->assertEquals("text", $output); + } + + public function testBoldColorsAreNotSupportedButAreForced() + { + $this->uut->setIsSupported(false); + $this->uut->setForceStyle(true); + + $output = $this->uut->apply('bold', 'text'); + $this->assertEquals("\033[1mtext\033[0m", $output); + } + + public function testDark() + { + $output = $this->uut->apply('dark', 'text'); + $this->assertEquals("\033[2mtext\033[0m", $output); + } + + public function testBoldAndDark() + { + $output = $this->uut->apply(array('bold', 'dark'), 'text'); + $this->assertEquals("\033[1;2mtext\033[0m", $output); + } + + public function test256ColorForeground() + { + $output = $this->uut->apply('color_255', 'text'); + $this->assertEquals("\033[38;5;255mtext\033[0m", $output); + } + + public function test256ColorWithoutSupport() + { + $this->uut->setAre256ColorsSupported(false); + + $output = $this->uut->apply('color_255', 'text'); + $this->assertEquals("text", $output); + } + + public function test256ColorBackground() + { + $output = $this->uut->apply('bg_color_255', 'text'); + $this->assertEquals("\033[48;5;255mtext\033[0m", $output); + } + + public function test256ColorForegroundAndBackground() + { + $output = $this->uut->apply(array('color_200', 'bg_color_255'), 'text'); + $this->assertEquals("\033[38;5;200;48;5;255mtext\033[0m", $output); + } + + public function testSetOwnTheme() + { + $this->uut->setThemes(array('bold_dark' => array('bold', 'dark'))); + $output = $this->uut->apply(array('bold_dark'), 'text'); + $this->assertEquals("\033[1;2mtext\033[0m", $output); + } + + public function testAddOwnTheme() + { + $this->uut->addTheme('bold_own', 'bold'); + $output = $this->uut->apply(array('bold_own'), 'text'); + $this->assertEquals("\033[1mtext\033[0m", $output); + } + + public function testAddOwnThemeArray() + { + $this->uut->addTheme('bold_dark', array('bold', 'dark')); + $output = $this->uut->apply(array('bold_dark'), 'text'); + $this->assertEquals("\033[1;2mtext\033[0m", $output); + } + + public function testOwnWithStyle() + { + $this->uut->addTheme('bold_dark', array('bold', 'dark')); + $output = $this->uut->apply(array('bold_dark', 'italic'), 'text'); + $this->assertEquals("\033[1;2;3mtext\033[0m", $output); + } + + public function testHasAndRemoveTheme() + { + $this->assertFalse($this->uut->hasTheme('bold_dark')); + + $this->uut->addTheme('bold_dark', array('bold', 'dark')); + $this->assertTrue($this->uut->hasTheme('bold_dark')); + + $this->uut->removeTheme('bold_dark'); + $this->assertFalse($this->uut->hasTheme('bold_dark')); + } + + public function testApplyInvalidArgument() + { + $this->setExpectedException('\InvalidArgumentException'); + $this->uut->apply(new stdClass(), 'text'); + } + + public function testApplyInvalidStyleName() + { + $this->setExpectedException('\JakubOnderka\PhpConsoleColor\InvalidStyleException'); + $this->uut->apply('invalid', 'text'); + } + + public function testApplyInvalid256Color() + { + $this->setExpectedException('\JakubOnderka\PhpConsoleColor\InvalidStyleException'); + $this->uut->apply('color_2134', 'text'); + } + + public function testThemeInvalidStyle() + { + $this->setExpectedException('\JakubOnderka\PhpConsoleColor\InvalidStyleException'); + $this->uut->addTheme('invalid', array('invalid')); + } + + public function testForceStyle() + { + $this->assertFalse($this->uut->isStyleForced()); + $this->uut->setForceStyle(true); + $this->assertTrue($this->uut->isStyleForced()); + } + + public function testGetPossibleStyles() + { + $this->assertInternalType('array', $this->uut->getPossibleStyles()); + $this->assertNotEmpty($this->uut->getPossibleStyles()); + } +} + diff --git a/vendor/jakub-onderka/php-console-highlighter/.gitignore b/vendor/jakub-onderka/php-console-highlighter/.gitignore new file mode 100644 index 0000000000..70f6ec0695 --- /dev/null +++ b/vendor/jakub-onderka/php-console-highlighter/.gitignore @@ -0,0 +1,4 @@ +/.idea/ +/build/ +/vendor/ +/composer.lock \ No newline at end of file diff --git a/vendor/jakub-onderka/php-console-highlighter/.travis.yml b/vendor/jakub-onderka/php-console-highlighter/.travis.yml new file mode 100644 index 0000000000..c88c4ec9d4 --- /dev/null +++ b/vendor/jakub-onderka/php-console-highlighter/.travis.yml @@ -0,0 +1,22 @@ +language: php + +php: + - 5.4 + - 5.5 + - 5.6 + - 7.0 + - 7.1 + - 7.2 + +sudo: false + +cache: + directories: + - vendor + - $HOME/.composer/cache + +before_script: + - composer install --no-interaction --prefer-source + +script: + - ant diff --git a/vendor/jakub-onderka/php-console-highlighter/LICENSE b/vendor/jakub-onderka/php-console-highlighter/LICENSE new file mode 100644 index 0000000000..1a8317fa15 --- /dev/null +++ b/vendor/jakub-onderka/php-console-highlighter/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013 Jakub Onderka + +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. \ No newline at end of file diff --git a/vendor/jakub-onderka/php-console-highlighter/README.md b/vendor/jakub-onderka/php-console-highlighter/README.md new file mode 100644 index 0000000000..1ef3d1340d --- /dev/null +++ b/vendor/jakub-onderka/php-console-highlighter/README.md @@ -0,0 +1,42 @@ +PHP Console Highlighter +======================= + +Highlight PHP code in console (terminal). + +Example +------- +![Example](http://jakubonderka.github.io/php-console-highlight-example.png) + +Install +------- + +Just create a `composer.json` file and run the `php composer.phar install` command to install it: + +```json +{ + "require": { + "jakub-onderka/php-console-highlighter": "0.*" + } +} +``` + +Usage +------- +```php +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/build.xml b/vendor/jakub-onderka/php-console-highlighter/build.xml new file mode 100644 index 0000000000..d656ea9d4b --- /dev/null +++ b/vendor/jakub-onderka/php-console-highlighter/build.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vendor/jakub-onderka/php-console-highlighter/composer.json b/vendor/jakub-onderka/php-console-highlighter/composer.json new file mode 100644 index 0000000000..21c29f710a --- /dev/null +++ b/vendor/jakub-onderka/php-console-highlighter/composer.json @@ -0,0 +1,28 @@ +{ + "name": "jakub-onderka/php-console-highlighter", + "description": "Highlight PHP code in terminal", + "type": "library", + "license": "MIT", + "authors": [ + { + "name": "Jakub Onderka", + "email": "acci@acci.cz", + "homepage": "http://www.acci.cz/" + } + ], + "autoload": { + "psr-4": {"JakubOnderka\\PhpConsoleHighlighter\\": "src/"} + }, + "require": { + "php": ">=5.4.0", + "ext-tokenizer": "*", + "jakub-onderka/php-console-color": "~0.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.0", + "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/examples/snippet.php b/vendor/jakub-onderka/php-console-highlighter/examples/snippet.php new file mode 100644 index 0000000000..1bf6ac3bd7 --- /dev/null +++ b/vendor/jakub-onderka/php-console-highlighter/examples/snippet.php @@ -0,0 +1,10 @@ +getCodeSnippet($fileContent, 3); \ No newline at end of file diff --git a/vendor/jakub-onderka/php-console-highlighter/examples/whole_file.php b/vendor/jakub-onderka/php-console-highlighter/examples/whole_file.php new file mode 100644 index 0000000000..2a023d80ab --- /dev/null +++ b/vendor/jakub-onderka/php-console-highlighter/examples/whole_file.php @@ -0,0 +1,10 @@ +getWholeFile($fileContent); \ No newline at end of file diff --git a/vendor/jakub-onderka/php-console-highlighter/examples/whole_file_line_numbers.php b/vendor/jakub-onderka/php-console-highlighter/examples/whole_file_line_numbers.php new file mode 100644 index 0000000000..f9178f2d13 --- /dev/null +++ b/vendor/jakub-onderka/php-console-highlighter/examples/whole_file_line_numbers.php @@ -0,0 +1,10 @@ +getWholeFileWithLineNumbers($fileContent); \ No newline at end of file diff --git a/vendor/jakub-onderka/php-console-highlighter/phpunit.xml b/vendor/jakub-onderka/php-console-highlighter/phpunit.xml new file mode 100644 index 0000000000..9c653a680a --- /dev/null +++ b/vendor/jakub-onderka/php-console-highlighter/phpunit.xml @@ -0,0 +1,15 @@ + + + + + tests + + + + + + + vendor + + + diff --git a/vendor/jakub-onderka/php-console-highlighter/src/Highlighter.php b/vendor/jakub-onderka/php-console-highlighter/src/Highlighter.php new file mode 100644 index 0000000000..47ce30d2c0 --- /dev/null +++ b/vendor/jakub-onderka/php-console-highlighter/src/Highlighter.php @@ -0,0 +1,263 @@ + 'red', + self::TOKEN_COMMENT => 'yellow', + self::TOKEN_KEYWORD => 'green', + self::TOKEN_DEFAULT => 'default', + self::TOKEN_HTML => 'cyan', + + self::ACTUAL_LINE_MARK => 'red', + self::LINE_NUMBER => 'dark_gray', + ); + + /** + * @param ConsoleColor $color + * @throws \JakubOnderka\PhpConsoleColor\InvalidStyleException + */ + public function __construct(ConsoleColor $color) + { + $this->color = $color; + + foreach ($this->defaultTheme as $name => $styles) { + if (!$this->color->hasTheme($name)) { + $this->color->addTheme($name, $styles); + } + } + } + + /** + * @param string $source + * @param int $lineNumber + * @param int $linesBefore + * @param int $linesAfter + * @return string + * @throws \JakubOnderka\PhpConsoleColor\InvalidStyleException + * @throws \InvalidArgumentException + */ + public function getCodeSnippet($source, $lineNumber, $linesBefore = 2, $linesAfter = 2) + { + $tokenLines = $this->getHighlightedLines($source); + + $offset = $lineNumber - $linesBefore - 1; + $offset = max($offset, 0); + $length = $linesAfter + $linesBefore + 1; + $tokenLines = array_slice($tokenLines, $offset, $length, $preserveKeys = true); + + $lines = $this->colorLines($tokenLines); + + return $this->lineNumbers($lines, $lineNumber); + } + + /** + * @param string $source + * @return string + * @throws \JakubOnderka\PhpConsoleColor\InvalidStyleException + * @throws \InvalidArgumentException + */ + public function getWholeFile($source) + { + $tokenLines = $this->getHighlightedLines($source); + $lines = $this->colorLines($tokenLines); + return implode(PHP_EOL, $lines); + } + + /** + * @param string $source + * @return string + * @throws \JakubOnderka\PhpConsoleColor\InvalidStyleException + * @throws \InvalidArgumentException + */ + public function getWholeFileWithLineNumbers($source) + { + $tokenLines = $this->getHighlightedLines($source); + $lines = $this->colorLines($tokenLines); + return $this->lineNumbers($lines); + } + + /** + * @param string $source + * @return array + */ + private function getHighlightedLines($source) + { + $source = str_replace(array("\r\n", "\r"), "\n", $source); + $tokens = $this->tokenize($source); + return $this->splitToLines($tokens); + } + + /** + * @param string $source + * @return array + */ + private function tokenize($source) + { + $tokens = token_get_all($source); + + $output = array(); + $currentType = null; + $buffer = ''; + + foreach ($tokens as $token) { + if (is_array($token)) { + switch ($token[0]) { + case T_WHITESPACE: + break; + + case T_OPEN_TAG: + case T_OPEN_TAG_WITH_ECHO: + case T_CLOSE_TAG: + case T_STRING: + case T_VARIABLE: + + // Constants + case T_DIR: + case T_FILE: + case T_METHOD_C: + case T_DNUMBER: + case T_LNUMBER: + case T_NS_C: + case T_LINE: + case T_CLASS_C: + case T_FUNC_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: + $newType = self::TOKEN_KEYWORD; + } + } else { + $newType = $token === '"' ? self::TOKEN_STRING : self::TOKEN_KEYWORD; + } + + if ($currentType === null) { + $currentType = $newType; + } + + if ($currentType !== $newType) { + $output[] = array($currentType, $buffer); + $buffer = ''; + $currentType = $newType; + } + + $buffer .= is_array($token) ? $token[1] : $token; + } + + if (isset($newType)) { + $output[] = array($newType, $buffer); + } + + return $output; + } + + /** + * @param array $tokens + * @return array + */ + private function splitToLines(array $tokens) + { + $lines = array(); + + $line = array(); + foreach ($tokens as $token) { + foreach (explode("\n", $token[1]) as $count => $tokenLine) { + if ($count > 0) { + $lines[] = $line; + $line = array(); + } + + if ($tokenLine === '') { + continue; + } + + $line[] = array($token[0], $tokenLine); + } + } + + $lines[] = $line; + + return $lines; + } + + /** + * @param array $tokenLines + * @return array + * @throws \JakubOnderka\PhpConsoleColor\InvalidStyleException + * @throws \InvalidArgumentException + */ + private function colorLines(array $tokenLines) + { + $lines = array(); + foreach ($tokenLines as $lineCount => $tokenLine) { + $line = ''; + foreach ($tokenLine as $token) { + list($tokenType, $tokenValue) = $token; + if ($this->color->hasTheme($tokenType)) { + $line .= $this->color->apply($tokenType, $tokenValue); + } else { + $line .= $tokenValue; + } + } + $lines[$lineCount] = $line; + } + + return $lines; + } + + /** + * @param array $lines + * @param null|int $markLine + * @return string + * @throws \JakubOnderka\PhpConsoleColor\InvalidStyleException + */ + private function lineNumbers(array $lines, $markLine = null) + { + end($lines); + $lineStrlen = strlen(key($lines) + 1); + + $snippet = ''; + foreach ($lines as $i => $line) { + if ($markLine !== null) { + $snippet .= ($markLine === $i + 1 ? $this->color->apply(self::ACTUAL_LINE_MARK, ' > ') : ' '); + } + + $snippet .= $this->color->apply(self::LINE_NUMBER, str_pad($i + 1, $lineStrlen, ' ', STR_PAD_LEFT) . '| '); + $snippet .= $line . PHP_EOL; + } + + return $snippet; + } +} \ No newline at end of file diff --git a/vendor/jakub-onderka/php-console-highlighter/tests/HigligterTest.php b/vendor/jakub-onderka/php-console-highlighter/tests/HigligterTest.php new file mode 100644 index 0000000000..187beb67bb --- /dev/null +++ b/vendor/jakub-onderka/php-console-highlighter/tests/HigligterTest.php @@ -0,0 +1,274 @@ +createMock('\JakubOnderka\PhpConsoleColor\ConsoleColor') + : $this->getMock('\JakubOnderka\PhpConsoleColor\ConsoleColor'); + + $mock->expects($this->any()) + ->method('apply') + ->will($this->returnCallback(function ($style, $text) { + return "<$style>$text"; + })); + + $mock->expects($this->any()) + ->method('hasTheme') + ->will($this->returnValue(true)); + + return $mock; + } + + protected function setUp() + { + $this->uut = new Highlighter($this->getConsoleColorMock()); + } + + protected function compare($original, $expected) + { + $output = $this->uut->getWholeFile($original); + $this->assertEquals($expected, $output); + } + + public function testVariable() + { + $this->compare( + << +echo \$a; +EOL + ); + } + + public function testInteger() + { + $this->compare( + << +echo 43; +EOL + ); + } + + public function testFloat() + { + $this->compare( + << +echo 43.3; +EOL + ); + } + + public function testHex() + { + $this->compare( + << +echo 0x43; +EOL + ); + } + + public function testBasicFunction() + { + $this->compare( + << +function plus(\$a, \$b) { + return \$a + \$b; +} +EOL + ); + } + + public function testStringNormal() + { + $this->compare( + << +echo 'Ahoj světe'; +EOL + ); + } + + public function testStringDouble() + { + $this->compare( + << +echo "Ahoj světe"; +EOL + ); + } + + public function testInstanceof() + { + $this->compare( + << +\$a instanceof stdClass; +EOL + ); + } + + /* + * Constants + */ + public function testConstant() + { + $constants = array( + '__FILE__', + '__LINE__', + '__CLASS__', + '__FUNCTION__', + '__METHOD__', + '__TRAIT__', + '__DIR__', + '__NAMESPACE__' + ); + + foreach ($constants as $constant) { + $this->compare( + << +$constant; +EOL + ); + } + } + + /* + * Comments + */ + public function testComment() + { + $this->compare( + << +/* Ahoj */ +EOL + ); + } + + public function testDocComment() + { + $this->compare( + << +/** Ahoj */ +EOL + ); + } + + public function testInlineComment() + { + $this->compare( + << +// Ahoj +EOL + ); + } + + public function testHashComment() + { + $this->compare( + << +# Ahoj +EOL + ); + } + + public function testEmpty() + { + $this->compare( + '' + , + '' + ); + } + + public function testWhitespace() + { + $this->compare( + ' ' + , + ' ' + ); + } +} diff --git a/vendor/jms/metadata/.gitignore b/vendor/jms/metadata/.gitignore new file mode 100644 index 0000000000..5657f6ea7d --- /dev/null +++ b/vendor/jms/metadata/.gitignore @@ -0,0 +1 @@ +vendor \ No newline at end of file diff --git a/vendor/jms/metadata/.travis.yml b/vendor/jms/metadata/.travis.yml new file mode 100644 index 0000000000..9b542925f9 --- /dev/null +++ b/vendor/jms/metadata/.travis.yml @@ -0,0 +1,22 @@ +language: php + +php: + - 5.3 + - 5.4 + - 5.5 + - 5.6 + - hhvm + +matrix: + allow_failures: + - php: hhvm + +before_script: + - composer self-update + - composer install --dev --ignore-platform-reqs + +script: phpunit --coverage-clover clover + +after_success: + - wget https://scrutinizer-ci.com/ocular.phar + - php ocular.phar code-coverage:upload --format=php-clover clover diff --git a/vendor/jms/metadata/CHANGELOG.md b/vendor/jms/metadata/CHANGELOG.md new file mode 100644 index 0000000000..0704927651 --- /dev/null +++ b/vendor/jms/metadata/CHANGELOG.md @@ -0,0 +1,42 @@ +CHANGELOG +========= + +This changelog references all relevant changes: + +* 1.7.0 (2018-10-26) + * allow to run the metadata on read-only file systems + * Change license to MIT + * Composer improvements + +* 1.6.0 (2016-12-05) + * PRS cache adapter + * other fixes + +* 1.5.0 (2013-11-06) + * adds ability to inject new drivers into the DriverChain after it has been constructed + * improves performance by removing some superfluous filesystem calls + * made MetadataFactory implementation non-final + +* 1.4.1 (2013-08-26) + * fixes a possible permission issue when using filesystem ACLs + +* 1.4.0 (2013-08-25) + * fixes a race condition when writing cache files + +* 1.3.0 (2013-01-22) + * added ability to retrieve all managed classes from the metadata factory + +* 1.2.0 (2012-08-21) + * added a Doctrine Cache Adapter + * better support for traits, and classes in the global namespace + +* 1.1.0 (2011-10-04) + + * added support for metadata on interfaces + * added support for non annotation-based drivers + * added support for merging metadata + +This release is fully backwards compatible with the 1.0.0 release. Therefore, +the 1.0.x branch has been discontinued. + +* 1.0.0 (2011-07-09) diff --git a/vendor/jms/metadata/LICENSE b/vendor/jms/metadata/LICENSE new file mode 100644 index 0000000000..9aaf79f1ae --- /dev/null +++ b/vendor/jms/metadata/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2018 Johannes M. Schmitt + +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/jms/metadata/README.rst b/vendor/jms/metadata/README.rst new file mode 100644 index 0000000000..51517ff80f --- /dev/null +++ b/vendor/jms/metadata/README.rst @@ -0,0 +1,37 @@ +Metadata is a library for class/method/property metadata management in PHP +========================================================================== + +Overview +-------- + +This library provides some commonly needed base classes for managing metadata +for classes, methods and properties. The metadata can come from many different +sources (annotations, YAML/XML/PHP configuration files). + +The metadata classes are used to abstract away that source and provide a common +interface for all of them. + +Usage +----- + +The library provides three classes that you can extend to add your application +specific properties, and flags: ``ClassMetadata``, ``MethodMetadata``, and +``PropertyMetadata`` + +After you have added, your properties in sub-classes, you also need to add +``DriverInterface`` implementations which know how to populate these classes +from the different metadata sources. + +Finally, you can use the ``MetadataFactory`` to retrieve the metadata:: + + getMetadataForClass('MyNamespace\MyObject'); + diff --git a/vendor/jms/metadata/composer.json b/vendor/jms/metadata/composer.json new file mode 100644 index 0000000000..b6329d5c92 --- /dev/null +++ b/vendor/jms/metadata/composer.json @@ -0,0 +1,32 @@ +{ + "name": "jms/metadata", + "description": "Class/method/property metadata management in PHP", + "keywords": ["annotations","metadata","yaml","xml"], + "type": "library", + "license": "MIT", + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + } + ], + "require": { + "php": ">=5.3.0" + }, + "require-dev" : { + "doctrine/cache" : "~1.0", + "symfony/cache" : "~3.1" + }, + "autoload": { + "psr-0": { "Metadata\\": "src/" } + }, + "extra": { + "branch-alias": { + "dev-master": "1.5.x-dev" + } + } +} diff --git a/vendor/jms/metadata/composer.lock b/vendor/jms/metadata/composer.lock new file mode 100644 index 0000000000..fe17ee6b46 --- /dev/null +++ b/vendor/jms/metadata/composer.lock @@ -0,0 +1,250 @@ +{ + "_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#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "hash": "4cc1821f9af1271c77bb9a8bebc26138", + "content-hash": "ef7080989caee6eaf6daf11732a5bb86", + "packages": [], + "packages-dev": [ + { + "name": "doctrine/cache", + "version": "v1.6.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "b6f544a20f4807e81f7044d31e679ccbb1866dc3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/b6f544a20f4807e81f7044d31e679ccbb1866dc3", + "reference": "b6f544a20f4807e81f7044d31e679ccbb1866dc3", + "shasum": "" + }, + "require": { + "php": "~5.5|~7.0" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "phpunit/phpunit": "~4.8|~5.0", + "predis/predis": "~1.0", + "satooshi/php-coveralls": "~0.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Caching library offering an object-oriented API for many cache backends", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "cache", + "caching" + ], + "time": "2016-10-29 11:16:17" + }, + { + "name": "psr/cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "time": "2016-08-06 20:24:11" + }, + { + "name": "psr/log", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", + "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2016-10-10 12:19:37" + }, + { + "name": "symfony/cache", + "version": "v3.1.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache.git", + "reference": "0f5881c9b8a03cef13fdee381f8ee623d0429cf4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache/zipball/0f5881c9b8a03cef13fdee381f8ee623d0429cf4", + "reference": "0f5881c9b8a03cef13fdee381f8ee623d0429cf4", + "shasum": "" + }, + "require": { + "php": ">=5.5.9", + "psr/cache": "~1.0", + "psr/log": "~1.0" + }, + "provide": { + "psr/cache-implementation": "1.0" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/cache": "~1.6", + "predis/predis": "~1.0" + }, + "suggest": { + "symfony/polyfill-apcu": "For using ApcuAdapter on HHVM" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Cache\\": "" + }, + "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": "Symfony implementation of PSR-6", + "homepage": "https://symfony.com", + "keywords": [ + "caching", + "psr6" + ], + "time": "2016-11-09 14:09:05" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=5.3.0" + }, + "platform-dev": [] +} diff --git a/vendor/jms/metadata/phpunit.xml.dist b/vendor/jms/metadata/phpunit.xml.dist new file mode 100644 index 0000000000..38db7c3f3c --- /dev/null +++ b/vendor/jms/metadata/phpunit.xml.dist @@ -0,0 +1,25 @@ + + + + + + ./tests/Metadata/ + + + + + + performance + + + diff --git a/vendor/jms/metadata/src/Metadata/AdvancedMetadataFactoryInterface.php b/vendor/jms/metadata/src/Metadata/AdvancedMetadataFactoryInterface.php new file mode 100644 index 0000000000..1c930eb1d2 --- /dev/null +++ b/vendor/jms/metadata/src/Metadata/AdvancedMetadataFactoryInterface.php @@ -0,0 +1,20 @@ + + * @author Jordan Stout + */ +interface AdvancedMetadataFactoryInterface extends MetadataFactoryInterface +{ + /** + * Gets all the possible classes. + * + * @throws \RuntimeException if driver does not an advanced driver. + * @return array + */ + public function getAllClassNames(); +} diff --git a/vendor/jms/metadata/src/Metadata/Cache/CacheInterface.php b/vendor/jms/metadata/src/Metadata/Cache/CacheInterface.php new file mode 100644 index 0000000000..dbf3ccbfab --- /dev/null +++ b/vendor/jms/metadata/src/Metadata/Cache/CacheInterface.php @@ -0,0 +1,35 @@ + + */ +class DoctrineCacheAdapter implements CacheInterface +{ + /** + * @param string $prefix + */ + private $prefix; + + /** + * @var Cache $cache + */ + private $cache; + + /** + * @param string $prefix + * @param Cache $cache + */ + public function __construct($prefix, Cache $cache) + { + $this->prefix = $prefix; + $this->cache = $cache; + } + + /** + * {@inheritDoc} + */ + public function loadClassMetadataFromCache(\ReflectionClass $class) + { + $cache = $this->cache->fetch($this->prefix . $class->name); + return false === $cache ? null : $cache; + } + + /** + * {@inheritDoc} + */ + public function putClassMetadataInCache(ClassMetadata $metadata) + { + $this->cache->save($this->prefix . $metadata->name, $metadata); + } + + /** + * {@inheritDoc} + */ + public function evictClassMetadataFromCache(\ReflectionClass $class) + { + $this->cache->delete($this->prefix . $class->name); + } +} diff --git a/vendor/jms/metadata/src/Metadata/Cache/FileCache.php b/vendor/jms/metadata/src/Metadata/Cache/FileCache.php new file mode 100644 index 0000000000..d454ec19d9 --- /dev/null +++ b/vendor/jms/metadata/src/Metadata/Cache/FileCache.php @@ -0,0 +1,84 @@ +dir = rtrim($dir, '\\/'); + } + + /** + * {@inheritDoc} + */ + public function loadClassMetadataFromCache(\ReflectionClass $class) + { + $path = $this->dir.'/'.strtr($class->name, '\\', '-').'.cache.php'; + if (!file_exists($path)) { + return null; + } + + return include $path; + } + + /** + * {@inheritDoc} + */ + public function putClassMetadataInCache(ClassMetadata $metadata) + { + if (!is_writable($this->dir)) { + throw new \InvalidArgumentException(sprintf('The directory "%s" is not writable.', $this->dir)); + } + + $path = $this->dir.'/'.strtr($metadata->name, '\\', '-').'.cache.php'; + + $tmpFile = tempnam($this->dir, 'metadata-cache'); + file_put_contents($tmpFile, 'renameFile($tmpFile, $path); + } + + /** + * Renames a file with fallback for windows + * + * @param string $source + * @param string $target + */ + private function renameFile($source, $target) { + if (false === @rename($source, $target)) { + if (defined('PHP_WINDOWS_VERSION_BUILD')) { + if (false === copy($source, $target)) { + throw new \RuntimeException(sprintf('(WIN) Could not write new cache file to %s.', $target)); + } + if (false === unlink($source)) { + throw new \RuntimeException(sprintf('(WIN) Could not delete temp cache file to %s.', $source)); + } + } else { + throw new \RuntimeException(sprintf('Could not write new cache file to %s.', $target)); + } + } + } + + /** + * {@inheritDoc} + */ + public function evictClassMetadataFromCache(\ReflectionClass $class) + { + $path = $this->dir.'/'.strtr($class->name, '\\', '-').'.cache.php'; + if (file_exists($path)) { + unlink($path); + } + } +} diff --git a/vendor/jms/metadata/src/Metadata/Cache/PsrCacheAdapter.php b/vendor/jms/metadata/src/Metadata/Cache/PsrCacheAdapter.php new file mode 100644 index 0000000000..9b9bb2f56c --- /dev/null +++ b/vendor/jms/metadata/src/Metadata/Cache/PsrCacheAdapter.php @@ -0,0 +1,51 @@ +prefix = $prefix; + $this->pool = $pool; + } + + /** + * {@inheritDoc} + */ + public function loadClassMetadataFromCache(\ReflectionClass $class) + { + $this->lastItem = $this->pool->getItem(strtr($this->prefix . $class->name, '\\', '.')); + + return $this->lastItem->get(); + } + + /** + * {@inheritDoc} + */ + public function putClassMetadataInCache(ClassMetadata $metadata) + { + $key = strtr($this->prefix . $metadata->name, '\\', '.'); + + if (null === $this->lastItem || $this->lastItem->getKey() !== $key) { + $this->lastItem = $this->pool->getItem($key); + } + + $this->pool->save($this->lastItem->set($metadata)); + } + + /** + * {@inheritDoc} + */ + public function evictClassMetadataFromCache(\ReflectionClass $class) + { + $this->pool->deleteItem(strtr($this->prefix . $class->name, '\\', '.')); + } +} diff --git a/vendor/jms/metadata/src/Metadata/ClassHierarchyMetadata.php b/vendor/jms/metadata/src/Metadata/ClassHierarchyMetadata.php new file mode 100644 index 0000000000..9817641abc --- /dev/null +++ b/vendor/jms/metadata/src/Metadata/ClassHierarchyMetadata.php @@ -0,0 +1,39 @@ + + */ +class ClassHierarchyMetadata +{ + public $classMetadata = array(); + + public function addClassMetadata(ClassMetadata $metadata) + { + $this->classMetadata[$metadata->name] = $metadata; + } + + public function getRootClassMetadata() + { + return reset($this->classMetadata); + } + + public function getOutsideClassMetadata() + { + return end($this->classMetadata); + } + + public function isFresh($timestamp) + { + foreach ($this->classMetadata as $metadata) { + if (!$metadata->isFresh($timestamp)) { + return false; + } + } + + return true; + } +} diff --git a/vendor/jms/metadata/src/Metadata/ClassMetadata.php b/vendor/jms/metadata/src/Metadata/ClassMetadata.php new file mode 100644 index 0000000000..b29775d471 --- /dev/null +++ b/vendor/jms/metadata/src/Metadata/ClassMetadata.php @@ -0,0 +1,82 @@ + + */ +class ClassMetadata implements \Serializable +{ + public $name; + public $reflection; + public $methodMetadata = array(); + public $propertyMetadata = array(); + public $fileResources = array(); + public $createdAt; + + public function __construct($name) + { + $this->name = $name; + + $this->reflection = new \ReflectionClass($name); + $this->createdAt = time(); + } + + public function addMethodMetadata(MethodMetadata $metadata) + { + $this->methodMetadata[$metadata->name] = $metadata; + } + + public function addPropertyMetadata(PropertyMetadata $metadata) + { + $this->propertyMetadata[$metadata->name] = $metadata; + } + + public function isFresh($timestamp = null) + { + if (null === $timestamp) { + $timestamp = $this->createdAt; + } + + foreach ($this->fileResources as $filepath) { + if (!file_exists($filepath)) { + return false; + } + + if ($timestamp < filemtime($filepath)) { + return false; + } + } + + return true; + } + + public function serialize() + { + return serialize(array( + $this->name, + $this->methodMetadata, + $this->propertyMetadata, + $this->fileResources, + $this->createdAt, + )); + } + + public function unserialize($str) + { + list( + $this->name, + $this->methodMetadata, + $this->propertyMetadata, + $this->fileResources, + $this->createdAt + ) = unserialize($str); + + $this->reflection = new \ReflectionClass($this->name); + } +} diff --git a/vendor/jms/metadata/src/Metadata/Driver/AbstractFileDriver.php b/vendor/jms/metadata/src/Metadata/Driver/AbstractFileDriver.php new file mode 100644 index 0000000000..3392097210 --- /dev/null +++ b/vendor/jms/metadata/src/Metadata/Driver/AbstractFileDriver.php @@ -0,0 +1,59 @@ + + */ +abstract class AbstractFileDriver implements AdvancedDriverInterface +{ + /** + * @var FileLocatorInterface|FileLocator + */ + private $locator; + + public function __construct(FileLocatorInterface $locator) + { + $this->locator = $locator; + } + + public function loadMetadataForClass(\ReflectionClass $class) + { + if (null === $path = $this->locator->findFileForClass($class, $this->getExtension())) { + return null; + } + + return $this->loadMetadataFromFile($class, $path); + } + + /** + * {@inheritDoc} + */ + public function getAllClassNames() + { + if (!$this->locator instanceof AdvancedFileLocatorInterface) { + throw new \RuntimeException('Locator "%s" must be an instance of "AdvancedFileLocatorInterface".'); + } + + return $this->locator->findAllClasses($this->getExtension()); + } + + /** + * Parses the content of the file, and converts it to the desired metadata. + * + * @param \ReflectionClass $class + * @param string $file + * + * @return \Metadata\ClassMetadata|null + */ + abstract protected function loadMetadataFromFile(\ReflectionClass $class, $file); + + /** + * Returns the extension of the file. + * + * @return string + */ + abstract protected function getExtension(); +} diff --git a/vendor/jms/metadata/src/Metadata/Driver/AdvancedDriverInterface.php b/vendor/jms/metadata/src/Metadata/Driver/AdvancedDriverInterface.php new file mode 100644 index 0000000000..1a904c7a44 --- /dev/null +++ b/vendor/jms/metadata/src/Metadata/Driver/AdvancedDriverInterface.php @@ -0,0 +1,18 @@ + + */ +interface AdvancedDriverInterface extends DriverInterface +{ + /** + * Gets all the metadata class names known to this driver. + * + * @return array + */ + public function getAllClassNames(); +} diff --git a/vendor/jms/metadata/src/Metadata/Driver/AdvancedFileLocatorInterface.php b/vendor/jms/metadata/src/Metadata/Driver/AdvancedFileLocatorInterface.php new file mode 100644 index 0000000000..263c0bd7a5 --- /dev/null +++ b/vendor/jms/metadata/src/Metadata/Driver/AdvancedFileLocatorInterface.php @@ -0,0 +1,20 @@ + + */ +interface AdvancedFileLocatorInterface extends FileLocatorInterface +{ + /** + * Finds all possible metadata files. + * + * @param string $extension + * + * @return array + */ + public function findAllClasses($extension); +} diff --git a/vendor/jms/metadata/src/Metadata/Driver/DriverChain.php b/vendor/jms/metadata/src/Metadata/Driver/DriverChain.php new file mode 100644 index 0000000000..eab3871454 --- /dev/null +++ b/vendor/jms/metadata/src/Metadata/Driver/DriverChain.php @@ -0,0 +1,54 @@ +drivers = $drivers; + } + + public function addDriver(DriverInterface $driver) + { + $this->drivers[] = $driver; + } + + public function loadMetadataForClass(\ReflectionClass $class) + { + foreach ($this->drivers as $driver) { + if (null !== $metadata = $driver->loadMetadataForClass($class)) { + return $metadata; + } + } + + return null; + } + + /** + * {@inheritDoc} + */ + public function getAllClassNames() + { + $classes = array(); + foreach ($this->drivers as $driver) { + if (!$driver instanceof AdvancedDriverInterface) { + throw new \RuntimeException( + sprintf( + 'Driver "%s" must be an instance of "AdvancedDriverInterface" to use '. + '"DriverChain::getAllClassNames()".', + get_class($driver) + ) + ); + } + $driverClasses = $driver->getAllClassNames(); + if (!empty($driverClasses)) { + $classes = array_merge($classes, $driverClasses); + } + } + + return $classes; + } +} diff --git a/vendor/jms/metadata/src/Metadata/Driver/DriverInterface.php b/vendor/jms/metadata/src/Metadata/Driver/DriverInterface.php new file mode 100644 index 0000000000..e8a92127a1 --- /dev/null +++ b/vendor/jms/metadata/src/Metadata/Driver/DriverInterface.php @@ -0,0 +1,13 @@ +dirs = $dirs; + } + + public function getDirs() + { + return $this->dirs; + } + + /** + * @param \ReflectionClass $class + * @param string $extension + * + * @return string|null + */ + public function findFileForClass(\ReflectionClass $class, $extension) + { + foreach ($this->dirs as $prefix => $dir) { + if ('' !== $prefix && 0 !== strpos($class->getNamespaceName(), $prefix)) { + continue; + } + + $len = '' === $prefix ? 0 : strlen($prefix) + 1; + $path = $dir.'/'.str_replace('\\', '.', substr($class->name, $len)).'.'.$extension; + if (file_exists($path)) { + return $path; + } + } + + return null; + } + + /** + * {@inheritDoc} + */ + public function findAllClasses($extension) + { + $classes = array(); + foreach ($this->dirs as $prefix => $dir) { + /** @var $iterator \RecursiveIteratorIterator|\SplFileInfo[] */ + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($dir), + \RecursiveIteratorIterator::LEAVES_ONLY + ); + $nsPrefix = $prefix !== '' ? $prefix.'\\' : ''; + foreach ($iterator as $file) { + if (($fileName = $file->getBasename('.'.$extension)) == $file->getBasename()) { + continue; + } + + $classes[] = $nsPrefix.str_replace('.', '\\', $fileName); + } + } + + return $classes; + } +} diff --git a/vendor/jms/metadata/src/Metadata/Driver/FileLocatorInterface.php b/vendor/jms/metadata/src/Metadata/Driver/FileLocatorInterface.php new file mode 100644 index 0000000000..06c7a16cef --- /dev/null +++ b/vendor/jms/metadata/src/Metadata/Driver/FileLocatorInterface.php @@ -0,0 +1,14 @@ +container = $container; + $this->realDriverId = $realDriverId; + } + + /** + * {@inheritDoc} + */ + public function loadMetadataForClass(\ReflectionClass $class) + { + return $this->container->get($this->realDriverId)->loadMetadataForClass($class); + } +} diff --git a/vendor/jms/metadata/src/Metadata/MergeableClassMetadata.php b/vendor/jms/metadata/src/Metadata/MergeableClassMetadata.php new file mode 100644 index 0000000000..13ec1583ca --- /dev/null +++ b/vendor/jms/metadata/src/Metadata/MergeableClassMetadata.php @@ -0,0 +1,23 @@ +name = $object->name; + $this->reflection = $object->reflection; + $this->methodMetadata = array_merge($this->methodMetadata, $object->methodMetadata); + $this->propertyMetadata = array_merge($this->propertyMetadata, $object->propertyMetadata); + $this->fileResources = array_merge($this->fileResources, $object->fileResources); + + if ($object->createdAt < $this->createdAt) { + $this->createdAt = $object->createdAt; + } + } +} \ No newline at end of file diff --git a/vendor/jms/metadata/src/Metadata/MergeableInterface.php b/vendor/jms/metadata/src/Metadata/MergeableInterface.php new file mode 100644 index 0000000000..59550742c5 --- /dev/null +++ b/vendor/jms/metadata/src/Metadata/MergeableInterface.php @@ -0,0 +1,13 @@ +driver = $driver; + $this->hierarchyMetadataClass = $hierarchyMetadataClass; + $this->debug = (Boolean) $debug; + } + + /** + * @param boolean $include + */ + public function setIncludeInterfaces($include) + { + $this->includeInterfaces = (Boolean) $include; + } + + public function setCache(CacheInterface $cache) + { + $this->cache = $cache; + } + + /** + * @param string $className + * + * @return ClassHierarchyMetadata|MergeableClassMetadata|null + */ + public function getMetadataForClass($className) + { + if (isset($this->loadedMetadata[$className])) { + return $this->filterNullMetadata($this->loadedMetadata[$className]); + } + + $metadata = null; + foreach ($this->getClassHierarchy($className) as $class) { + if (isset($this->loadedClassMetadata[$name = $class->getName()])) { + if (null !== $classMetadata = $this->filterNullMetadata($this->loadedClassMetadata[$name])) { + $this->addClassMetadata($metadata, $classMetadata); + } + continue; + } + + // check the cache + if (null !== $this->cache) { + if (($classMetadata = $this->cache->loadClassMetadataFromCache($class)) instanceof NullMetadata) { + $this->loadedClassMetadata[$name] = $classMetadata; + continue; + } + + if (null !== $classMetadata) { + if ( ! $classMetadata instanceof ClassMetadata) { + throw new \LogicException(sprintf('The cache must return instances of ClassMetadata, but got %s.', var_export($classMetadata, true))); + } + + if ($this->debug && !$classMetadata->isFresh()) { + $this->cache->evictClassMetadataFromCache($classMetadata->reflection); + } else { + $this->loadedClassMetadata[$name] = $classMetadata; + $this->addClassMetadata($metadata, $classMetadata); + continue; + } + } + } + + // load from source + if (null !== $classMetadata = $this->driver->loadMetadataForClass($class)) { + $this->loadedClassMetadata[$name] = $classMetadata; + $this->addClassMetadata($metadata, $classMetadata); + + if (null !== $this->cache) { + $this->cache->putClassMetadataInCache($classMetadata); + } + + continue; + } + + if (null !== $this->cache && !$this->debug) { + $this->cache->putClassMetadataInCache(new NullMetadata($class->getName())); + } + } + + if (null === $metadata) { + $metadata = new NullMetadata($className); + } + + return $this->filterNullMetadata($this->loadedMetadata[$className] = $metadata); + } + + /** + * {@inheritDoc} + */ + public function getAllClassNames() + { + if (!$this->driver instanceof AdvancedDriverInterface) { + throw new \RuntimeException( + sprintf('Driver "%s" must be an instance of "AdvancedDriverInterface".', get_class($this->driver)) + ); + } + + return $this->driver->getAllClassNames(); + } + + /** + * @param ClassMetadata|null $metadata + * @param ClassMetadata $toAdd + */ + private function addClassMetadata(&$metadata, $toAdd) + { + if ($toAdd instanceof MergeableInterface) { + if (null === $metadata) { + $metadata = clone $toAdd; + } else { + $metadata->merge($toAdd); + } + } else { + if (null === $metadata) { + $metadata = new $this->hierarchyMetadataClass; + } + + $metadata->addClassMetadata($toAdd); + } + } + + /** + * @param string $class + */ + private function getClassHierarchy($class) + { + $classes = array(); + $refl = new \ReflectionClass($class); + + do { + $classes[] = $refl; + $refl = $refl->getParentClass(); + } while (false !== $refl); + + $classes = array_reverse($classes, false); + + if (!$this->includeInterfaces) { + return $classes; + } + + $addedInterfaces = array(); + $newHierarchy = array(); + + foreach ($classes as $class) { + foreach ($class->getInterfaces() as $interface) { + if (isset($addedInterfaces[$interface->getName()])) { + continue; + } + $addedInterfaces[$interface->getName()] = true; + + $newHierarchy[] = $interface; + } + + $newHierarchy[] = $class; + } + + return $newHierarchy; + } + + /** + * @param NullMetadata|null $metadata + * + * @return ClassMetadata|null + */ + private function filterNullMetadata($metadata = null) + { + return !$metadata instanceof NullMetadata ? $metadata : null; + } +} diff --git a/vendor/jms/metadata/src/Metadata/MetadataFactoryInterface.php b/vendor/jms/metadata/src/Metadata/MetadataFactoryInterface.php new file mode 100644 index 0000000000..3b0c34ad7c --- /dev/null +++ b/vendor/jms/metadata/src/Metadata/MetadataFactoryInterface.php @@ -0,0 +1,26 @@ + + */ +interface MetadataFactoryInterface +{ + /** + * Returns the gathered metadata for the given class name. + * + * If the drivers return instances of MergeableClassMetadata, these will be + * merged prior to returning. Otherwise, all metadata for the inheritance + * hierarchy will be returned as ClassHierarchyMetadata unmerged. + * + * If no metadata is available, null is returned. + * + * @param string $className + * + * @return ClassHierarchyMetadata|MergeableClassMetadata|null + */ + public function getMetadataForClass($className); +} diff --git a/vendor/jms/metadata/src/Metadata/MethodMetadata.php b/vendor/jms/metadata/src/Metadata/MethodMetadata.php new file mode 100644 index 0000000000..aa2c892927 --- /dev/null +++ b/vendor/jms/metadata/src/Metadata/MethodMetadata.php @@ -0,0 +1,51 @@ + + */ +class MethodMetadata implements \Serializable +{ + public $class; + public $name; + public $reflection; + + public function __construct($class, $name) + { + $this->class = $class; + $this->name = $name; + + $this->reflection = new \ReflectionMethod($class, $name); + $this->reflection->setAccessible(true); + } + + /** + * @param object $obj + * @param array $args + * + * @return mixed + */ + public function invoke($obj, array $args = array()) + { + return $this->reflection->invokeArgs($obj, $args); + } + + public function serialize() + { + return serialize(array($this->class, $this->name)); + } + + public function unserialize($str) + { + list($this->class, $this->name) = unserialize($str); + + $this->reflection = new \ReflectionMethod($this->class, $this->name); + $this->reflection->setAccessible(true); + } +} diff --git a/vendor/jms/metadata/src/Metadata/NullMetadata.php b/vendor/jms/metadata/src/Metadata/NullMetadata.php new file mode 100644 index 0000000000..f06dfba68a --- /dev/null +++ b/vendor/jms/metadata/src/Metadata/NullMetadata.php @@ -0,0 +1,13 @@ + + */ +class NullMetadata extends ClassMetadata +{ + +} diff --git a/vendor/jms/metadata/src/Metadata/PropertyMetadata.php b/vendor/jms/metadata/src/Metadata/PropertyMetadata.php new file mode 100644 index 0000000000..78baad12d3 --- /dev/null +++ b/vendor/jms/metadata/src/Metadata/PropertyMetadata.php @@ -0,0 +1,62 @@ + + */ +class PropertyMetadata implements \Serializable +{ + public $class; + public $name; + public $reflection; + + public function __construct($class, $name) + { + $this->class = $class; + $this->name = $name; + + $this->reflection = new \ReflectionProperty($class, $name); + $this->reflection->setAccessible(true); + } + + /** + * @param object $obj + * + * @return mixed + */ + public function getValue($obj) + { + return $this->reflection->getValue($obj); + } + + /** + * @param object $obj + * @param string $value + */ + public function setValue($obj, $value) + { + $this->reflection->setValue($obj, $value); + } + + public function serialize() + { + return serialize(array( + $this->class, + $this->name, + )); + } + + public function unserialize($str) + { + list($this->class, $this->name) = unserialize($str); + + $this->reflection = new \ReflectionProperty($this->class, $this->name); + $this->reflection->setAccessible(true); + } +} diff --git a/vendor/jms/metadata/src/Metadata/Version.php b/vendor/jms/metadata/src/Metadata/Version.php new file mode 100644 index 0000000000..65b1a40199 --- /dev/null +++ b/vendor/jms/metadata/src/Metadata/Version.php @@ -0,0 +1,8 @@ +markTestSkipped('Doctrine\Common is not installed.'); + } + } + + public function testLoadEvictPutClassMetadataFromInCache() + { + $cache = new DoctrineCacheAdapter('metadata-test', new ArrayCache()); + + $this->assertNull($cache->loadClassMetadataFromCache($refl = new \ReflectionClass('Metadata\Tests\Fixtures\TestObject'))); + $cache->putClassMetadataInCache($metadata = new ClassMetadata('Metadata\Tests\Fixtures\TestObject')); + + $this->assertEquals($metadata, $cache->loadClassMetadataFromCache($refl)); + + $cache->evictClassMetadataFromCache($refl); + $this->assertNull($cache->loadClassMetadataFromCache($refl)); + } +} diff --git a/vendor/jms/metadata/tests/Metadata/Tests/Cache/FileCacheTest.php b/vendor/jms/metadata/tests/Metadata/Tests/Cache/FileCacheTest.php new file mode 100644 index 0000000000..9325dd7232 --- /dev/null +++ b/vendor/jms/metadata/tests/Metadata/Tests/Cache/FileCacheTest.php @@ -0,0 +1,22 @@ +assertNull($cache->loadClassMetadataFromCache($refl = new \ReflectionClass('Metadata\Tests\Fixtures\TestObject'))); + $cache->putClassMetadataInCache($metadata = new ClassMetadata('Metadata\Tests\Fixtures\TestObject')); + + $this->assertEquals($metadata, $cache->loadClassMetadataFromCache($refl)); + + $cache->evictClassMetadataFromCache($refl); + $this->assertNull($cache->loadClassMetadataFromCache($refl)); + } +} \ No newline at end of file diff --git a/vendor/jms/metadata/tests/Metadata/Tests/Cache/PsrCacheAdapterTest.php b/vendor/jms/metadata/tests/Metadata/Tests/Cache/PsrCacheAdapterTest.php new file mode 100644 index 0000000000..7470eb6999 --- /dev/null +++ b/vendor/jms/metadata/tests/Metadata/Tests/Cache/PsrCacheAdapterTest.php @@ -0,0 +1,33 @@ +markTestSkipped('symfony/cache is not installed.'); + } + } + + public function testLoadEvictPutClassMetadataFromInCache() + { + $cache = new PsrCacheAdapter('metadata-test', new ArrayAdapter()); + + $this->assertNull($cache->loadClassMetadataFromCache($refl = new \ReflectionClass('Metadata\Tests\Fixtures\TestObject'))); + $cache->putClassMetadataInCache($metadata = new ClassMetadata('Metadata\Tests\Fixtures\TestObject')); + + $this->assertEquals($metadata, $cache->loadClassMetadataFromCache($refl)); + + $cache->evictClassMetadataFromCache($refl); + $this->assertNull($cache->loadClassMetadataFromCache($refl)); + } +} diff --git a/vendor/jms/metadata/tests/Metadata/Tests/ClassMetadataTest.php b/vendor/jms/metadata/tests/Metadata/Tests/ClassMetadataTest.php new file mode 100644 index 0000000000..99cb9b3a72 --- /dev/null +++ b/vendor/jms/metadata/tests/Metadata/Tests/ClassMetadataTest.php @@ -0,0 +1,39 @@ +assertEquals('Metadata\Tests\Fixtures\TestObject', $metadata->name); + $this->assertEquals('Metadata\Tests\Fixtures\TestObject', $metadata->reflection->name); + } + + public function testSerializeUnserialize() + { + $metadata = new ClassMetadata('Metadata\Tests\Fixtures\TestObject'); + + $this->assertEquals($metadata, unserialize(serialize($metadata))); + } + + public function testIsFresh() + { + $ref = new \ReflectionClass('Metadata\Tests\Fixtures\TestObject'); + touch($ref->getFilename()); + sleep(2); + + $metadata = new ClassMetadata($ref->name); + $metadata->fileResources[] = $ref->getFilename(); + $this->assertTrue($metadata->isFresh()); + + sleep(2); + clearstatcache($ref->getFilename()); + touch($ref->getFilename()); + $this->assertFalse($metadata->isFresh()); + } +} diff --git a/vendor/jms/metadata/tests/Metadata/Tests/Driver/AbstractFileDriverTest.php b/vendor/jms/metadata/tests/Metadata/Tests/Driver/AbstractFileDriverTest.php new file mode 100644 index 0000000000..20b91fb288 --- /dev/null +++ b/vendor/jms/metadata/tests/Metadata/Tests/Driver/AbstractFileDriverTest.php @@ -0,0 +1,85 @@ + + */ +class AbstractFileDriverTest extends \PHPUnit_Framework_TestCase +{ + private static $extension = 'jms_metadata.yml'; + + /** @var \PHPUnit_Framework_MockObject_MockObject */ + private $locator; + + /** @var \PHPUnit_Framework_MockObject_MockObject */ + private $driver; + + public function setUp() + { + $this->locator = $this->getMock('Metadata\Driver\FileLocator', array(), array(), '', false); + $this->driver = $this->getMockBuilder('Metadata\Driver\AbstractFileDriver') + ->setConstructorArgs(array($this->locator)) + ->getMockForAbstractClass(); + + $this->driver->expects($this->any())->method('getExtension')->will($this->returnValue(self::$extension)); + } + + public function testLoadMetadataForClass() + { + $class = new \ReflectionClass('\stdClass'); + $this->locator + ->expects($this->once()) + ->method('findFileForClass') + ->with($class, self::$extension) + ->will($this->returnValue('Some\Path')); + + $this->driver + ->expects($this->once()) + ->method('loadMetadataFromFile') + ->with($class, 'Some\Path') + ->will($this->returnValue($metadata = new ClassMetadata('\stdClass'))); + + $this->assertSame($metadata, $this->driver->loadMetadataForClass($class)); + } + + public function testLoadMetadataForClassWillReturnNull() + { + $class = new \ReflectionClass('\stdClass'); + $this->locator + ->expects($this->once()) + ->method('findFileForClass') + ->with($class, self::$extension) + ->will($this->returnValue(null)); + + $this->assertSame(null, $this->driver->loadMetadataForClass($class)); + } + + public function testGetAllClassNames() + { + $class = new \ReflectionClass('\stdClass'); + $this->locator + ->expects($this->once()) + ->method('findAllClasses') + ->with(self::$extension) + ->will($this->returnValue(array('\stdClass'))); + + $this->assertSame(array('\stdClass'), $this->driver->getAllClassNames($class)); + } + + public function testGetAllClassNamesThrowsRuntimeException() + { + $this->setExpectedException('RuntimeException'); + + $locator = $this->getMock('Metadata\Driver\FileLocatorInterface', array(), array(), '', false); + $driver = $this->getMockBuilder('Metadata\Driver\AbstractFileDriver') + ->setConstructorArgs(array($locator)) + ->getMockForAbstractClass(); + $class = new \ReflectionClass('\stdClass'); + $locator->expects($this->never())->method('findAllClasses'); + + $driver->getAllClassNames($class); + } +} diff --git a/vendor/jms/metadata/tests/Metadata/Tests/Driver/DriverChainTest.php b/vendor/jms/metadata/tests/Metadata/Tests/Driver/DriverChainTest.php new file mode 100644 index 0000000000..5e33643a42 --- /dev/null +++ b/vendor/jms/metadata/tests/Metadata/Tests/Driver/DriverChainTest.php @@ -0,0 +1,65 @@ +getMock('Metadata\\Driver\\DriverInterface'); + $driver + ->expects($this->once()) + ->method('loadMetadataForClass') + ->will($this->returnValue($metadata = new ClassMetadata('\stdClass'))) + ; + $chain = new DriverChain(array($driver)); + + $this->assertSame($metadata, $chain->loadMetadataForClass(new \ReflectionClass('\stdClass'))); + } + + public function testGetAllClassNames() + { + $driver1 = $this->getMock('Metadata\\Driver\\AdvancedDriverInterface'); + $driver1 + ->expects($this->once()) + ->method('getAllClassNames') + ->will($this->returnValue(array('Foo'))); + + $driver2 = $this->getMock('Metadata\\Driver\\AdvancedDriverInterface'); + $driver2 + ->expects($this->once()) + ->method('getAllClassNames') + ->will($this->returnValue(array('Bar'))); + + $chain = new DriverChain(array($driver1, $driver2)); + + $this->assertSame(array('Foo', 'Bar'), $chain->getAllClassNames()); + } + + public function testLoadMetadataForClassReturnsNullWhenNoMetadataIsFound() + { + $driver = new DriverChain(array()); + $this->assertNull($driver->loadMetadataForClass(new \ReflectionClass('\stdClass'))); + + $driver = $this->getMock('Metadata\\Driver\\DriverInterface'); + $driver + ->expects($this->once()) + ->method('loadMetadataForClass') + ->will($this->returnValue(null)) + ; + $driverChain = new DriverChain(array($driver)); + $this->assertNull($driver->loadMetadataForClass(new \ReflectionClass('\stdClass'))); + } + + public function testGetAllClassNamesThrowsException() + { + $this->setExpectedException('RuntimeException'); + $driver = $this->getMock('Metadata\\Driver\\DriverInterface'); + $driver->expects($this->never())->method('getAllClassNames'); + $chain = new DriverChain(array($driver)); + $chain->getAllClassNames(); + } +} diff --git a/vendor/jms/metadata/tests/Metadata/Tests/Driver/FileLocatorTest.php b/vendor/jms/metadata/tests/Metadata/Tests/Driver/FileLocatorTest.php new file mode 100644 index 0000000000..b92d8c9681 --- /dev/null +++ b/vendor/jms/metadata/tests/Metadata/Tests/Driver/FileLocatorTest.php @@ -0,0 +1,69 @@ + __DIR__.'/Fixture/A', + 'Metadata\Tests\Driver\Fixture\B' => __DIR__.'/Fixture/B', + 'Metadata\Tests\Driver\Fixture\C' => __DIR__.'/Fixture/C', + )); + + $ref = new \ReflectionClass('Metadata\Tests\Driver\Fixture\A\A'); + $this->assertEquals(realpath(__DIR__.'/Fixture/A/A.xml'), realpath($locator->findFileForClass($ref, 'xml'))); + + $ref = new \ReflectionClass('Metadata\Tests\Driver\Fixture\B\B'); + $this->assertNull($locator->findFileForClass($ref, 'xml')); + + $ref = new \ReflectionClass('Metadata\Tests\Driver\Fixture\C\SubDir\C'); + $this->assertEquals(realpath(__DIR__.'/Fixture/C/SubDir.C.yml'), realpath($locator->findFileForClass($ref, 'yml'))); + } + + public function testTraits() + { + if (version_compare(PHP_VERSION, '5.4.0', '<')) { + $this->markTestSkipped('No traits available'); + } + + $locator = new FileLocator(array( + 'Metadata\Tests\Driver\Fixture\T' => __DIR__.'/Fixture/T', + )); + + $ref = new \ReflectionClass('Metadata\Tests\Driver\Fixture\T\T'); + $this->assertEquals(realpath(__DIR__.'/Fixture/T/T.xml'), realpath($locator->findFileForClass($ref, 'xml'))); + } + + public function testFindFileForGlobalNamespacedClass() + { + $locator = new FileLocator(array( + '' => __DIR__.'/Fixture/D', + )); + + require_once __DIR__.'/Fixture/D/D.php'; + $ref = new \ReflectionClass('D'); + $this->assertEquals(realpath(__DIR__.'/Fixture/D/D.yml'), realpath($locator->findFileForClass($ref, 'yml'))); + } + + public function testFindAllFiles() + { + $locator = new FileLocator(array( + 'Metadata\Tests\Driver\Fixture\A' => __DIR__.'/Fixture/A', + 'Metadata\Tests\Driver\Fixture\B' => __DIR__.'/Fixture/B', + 'Metadata\Tests\Driver\Fixture\C' => __DIR__.'/Fixture/C', + 'Metadata\Tests\Driver\Fixture\D' => __DIR__.'/Fixture/D' + )); + + $this->assertCount(1, $xmlFiles = $locator->findAllClasses('xml')); + $this->assertSame('Metadata\Tests\Driver\Fixture\A\A', $xmlFiles[0]); + + $this->assertCount(3, $ymlFiles = $locator->findAllClasses('yml')); + $this->assertSame('Metadata\Tests\Driver\Fixture\B\B', $ymlFiles[0]); + $this->assertSame('Metadata\Tests\Driver\Fixture\C\SubDir\C', $ymlFiles[1]); + $this->assertSame('Metadata\Tests\Driver\Fixture\D\D', $ymlFiles[2]); + } +} diff --git a/vendor/jms/metadata/tests/Metadata/Tests/Driver/Fixture/A/A.php b/vendor/jms/metadata/tests/Metadata/Tests/Driver/Fixture/A/A.php new file mode 100644 index 0000000000..3ea6df1e2c --- /dev/null +++ b/vendor/jms/metadata/tests/Metadata/Tests/Driver/Fixture/A/A.php @@ -0,0 +1,5 @@ +foo; + } + + private function setFoo($foo) + { + $this->foo = $foo; + } +} diff --git a/vendor/jms/metadata/tests/Metadata/Tests/Fixtures/TestParent.php b/vendor/jms/metadata/tests/Metadata/Tests/Fixtures/TestParent.php new file mode 100644 index 0000000000..940cb5b0f5 --- /dev/null +++ b/vendor/jms/metadata/tests/Metadata/Tests/Fixtures/TestParent.php @@ -0,0 +1,7 @@ +propertyMetadata['foo'] = 'bar'; + $parentMetadata->propertyMetadata['baz'] = 'baz'; + $parentMetadata->methodMetadata['foo'] = 'bar'; + $parentMetadata->createdAt = 2; + $parentMetadata->fileResources[] = 'foo'; + + $childMetadata = new MergeableClassMetadata('Metadata\Tests\Fixtures\TestObject'); + $childMetadata->propertyMetadata['foo'] = 'baz'; + $childMetadata->methodMetadata['foo'] = 'baz'; + $childMetadata->createdAt = 1; + $childMetadata->fileResources[] = 'bar'; + + $parentMetadata->merge($childMetadata); + $this->assertEquals('Metadata\Tests\Fixtures\TestObject', $parentMetadata->name); + $this->assertEquals('Metadata\Tests\Fixtures\TestObject', $parentMetadata->reflection->name); + $this->assertEquals(array('foo' => 'baz', 'baz' => 'baz',), $parentMetadata->propertyMetadata); + $this->assertEquals(array('foo' => 'baz',), $parentMetadata->methodMetadata); + $this->assertEquals(1, $parentMetadata->createdAt); + $this->assertEquals(array('foo', 'bar'), $parentMetadata->fileResources); + } +} \ No newline at end of file diff --git a/vendor/jms/metadata/tests/Metadata/Tests/MetadataFactoryTest.php b/vendor/jms/metadata/tests/Metadata/Tests/MetadataFactoryTest.php new file mode 100644 index 0000000000..7fb5df416f --- /dev/null +++ b/vendor/jms/metadata/tests/Metadata/Tests/MetadataFactoryTest.php @@ -0,0 +1,279 @@ +getMock('Metadata\Driver\DriverInterface'); + + $driver + ->expects($this->at(0)) + ->method('loadMetadataForClass') + ->with($this->equalTo(new \ReflectionClass('Metadata\Tests\Fixtures\TestObject'))) + ->will($this->returnCallback(function($class) { + return new ClassMetadata($class->getName()); + })) + ; + $driver + ->expects($this->at(1)) + ->method('loadMetadataForClass') + ->with($this->equalTo(new \ReflectionClass('Metadata\Tests\Fixtures\TestParent'))) + ->will($this->returnCallback(function($class) { + return new ClassMetadata($class->getName()); + })) + ; + + $factory = new MetadataFactory($driver); + $metadata = $factory->getMetadataForClass('Metadata\Tests\Fixtures\TestParent'); + + $this->assertInstanceOf('Metadata\ClassHierarchyMetadata', $metadata); + $this->assertEquals(2, count($metadata->classMetadata)); + } + + public function testGetMetadataForClassWhenMergeable() + { + $driver = $this->getMock('Metadata\Driver\DriverInterface'); + + $driver + ->expects($this->at(0)) + ->method('loadMetadataForClass') + ->with($this->equalTo(new \ReflectionClass('Metadata\Tests\Fixtures\TestObject'))) + ->will($this->returnCallback(function($class) { + return new MergeableClassMetadata($class->getName()); + })) + ; + $driver + ->expects($this->at(1)) + ->method('loadMetadataForClass') + ->with($this->equalTo(new \ReflectionClass('Metadata\Tests\Fixtures\TestParent'))) + ->will($this->returnCallback(function($class) { + return new MergeableClassMetadata($class->getName()); + })) + ; + + $factory = new MetadataFactory($driver); + $metadata = $factory->getMetadataForClass('Metadata\Tests\Fixtures\TestParent'); + + $this->assertInstanceOf('Metadata\MergeableClassMetadata', $metadata); + $this->assertEquals('Metadata\Tests\Fixtures\TestParent', $metadata->name); + } + + public function testGetMetadataWithComplexHierarchy() + { + $driver = $this->getMock('Metadata\Driver\DriverInterface'); + + $driver + ->expects($this->any()) + ->method('loadMetadataForClass') + ->will($this->returnCallback(function($class) { + $metadata = new MergeableClassMetadata($class->name); + + switch ($class->name) { + case 'Metadata\Tests\Fixtures\ComplexHierarchy\BaseClass': + $metadata->propertyMetadata['foo'] = new PropertyMetadata($class->name, 'foo'); + break; + + case 'Metadata\Tests\Fixtures\ComplexHierarchy\SubClassA': + $metadata->propertyMetadata['bar'] = new PropertyMetadata($class->name, 'bar'); + break; + + case 'Metadata\Tests\Fixtures\ComplexHierarchy\SubClassB': + $metadata->propertyMetadata['baz'] = new PropertyMetadata($class->name, 'baz'); + break; + + default: + throw new \RuntimeException(sprintf('Unsupported class "%s".', $class->name)); + } + + return $metadata; + })) + ; + + $factory = new MetadataFactory($driver); + + $subClassA = $factory->getMetadataForClass('Metadata\Tests\Fixtures\ComplexHierarchy\SubClassA'); + $this->assertInstanceOf('Metadata\MergeableClassMetadata', $subClassA); + $this->assertEquals(array('foo', 'bar'), array_keys($subClassA->propertyMetadata)); + + $subClassB = $factory->getMetadataForClass('Metadata\Tests\Fixtures\ComplexHierarchy\SubClassB'); + $this->assertInstanceOf('Metadata\MergeableClassMetadata', $subClassB); + $this->assertEquals(array('foo', 'baz'), array_keys($subClassB->propertyMetadata)); + } + + public function testGetMetadataWithCache() + { + $driver = $this->getMock('Metadata\Driver\DriverInterface'); + $driver + ->expects($this->once()) + ->method('loadMetadataForClass') + ->will($this->returnValue($metadata = new ClassMetadata('Metadata\Tests\Fixtures\TestObject'))) + ; + + $factory = new MetadataFactory($driver); + + $cache = $this->getMock('Metadata\Cache\CacheInterface'); + $cache + ->expects($this->once()) + ->method('loadClassMetadataFromCache') + ->with($this->equalTo(new \ReflectionClass('Metadata\Tests\Fixtures\TestObject'))) + ->will($this->returnValue(null)) + ; + $cache + ->expects($this->once()) + ->method('putClassMetadataInCache') + ->with($this->equalTo($metadata)) + ; + $factory->setCache($cache); + + + $factory->getMetadataForClass('Metadata\Tests\Fixtures\TestObject'); + $factory->getMetadataForClass('Metadata\Tests\Fixtures\TestObject'); + $this->assertSame($metadata, reset($factory->getMetadataForClass('Metadata\Tests\Fixtures\TestObject')->classMetadata)); + } + + public function testGetMetadataReturnsNullIfNoMetadataIsFound() + { + $driver = $this->getMock('Metadata\Driver\DriverInterface'); + $driver + ->expects($this->once()) + ->method('loadMetadataForClass') + ->will($this->returnValue(null)) + ; + + $factory = new MetadataFactory($driver); + + $this->assertNull($factory->getMetadataForClass('stdClass')); + } + + public function testGetMetadataWithInterfaces() + { + $driver = $this->getMock('Metadata\Driver\DriverInterface'); + + $driver + ->expects($this->at(3)) + ->method('loadMetadataForClass') + ->with($this->equalTo(new \ReflectionClass('Metadata\Tests\Fixtures\ComplexHierarchy\SubClassA'))) + ; + $driver + ->expects($this->at(2)) + ->method('loadMetadataForClass') + ->with($this->equalTo(new \ReflectionClass('Metadata\Tests\Fixtures\ComplexHierarchy\InterfaceB'))) + ; + $driver + ->expects($this->at(1)) + ->method('loadMetadataForClass') + ->with($this->equalTo(new \ReflectionClass('Metadata\Tests\Fixtures\ComplexHierarchy\BaseClass'))) + ; + $driver + ->expects($this->at(0)) + ->method('loadMetadataForClass') + ->with($this->equalTo(new \ReflectionClass('Metadata\Tests\Fixtures\ComplexHierarchy\InterfaceA'))) + ; + + $factory = new MetadataFactory($driver); + $factory->setIncludeInterfaces(true); + + $factory->getMetadataForClass('Metadata\Tests\Fixtures\ComplexHierarchy\SubClassA'); + } + + public function testGetAllClassNames() + { + $driver = $this->getMock('Metadata\Driver\AdvancedDriverInterface'); + $driver + ->expects($this->once()) + ->method('getAllClassNames') + ->will($this->returnValue(array())); + + $factory = new MetadataFactory($driver); + $this->assertSame(array(), $factory->getAllClassNames()); + } + + public function testGetAllClassNamesThrowsException() + { + $this->setExpectedException('RuntimeException'); + $factory = new MetadataFactory($this->getMock('Metadata\Driver\DriverInterface')); + $factory->getAllClassNames(); + } + + public function testNotFoundMetadataIsCached() + { + $driver = $this->getMock('Metadata\Driver\DriverInterface'); + $driver + ->expects($this->once()) // This is the important part of this test + ->method('loadMetadataForClass') + ->will($this->returnValue(null)) + ; + + $cachedMetadata = null; + $cache = $this->getMock('Metadata\Cache\CacheInterface'); + $cache + ->expects($this->any()) + ->method('loadClassMetadataFromCache') + ->with($this->equalTo(new \ReflectionClass('Metadata\Tests\Fixtures\TestObject'))) + ->will($this->returnCallback(function () use (&$cachedMetadata) { + return $cachedMetadata; + })) + ; + $cache + ->expects($this->once()) + ->method('putClassMetadataInCache') + ->will($this->returnCallback(function ($metadata) use (&$cachedMetadata) { + $cachedMetadata = $metadata; + })) + ; + + $factory = new MetadataFactory($driver); + $factory->setCache($cache); + $factory->getMetadataForClass('Metadata\Tests\Fixtures\TestObject'); + $factory->getMetadataForClass('Metadata\Tests\Fixtures\TestObject'); + $this->assertNull($factory->getMetadataForClass('Metadata\Tests\Fixtures\TestObject')); + + // We use another factory with the same cache, to simulate another request and skip the in memory + $factory = new MetadataFactory($driver); + $factory->setCache($cache); + $factory->getMetadataForClass('Metadata\Tests\Fixtures\TestObject'); + $factory->getMetadataForClass('Metadata\Tests\Fixtures\TestObject'); + $this->assertNull($factory->getMetadataForClass('Metadata\Tests\Fixtures\TestObject')); + } + + public function testNotFoundMetadataIsNotCachedInDebug() + { + $driver = $this->getMock('Metadata\Driver\DriverInterface'); + $driver + ->expects($this->exactly(2)) + ->method('loadMetadataForClass') + ->will($this->returnValue(null)) + ; + + $cachedMetadata = null; + $cache = $this->getMock('Metadata\Cache\CacheInterface'); + $cache + ->expects($this->any()) + ->method('loadClassMetadataFromCache') + ->with($this->equalTo(new \ReflectionClass('Metadata\Tests\Fixtures\TestObject'))) + ->will($this->returnValue(null)) + ; + $cache + ->expects($this->never()) + ->method('putClassMetadataInCache') + ; + + $factory = new MetadataFactory($driver, 'Metadata\ClassHierarchyMetadata', true); + $factory->setCache($cache); + $factory->getMetadataForClass('Metadata\Tests\Fixtures\TestObject'); + $this->assertNull($factory->getMetadataForClass('Metadata\Tests\Fixtures\TestObject')); + + // We use another factory with the same cache, to simulate another request and skip the in memory + $factory = new MetadataFactory($driver, 'Metadata\ClassHierarchyMetadata', true); + $factory->setCache($cache); + $factory->getMetadataForClass('Metadata\Tests\Fixtures\TestObject'); + $this->assertNull($factory->getMetadataForClass('Metadata\Tests\Fixtures\TestObject')); + } +} diff --git a/vendor/jms/metadata/tests/Metadata/Tests/MethodMetadataTest.php b/vendor/jms/metadata/tests/Metadata/Tests/MethodMetadataTest.php new file mode 100644 index 0000000000..2276ace066 --- /dev/null +++ b/vendor/jms/metadata/tests/Metadata/Tests/MethodMetadataTest.php @@ -0,0 +1,37 @@ +setAccessible(true); + + $this->assertEquals('Metadata\Tests\Fixtures\TestObject', $metadata->class); + $this->assertEquals('setFoo', $metadata->name); + $this->assertEquals($expectedReflector, $metadata->reflection); + } + + public function testSerializeUnserialize() + { + $metadata = new MethodMetadata('Metadata\Tests\Fixtures\TestObject', 'setFoo'); + + $this->assertEquals($metadata, unserialize(serialize($metadata))); + } + + public function testInvoke() + { + $obj = new TestObject(); + $metadata = new MethodMetadata('Metadata\Tests\Fixtures\TestObject', 'setFoo'); + + $this->assertNull($obj->getFoo()); + $metadata->invoke($obj, array('foo')); + $this->assertEquals('foo', $obj->getFoo()); + } +} \ No newline at end of file diff --git a/vendor/jms/metadata/tests/Metadata/Tests/PropertyMetadataTest.php b/vendor/jms/metadata/tests/Metadata/Tests/PropertyMetadataTest.php new file mode 100644 index 0000000000..e30e546fbd --- /dev/null +++ b/vendor/jms/metadata/tests/Metadata/Tests/PropertyMetadataTest.php @@ -0,0 +1,37 @@ +setAccessible(true); + + $this->assertEquals('Metadata\Tests\Fixtures\TestObject', $metadata->class); + $this->assertEquals('foo', $metadata->name); + $this->assertEquals($expectedReflector, $metadata->reflection); + } + + public function testSerializeUnserialize() + { + $metadata = new PropertyMetadata('Metadata\Tests\Fixtures\TestObject', 'foo'); + + $this->assertEquals($metadata, unserialize(serialize($metadata))); + } + + public function testSetGetValue() + { + $obj = new TestObject(); + $metadata = new PropertyMetadata('Metadata\Tests\Fixtures\TestObject', 'foo'); + + $this->assertNull($metadata->getValue($obj)); + $metadata->setValue($obj, 'foo'); + $this->assertEquals('foo', $metadata->getValue($obj)); + } +} \ No newline at end of file diff --git a/vendor/jms/metadata/tests/bootstrap.php b/vendor/jms/metadata/tests/bootstrap.php new file mode 100644 index 0000000000..63333219b9 --- /dev/null +++ b/vendor/jms/metadata/tests/bootstrap.php @@ -0,0 +1,36 @@ + + * + */ + +spl_autoload_register(function($class) { + if (0 === strpos($class, 'Metadata\Tests\\')) { + $path = __DIR__.'/../tests/'.strtr($class, '\\', '/').'.php'; + if (file_exists($path) && is_readable($path)) { + require_once $path; + + return true; + } + } elseif (0 === strpos($class, 'Metadata\\')) { + $path = __DIR__.'/../src/'.($class = strtr($class, '\\', '/')).'.php'; + if (file_exists($path) && is_readable($path)) { + require_once $path; + + return true; + } + } elseif (0 === strpos($class, 'Symfony\\')) { + $path = __DIR__.'/../../symfony/src/'.strtr($class, '\\', '/').'.php'; + + if (file_exists($path) && is_readable($path)) { + require_once $path; + + return true; + } + } +}); + +@include __DIR__ . '/../vendor/autoload.php'; diff --git a/vendor/jms/parser-lib/.gitignore b/vendor/jms/parser-lib/.gitignore new file mode 100644 index 0000000000..30f3ee22d1 --- /dev/null +++ b/vendor/jms/parser-lib/.gitignore @@ -0,0 +1,3 @@ +vendor/ +phpunit.xml + diff --git a/vendor/jms/parser-lib/.jms.yml b/vendor/jms/parser-lib/.jms.yml new file mode 100644 index 0000000000..0d0f3156c5 --- /dev/null +++ b/vendor/jms/parser-lib/.jms.yml @@ -0,0 +1,19 @@ +filter: + paths: [src/*, tests/*] + excluded_paths: ["tests/*/Fixture/*"] + +default_config: + psr0_compliance: true + checkstyle: true + composer_config_check: + publish_checks: true + level: warning + reflection_fixes: true + use_statement_fixes: true + +path_configs: + tests: + paths: [tests/*] + psr0_compliance: false + checkstyle: false + phpunit_checks: true diff --git a/vendor/jms/parser-lib/.travis.yml b/vendor/jms/parser-lib/.travis.yml new file mode 100644 index 0000000000..c507441f07 --- /dev/null +++ b/vendor/jms/parser-lib/.travis.yml @@ -0,0 +1,15 @@ +language: php + +php: + - 5.3 + - 5.4 + +before_script: + - curl -s http://getcomposer.org/installer | php + - php composer.phar install --dev + +script: phpunit --coverage-clover clover + +after_success: + - curl -sL https://bit.ly/artifact-uploader | php + diff --git a/vendor/jms/parser-lib/LICENSE b/vendor/jms/parser-lib/LICENSE new file mode 100644 index 0000000000..f49a4e16e6 --- /dev/null +++ b/vendor/jms/parser-lib/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/vendor/jms/parser-lib/README.md b/vendor/jms/parser-lib/README.md new file mode 100644 index 0000000000..75e9cecd88 --- /dev/null +++ b/vendor/jms/parser-lib/README.md @@ -0,0 +1,4 @@ +Parser Library +============== + +Learn more about it in its [documentation](http://jmsyst.com/libs/parser-lib). diff --git a/vendor/jms/parser-lib/composer.json b/vendor/jms/parser-lib/composer.json new file mode 100644 index 0000000000..417661d3e8 --- /dev/null +++ b/vendor/jms/parser-lib/composer.json @@ -0,0 +1,18 @@ +{ + "name": "jms/parser-lib", + "description": "A library for easily creating recursive-descent parsers.", + "license": "Apache2", + "require": { + "phpoption/phpoption": ">=0.9,<2.0-dev" + }, + "autoload": { + "psr-0": { + "JMS\\": "src/" + } + }, + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + } +} \ No newline at end of file diff --git a/vendor/jms/parser-lib/composer.lock b/vendor/jms/parser-lib/composer.lock new file mode 100644 index 0000000000..fe331e6ccf --- /dev/null +++ b/vendor/jms/parser-lib/composer.lock @@ -0,0 +1,62 @@ +{ + "hash": "804f267fbd2c33067f6cafd3576f70dd", + "packages": [ + { + "name": "phpoption/phpoption", + "version": "0.9.0", + "source": { + "type": "git", + "url": "git://github.com/schmittjoh/php-option", + "reference": "0.9.0" + }, + "dist": { + "type": "zip", + "url": "https://github.com/schmittjoh/php-option/archive/0.9.0.zip", + "reference": "0.9.0", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "3.7.*" + }, + "time": "2012-11-12 08:25:35", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "PhpOption\\": "src/" + } + }, + "license": [ + "Apache2" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "http://jmsyst.com", + "role": "Developer of wrapped JMSSerializerBundle" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "php", + "language", + "type", + "option" + ] + } + ], + "packages-dev": [ + + ], + "aliases": [ + + ], + "minimum-stability": "stable", + "stability-flags": [ + + ] +} diff --git a/vendor/jms/parser-lib/doc/LICENSE b/vendor/jms/parser-lib/doc/LICENSE new file mode 100644 index 0000000000..a9aba5c6c9 --- /dev/null +++ b/vendor/jms/parser-lib/doc/LICENSE @@ -0,0 +1,55 @@ +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + +1. Definitions + + "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License. + "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined above) for the purposes of this License. + "Distribute" means to make available to the public the original and copies of the Work through sale or other transfer of ownership. + "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License. + "Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast. + "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work. + "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. + "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images. + "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium. + +2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: + + to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections; and, + to Distribute and Publicly Perform the Work including as incorporated in Collections. + +The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats, but otherwise you have no rights to make Adaptations. Subject to 8(f), all rights not expressly granted by Licensor are hereby reserved, including but not limited to the rights set forth in Section 4(d). + +4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: + + You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(c), as requested. + You may not exercise any of the rights granted to You in Section 3 above in any manner that is primarily intended for or directed toward commercial advantage or private monetary compensation. The exchange of the Work for other copyrighted works by means of digital file-sharing or otherwise shall not be considered to be intended for or directed toward commercial advantage or private monetary compensation, provided there is no payment of any monetary compensation in connection with the exchange of copyrighted works. + If You Distribute, or Publicly Perform the Work or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work. The credit required by this Section 4(c) may be implemented in any reasonable manner; provided, however, that in the case of a Collection, at a minimum such credit will appear, if a credit for all contributing authors of Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties. + + For the avoidance of doubt: + Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; + Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License if Your exercise of such rights is for a purpose or use which is otherwise than noncommercial as permitted under Section 4(b) and otherwise waives the right to collect royalties through any statutory or compulsory licensing scheme; and, + Voluntary License Schemes. The Licensor reserves the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License that is for a purpose or use which is otherwise than noncommercial as permitted under Section 4(b). + Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. + Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. + +8. Miscellaneous + + Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. + If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. + This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. + The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law. diff --git a/vendor/jms/parser-lib/doc/index.rst b/vendor/jms/parser-lib/doc/index.rst new file mode 100644 index 0000000000..da19058140 --- /dev/null +++ b/vendor/jms/parser-lib/doc/index.rst @@ -0,0 +1,108 @@ +Parser Library +============== + +This library allows you to easily implement recursive-descent parsers. + +Installation +------------ +You can install this library through composer: + +.. code-block :: bash + + composer require jms/parser-lib + +or add it to your ``composer.json`` file directly. + +Example +------- +Let's assume that you would like to write a parser for a calculator. For simplicity +sake, we will assume that the parser would already return the result of the +calculation. Inputs could look like this ``1 + 1`` and we would expect ``2`` as +a result. + +The first step, is to create a lexer which breaks the input string up into +individual tokens which can then be consumed by the parser. This library provides +a convenient class for simple problems which we will use:: + + $lexer = new \JMS\Parser\SimpleLexer( + '/ + # Numbers + ([0-9]+) + + # Do not surround with () because whitespace is not meaningful for + # our purposes. + |\s+ + + # Operators; we support only + and - + |(+)|(-) + /x', // The x modifier tells PCRE to ignore whitespace in the regex above. + + // This maps token types to a human readable name. + array(0 => 'T_UNKNOWN', 1 => 'T_INT', 2 => 'T_PLUS', 3 => 'T_MINUS'), + + // This function tells the lexer which type a token has. The first element is + // an integer from the map above, the second element the normalized value. + function($value) { + if ('+' === $value) { + return array(2, '+'); + } + if ('-' === $value) { + return array(3, '-'); + } + if (is_numeric($value)) { + return array(1, (integer) $value); + } + + return array(0, $value); + } + ); + +Now the second step, is to create the parser which can consume the tokens once +the lexer has split them:: + + class MyParser extends \JMS\Parser\AbstractParser + { + const T_UNKNOWN = 0; + const T_INT = 1; + const T_PLUS = 2; + const T_MINUS = 3; + + public function parseInternal() + { + $result = $this->match(self::T_INT); + + while ($this->lexer->isNextAny(array(self::T_PLUS, self::T_MINUS))) { + if ($this->lexer->isNext(self::T_PLUS)) { + $this->lexer->moveNext(); + $result += $this->match(self::T_INT); + } else if ($this->lexer->isNext(self::T_MINUS)) { + $this->lexer->moveNext(); + $result -= $this->match(self::T_INT); + } else { + throw new \LogicException('Previous ifs were exhaustive.'); + } + } + + return $result; + } + } + + $parser = new MyParser($lexer); + $parser->parse('1 + 1'); // int(2) + $parser->parse('5 + 10 - 4'); // int(11) + +That's it. Now you can perform basic operations already. If you like you can now +also replace the hard-coded integers in the lexer with the class constants of the +parser. + +License +------- + +The code is released under the business-friendly `Apache2 license`_. + +Documentation is subject to the `Attribution-NonCommercial-NoDerivs 3.0 Unported +license`_. + +.. _Apache2 license: http://www.apache.org/licenses/LICENSE-2.0.html +.. _Attribution-NonCommercial-NoDerivs 3.0 Unported license: http://creativecommons.org/licenses/by-nc-nd/3.0/ + diff --git a/vendor/jms/parser-lib/phpunit.xml.dist b/vendor/jms/parser-lib/phpunit.xml.dist new file mode 100644 index 0000000000..225f970e65 --- /dev/null +++ b/vendor/jms/parser-lib/phpunit.xml.dist @@ -0,0 +1,25 @@ + + + + + + ./tests/JMS/ + + + + + + performance + + + diff --git a/vendor/jms/parser-lib/src/JMS/Parser/AbstractLexer.php b/vendor/jms/parser-lib/src/JMS/Parser/AbstractLexer.php new file mode 100644 index 0000000000..420326010b --- /dev/null +++ b/vendor/jms/parser-lib/src/JMS/Parser/AbstractLexer.php @@ -0,0 +1,163 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Parser; + +/** + * Abstract Lexer. + * + * @author Johannes M. Schmitt + */ +abstract class AbstractLexer +{ + public $token; + public $next; + + private $i; + private $peek; + private $tokens; + + /** + * Returns the name of the given token. + * + * @param integer $type + * + * @return string + */ + public function getName($type) + { + $ref = new \ReflectionClass($this); + foreach ($ref->getConstants() as $name => $value) { + if ($value === $type) { + return $name; + } + } + + throw new \InvalidArgumentException(sprintf('There is no token with value %s.', json_encode($type))); + } + + public function setInput($str) + { + $tokens = preg_split($this->getRegex(), $str, null, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY | PREG_SPLIT_OFFSET_CAPTURE); + + $this->tokens = array(); + foreach ($tokens as $token) { + list($token[2], $token[0]) = $this->determineTypeAndValue($token[0]); + $this->tokens[] = $token; + } + + $this->reset(); + } + + public function reset() + { + $this->i = -1; + $this->peek = 0; + $this->token = $this->next = null; + $this->moveNext(); + } + + /** + * Moves the pointer one token forward. + * + * @return boolean if we have not yet reached the end of the input + */ + public function moveNext() + { + $this->peek = 0; + $this->token = $this->next; + $this->next = isset($this->tokens[++$this->i]) ? $this->tokens[$this->i] : null; + + return null !== $this->next; + } + + /** + * Skips the token stream until a token of the given type. + * + * @param integer $type + * + * @return boolean true if a token of the passed type was found, false otherwise. + */ + public function skipUntil($type) + { + while ( ! $this->isNext($type) && $this->moveNext()); + + if ( ! $this->isNext($type)) { + throw new \RuntimeException(sprintf('Could not find the token %s.', $this->getName($type))); + } + } + + /** + * @param integer $type + * + * @return boolean + */ + public function isNext($type) + { + return null !== $this->next && $type === $this->next[2]; + } + + /** + * @param array $types + * + * @return boolean + */ + public function isNextAny(array $types) + { + if (null === $this->next) { + return false; + } + + foreach ($types as $type) { + if ($type === $this->next[2]) { + return true; + } + } + + return false; + } + + /** + * @return \PhpOption\Option<[string,integer,integer]> + */ + public function peek() + { + if ( ! isset($this->tokens[$this->i + (++$this->peek)])) { + return \PhpOption\None::create(); + } + + return new \PhpOption\Some($this->tokens[$this->i + $this->peek]); + } + + /** + * @return string + */ + abstract protected function getRegex(); + + /** + * Determines the type of the given value. + * + * This method may also modify the passed value for example to cast them to + * a different PHP type where necessary. + * + * @param string $value + * + * @return array a tupel of type and normalized value + */ + abstract protected function determineTypeAndValue($value); +} diff --git a/vendor/jms/parser-lib/src/JMS/Parser/AbstractParser.php b/vendor/jms/parser-lib/src/JMS/Parser/AbstractParser.php new file mode 100644 index 0000000000..f276d0e757 --- /dev/null +++ b/vendor/jms/parser-lib/src/JMS/Parser/AbstractParser.php @@ -0,0 +1,128 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Parser; + +/** + * Base Parser which provides some useful parsing methods intended for sub-classing. + * + * @author Johannes M. Schmitt + */ +abstract class AbstractParser +{ + protected $lexer; + protected $context; + + public function __construct(AbstractLexer $lexer) + { + $this->lexer = $lexer; + } + + /** + * Parses the given input. + * + * @param string $str + * @param string $context parsing context (allows to produce better error messages) + * + * @return mixed + */ + public function parse($str, $context = null) + { + $this->lexer->setInput($str); + $this->context = $context; + + $rs = $this->parseInternal(); + + if (null !== $this->lexer->next) { + $this->syntaxError('end of input'); + } + + return $rs; + } + + /** + * @return mixed + */ + abstract protected function parseInternal(); + + /** + * Matches a token, and returns its value. + * + * @param integer $type + * + * @return mixed the value of the matched token + */ + protected function match($type) + { + if ( ! $this->lexer->isNext($type)) { + $this->syntaxError($this->lexer->getName($type)); + } + + $this->lexer->moveNext(); + + return $this->lexer->token[0]; + } + + /** + * Matches any of the passed tokens, and returns the matched token's value. + * + * @param array $types + * + * @return mixed + */ + protected function matchAny(array $types) + { + if ( ! $this->lexer->isNextAny($types)) { + $this->syntaxError('any of '.implode(' or ', array_map(array($this->lexer, 'getName'), $types))); + } + + $this->lexer->moveNext(); + + return $this->lexer->token[0]; + } + + /** + * Raises a syntax error exception. + * + * @param string $expectedDesc A human understandable explanation what was expected + * @param array $actualToken The token that was found. If not given, next token will be assumed. + */ + protected function syntaxError($expectedDesc, $actualToken = null) + { + if (null === $actualToken) { + $actualToken = $this->lexer->next; + } + if (null === $actualToken) { + $actualDesc = 'end of input'; + } else if ($actualToken[1] === 0) { + $actualDesc = sprintf('"%s" of type %s at beginning of input', $actualToken[0], $this->lexer->getName($actualToken[2])); + } else { + $actualDesc = sprintf('"%s" of type %s at position %d (0-based)', $actualToken[0], $this->lexer->getName($actualToken[2]), $actualToken[1]); + } + + $ex = new SyntaxErrorException(sprintf('Expected %s, but got %s%s.', $expectedDesc, $actualDesc, $this->context ? ' '.$this->context : '')); + if (null !== $actualToken) { + $ex->setActualToken($actualToken); + } + if (null !== $this->context) { + $ex->setContext($this->context); + } + + throw $ex; + } +} \ No newline at end of file diff --git a/vendor/jms/parser-lib/src/JMS/Parser/SimpleLexer.php b/vendor/jms/parser-lib/src/JMS/Parser/SimpleLexer.php new file mode 100644 index 0000000000..8be10522bb --- /dev/null +++ b/vendor/jms/parser-lib/src/JMS/Parser/SimpleLexer.php @@ -0,0 +1,57 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Parser; + +/** + * The simple lexer is a fully usable lexer that does not require sub-classing. + * + * @author Johannes M. Schmitt + */ +class SimpleLexer extends AbstractLexer +{ + private $regex; + private $callable; + private $tokenNames; + + public function __construct($regex, array $tokenNames, $typeCallable) + { + $this->regex = $regex; + $this->callable = $typeCallable; + $this->tokenNames = $tokenNames; + } + + public function getName($type) + { + if ( ! isset($this->tokenNames[$type])) { + throw new \InvalidArgumentException(sprintf('There is no token with type %s.', json_encode($type))); + } + + return $this->tokenNames[$type]; + } + + protected function getRegex() + { + return $this->regex; + } + + protected function determineTypeAndValue($value) + { + return call_user_func($this->callable, $value); + } +} \ No newline at end of file diff --git a/vendor/jms/parser-lib/src/JMS/Parser/SyntaxErrorException.php b/vendor/jms/parser-lib/src/JMS/Parser/SyntaxErrorException.php new file mode 100644 index 0000000000..d05b8c9c0c --- /dev/null +++ b/vendor/jms/parser-lib/src/JMS/Parser/SyntaxErrorException.php @@ -0,0 +1,45 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Parser; + +class SyntaxErrorException extends \RuntimeException +{ + private $actualToken; + private $context; + + public function setActualToken(array $actualToken) + { + $this->actualToken = $actualToken; + } + + public function setContext($context) + { + $this->context = $context; + } + + public function getActualToken() + { + return $this->actualToken; + } + + public function getContext() + { + return $this->context; + } +} diff --git a/vendor/jms/parser-lib/tests/JMS/Parser/Tests/AbstractLexerTest.php b/vendor/jms/parser-lib/tests/JMS/Parser/Tests/AbstractLexerTest.php new file mode 100644 index 0000000000..83f8b3b527 --- /dev/null +++ b/vendor/jms/parser-lib/tests/JMS/Parser/Tests/AbstractLexerTest.php @@ -0,0 +1,121 @@ +lexer->setInput('"foo" 1234'); + + $this->assertNull($this->lexer->token); + $this->assertNotNull($this->lexer->next); + + $this->assertAttributeEquals(array( + array('foo', 0, self::T_STRING), + array(1234, 7, self::T_INTEGER), + ), 'tokens', $this->lexer); + } + + public function testMoveNext() + { + $this->lexer->setInput('1 2 3'); + $this->assertNull($this->lexer->token); + + $this->assertTrue($this->lexer->moveNext()); + $this->assertValue(1, $this->lexer->token); + + $this->assertTrue($this->lexer->moveNext()); + $this->assertValue(2, $this->lexer->token); + + $this->assertFalse($this->lexer->moveNext()); + $this->assertValue(3, $this->lexer->token); + } + + /** + * @expectedException \InvalidArgumentException + */ + public function testSkipUntilWithNonExistent() + { + $this->lexer->setInput('1 2 3'); + $this->lexer->skipUntil(self::T_STRING); + } + + public function testSkipUntil() + { + $this->lexer->setInput('1 "foo"'); + $this->assertNull($this->lexer->skipUntil(self::T_STRING)); + $this->assertValue(1, $this->lexer->token); + $this->assertValue('foo', $this->lexer->next); + } + + public function testIsNext() + { + $this->lexer->setInput('1'); + $this->assertTrue($this->lexer->isNext(self::T_INTEGER)); + $this->assertFalse($this->lexer->isNext(self::T_COMMA)); + } + + public function testIsNextAny() + { + $this->lexer->setInput('1'); + $this->assertTrue($this->lexer->isNextAny(array(self::T_COMMA, self::T_INTEGER))); + $this->assertFalse($this->lexer->isNextAny(array(self::T_COMMA, self::T_STRING))); + } + + public function testPeek() + { + $this->lexer->setInput('1 2 3'); + + $this->assertValue(1, $this->lexer->next); + $this->assertValue(2, $this->lexer->peek()->get()); + + $this->assertValue(1, $this->lexer->next); + $this->assertValue(3, $this->lexer->peek()->get()); + + $this->assertValue(1, $this->lexer->next); + $this->assertTrue($this->lexer->moveNext()); + $this->assertValue(2, $this->lexer->next); + $this->assertValue(3, $this->lexer->peek()->get()); + $this->assertValue(2, $this->lexer->next); + } + + private function assertValue($expected, $actualToken) + { + $this->assertNotNull($actualToken); + $this->assertSame($expected, $actualToken[0]); + } + + protected function setUp() + { + $this->lexer = $this->getMockForAbstractClass('JMS\Parser\AbstractLexer'); + $this->lexer->expects($this->any()) + ->method('getRegex') + ->will($this->returnValue('/("(?:[^"]*|(?<=\\)"))*")|([0-9]+)|\s+|(.)/i')); + $this->lexer->expects($this->any()) + ->method('determineTypeAndValue') + ->will($this->returnCallback(function($value) { + if (',' === $value) { + return array(AbstractLexerTest::T_COMMA, $value); + } + + if ('"' === $value[0]) { + return array(AbstractLexerTest::T_STRING, substr($value, 1, -1)); + } + + if (preg_match('/^[0-9]+$/', $value)) { + return array(AbstractLexerTest::T_INTEGER, (integer) $value); + } + + return array(AbstractLexerTest::T_UNKNOWN, $value); + })); + } +} diff --git a/vendor/jms/parser-lib/tests/JMS/Parser/Tests/AbstractParserTest.php b/vendor/jms/parser-lib/tests/JMS/Parser/Tests/AbstractParserTest.php new file mode 100644 index 0000000000..ea5b48a613 --- /dev/null +++ b/vendor/jms/parser-lib/tests/JMS/Parser/Tests/AbstractParserTest.php @@ -0,0 +1,87 @@ +assertSame(2, $this->parser->parse('1 + 1')); + $this->assertSame(5, $this->parser->parse('1 + 1 + 4 - 1')); + } + + /** + * @expectedException JMS\Parser\SyntaxErrorException + * @expectedExceptionMessage Expected T_INT, but got end of input. + */ + public function testUnexpectedEnd() + { + $this->parser->parse('1 + '); + } + + protected function setUp() + { + $this->lexer = $lexer = new \JMS\Parser\SimpleLexer( + '/([0-9]+)|\s+|(.)/', + array(0 => 'T_UNKNOWN', 1 => 'T_INT', 100 => 'T_PLUS', 101 => 'T_MINUS'), + function($value) { + if ('+' === $value) { + return array(AbstractParserTest::T_PLUS, $value); + } + if ('-' === $value) { + return array(AbstractParserTest::T_MINUS, $value); + } + + // We would loose information on doubles here, but for this test it + // does not matter anyway. + if (is_numeric($value)) { + return array(AbstractParserTest::T_INT, (integer) $value); + } + + return AbstractParserTest::T_UNKNOWN; + } + ); + + $this->parser = $parser = $this->getMockBuilder('JMS\Parser\AbstractParser') + ->setConstructorArgs(array($this->lexer)) + ->getMockForAbstractClass(); + + $match = function($type) use ($parser) { + $ref = new \ReflectionMethod($parser, 'match'); + $ref->setAccessible(true); + + return $ref->invoke($parser, $type); + }; + + $this->parser->expects($this->any()) + ->method('parseInternal') + ->will($this->returnCallback(function() use ($lexer, $match) { + // Result :== Number ( ("+"|"-") Number )* + + $result = $match(AbstractParserTest::T_INT); + while ($lexer->isNextAny(array(AbstractParserTest::T_PLUS, AbstractParserTest::T_MINUS))) { + if ($lexer->isNext(AbstractParserTest::T_PLUS)) { + $lexer->moveNext(); + + $result += $match(AbstractParserTest::T_INT); + } else if ($lexer->isNext(AbstractParserTest::T_MINUS)) { + $lexer->moveNext(); + + $result -= $match(AbstractParserTest::T_INT); + } else { + throw new \LogicException('Previous ifs were exhaustive.'); + } + } + + return $result; + })); + } +} \ No newline at end of file diff --git a/vendor/jms/parser-lib/tests/bootstrap.php b/vendor/jms/parser-lib/tests/bootstrap.php new file mode 100644 index 0000000000..37d8f3fd73 --- /dev/null +++ b/vendor/jms/parser-lib/tests/bootstrap.php @@ -0,0 +1,8 @@ +xmlAttribute in XmlDriver.php [\#422](https://github.com/schmittjoh/serializer/issues/422) +- Access level propose for Handler/DateHandler.php [\#386](https://github.com/schmittjoh/serializer/issues/386) +- Type DateTime and Timestamp \(U format\) [\#343](https://github.com/schmittjoh/serializer/issues/343) + +**Merged pull requests:** + +- Update PHPDocs [\#736](https://github.com/schmittjoh/serializer/pull/736) ([gnat42](https://github.com/gnat42)) + +## [1.6.0](https://github.com/schmittjoh/serializer/tree/1.6.0) (2017-03-24) +**Implemented enhancements:** + +- Add DateTimeImmutable support to DateHandler [\#543](https://github.com/schmittjoh/serializer/issues/543) + +**Fixed bugs:** + +- Virtual property having type overriden by doctrine metadata [\#276](https://github.com/schmittjoh/serializer/issues/276) + +**Closed issues:** + +- Serialize a subclass [\#735](https://github.com/schmittjoh/serializer/issues/735) +- How to handle Doctrine not found entity ? [\#731](https://github.com/schmittjoh/serializer/issues/731) +- Regression with 1.5.0 =\> Undefined offset 15 [\#715](https://github.com/schmittjoh/serializer/issues/715) +- detect serialisation without groups set [\#546](https://github.com/schmittjoh/serializer/issues/546) +- Introducing the NormalizerInterface [\#537](https://github.com/schmittjoh/serializer/issues/537) +- How to set JSON serialization options? [\#535](https://github.com/schmittjoh/serializer/issues/535) +- @MaxDepth doesn't seem to be working [\#522](https://github.com/schmittjoh/serializer/issues/522) +- max\_depth in YML config is ignored [\#498](https://github.com/schmittjoh/serializer/issues/498) +- Dynamic property type annotation [\#436](https://github.com/schmittjoh/serializer/issues/436) +- How to deserialize JSON if property might have a list of subobjects? [\#355](https://github.com/schmittjoh/serializer/issues/355) +- Object to array normalization [\#354](https://github.com/schmittjoh/serializer/issues/354) +- Serialize Doctrine object without references [\#353](https://github.com/schmittjoh/serializer/issues/353) +- Post\_serialize doesn't serialize relation! [\#236](https://github.com/schmittjoh/serializer/issues/236) +- parsing string to date [\#217](https://github.com/schmittjoh/serializer/issues/217) +- Discriminator is not exposed when using a group exclusion strategy [\#157](https://github.com/schmittjoh/serializer/issues/157) + +## [1.6.0-RC1](https://github.com/schmittjoh/serializer/tree/1.6.0-RC1) (2017-03-14) +**Implemented enhancements:** + +- Add symfony expression in exclusions/expositions [\#406](https://github.com/schmittjoh/serializer/issues/406) +- check that cache directory was not created before throwing exception [\#729](https://github.com/schmittjoh/serializer/pull/729) ([mente](https://github.com/mente)) +- \#720 - Adding support for DateInterval deserialization [\#721](https://github.com/schmittjoh/serializer/pull/721) ([c0ntax](https://github.com/c0ntax)) +- Expression language based virtual properties [\#708](https://github.com/schmittjoh/serializer/pull/708) ([goetas](https://github.com/goetas)) +- Xml namespaces improvements [\#644](https://github.com/schmittjoh/serializer/pull/644) ([goetas](https://github.com/goetas)) + +**Fixed bugs:** + +- Serialize correctly empty intervals according to ISO-8601 [\#722](https://github.com/schmittjoh/serializer/pull/722) ([goetas](https://github.com/goetas)) + +**Closed issues:** + +- Is it possible to achieve something like - shouldSerializeEmpty [\#725](https://github.com/schmittjoh/serializer/issues/725) +- How to handle DateTime serialization with fromArray method ? [\#723](https://github.com/schmittjoh/serializer/issues/723) +- DateInterval supported for serialization but not deserialization [\#720](https://github.com/schmittjoh/serializer/issues/720) +- Deserialization of collection when wraped by aditional xml tags [\#719](https://github.com/schmittjoh/serializer/issues/719) +- SerializedName based on a property value [\#716](https://github.com/schmittjoh/serializer/issues/716) +- Blank XML breaks XmlDeserializationVisitor error handling [\#701](https://github.com/schmittjoh/serializer/issues/701) +- Problem with FOSUserBundle ROLE serialization [\#690](https://github.com/schmittjoh/serializer/issues/690) +- Doctrine cache dependency when using setCacheDir [\#676](https://github.com/schmittjoh/serializer/issues/676) +- OneToOne entities are not deserialized if passing a nested one-to-one property [\#652](https://github.com/schmittjoh/serializer/issues/652) +- \[RFC\] Serialization refacotring [\#609](https://github.com/schmittjoh/serializer/issues/609) +- Object handler callback returns array, but serialized object = null [\#594](https://github.com/schmittjoh/serializer/issues/594) +- Cannot add @Discriminator field into specific @Group [\#557](https://github.com/schmittjoh/serializer/issues/557) +- Object check on SerializationContext::isVisiting\(\) [\#502](https://github.com/schmittjoh/serializer/issues/502) +- Define cdata and namespace for @XmlList elements [\#480](https://github.com/schmittjoh/serializer/issues/480) +- Serializer working with parent class [\#376](https://github.com/schmittjoh/serializer/issues/376) +- Add support for array format [\#374](https://github.com/schmittjoh/serializer/issues/374) +- Obtain VirtualProperty value using a service [\#359](https://github.com/schmittjoh/serializer/issues/359) +- make deserialisation of non existing id's configurable [\#333](https://github.com/schmittjoh/serializer/issues/333) +- HHVM compatibility issue with undefined property JMS\Serializer\Metadata\ClassMetadata::$inline [\#312](https://github.com/schmittjoh/serializer/issues/312) +- resources serialization [\#275](https://github.com/schmittjoh/serializer/issues/275) +- I'm receiving "Class ArrayCollection does not exist" when serializing \(temporarily solved with a workaround\) [\#274](https://github.com/schmittjoh/serializer/issues/274) +- Can't use handlers on strings \(and other simple types\) [\#194](https://github.com/schmittjoh/serializer/issues/194) +- composer.json update for doctrine [\#178](https://github.com/schmittjoh/serializer/issues/178) +- Use expression for virtual properties [\#171](https://github.com/schmittjoh/serializer/issues/171) +- Handle classes that implement collections \(e.g. ArrayObject\) and properties [\#137](https://github.com/schmittjoh/serializer/issues/137) +- Check CDATA is needed [\#136](https://github.com/schmittjoh/serializer/issues/136) +- property path support [\#22](https://github.com/schmittjoh/serializer/issues/22) + +**Merged pull requests:** + +- Include reference to cache [\#727](https://github.com/schmittjoh/serializer/pull/727) ([hyperized](https://github.com/hyperized)) + +## [1.5.0](https://github.com/schmittjoh/serializer/tree/1.5.0) (2017-02-14) +**Closed issues:** + +- Serialized DateTime instances are not valid ISO-8601 [\#713](https://github.com/schmittjoh/serializer/issues/713) +- Impossible to use discriminator field. Why we need StaticPropertyMetadata ? [\#705](https://github.com/schmittjoh/serializer/issues/705) +- Deserializing XMLList with Namespaces not \(always\) working as intended [\#695](https://github.com/schmittjoh/serializer/issues/695) + +## [1.5.0-RC1](https://github.com/schmittjoh/serializer/tree/1.5.0-RC1) (2017-01-19) +**Implemented enhancements:** + +- added support for xml-attributes as discriminators [\#692](https://github.com/schmittjoh/serializer/pull/692) ([twtinteractive](https://github.com/twtinteractive)) +- Added clearing previous libxml errors [\#688](https://github.com/schmittjoh/serializer/pull/688) ([zerkms](https://github.com/zerkms)) +- Prevent doctrine proxy loading for virtual types [\#684](https://github.com/schmittjoh/serializer/pull/684) ([goetas](https://github.com/goetas)) +- Implemented dynamic exclusion using symfony expression language [\#673](https://github.com/schmittjoh/serializer/pull/673) ([goetas](https://github.com/goetas)) + +**Fixed bugs:** + +- Deserializing XMLList with Namespaces not \(always\) working as intended [\#697](https://github.com/schmittjoh/serializer/pull/697) ([goetas](https://github.com/goetas)) + +**Closed issues:** + +- Groups logic [\#693](https://github.com/schmittjoh/serializer/issues/693) +- BC from 1.1.\* to ^1.2 [\#643](https://github.com/schmittjoh/serializer/issues/643) +- DoctrineProxySubscriber forces loading of the proxy even if custom handler exist [\#575](https://github.com/schmittjoh/serializer/issues/575) +- ConditionalExpose/Exclude annotation [\#540](https://github.com/schmittjoh/serializer/issues/540) +- Deprecated usage of ValidatorInterface [\#438](https://github.com/schmittjoh/serializer/issues/438) +- Missing addData in XmlSerializerVisitor makes it impossible to add data in serializer.post\_serialize event [\#235](https://github.com/schmittjoh/serializer/issues/235) +- Support JSON PATCH for updating object graph [\#231](https://github.com/schmittjoh/serializer/issues/231) +- Dynamic expose, aka 'fields' query param [\#195](https://github.com/schmittjoh/serializer/issues/195) + +**Merged pull requests:** + +- Added doc reference for disabling discriminator [\#699](https://github.com/schmittjoh/serializer/pull/699) ([dragosprotung](https://github.com/dragosprotung)) +- Use GroupsExclusionStrategy::DEFAULT\_GROUP instead default group. [\#694](https://github.com/schmittjoh/serializer/pull/694) ([Aliance](https://github.com/Aliance)) +- A possible fix for the \#688 [\#689](https://github.com/schmittjoh/serializer/pull/689) ([zerkms](https://github.com/zerkms)) +- Improved Symfony 3.x compatibility [\#682](https://github.com/schmittjoh/serializer/pull/682) ([goetas](https://github.com/goetas)) + +## [1.4.2](https://github.com/schmittjoh/serializer/tree/1.4.2) (2016-11-13) +**Fixed bugs:** + +- Warning: JMS\Serializer\XmlDeserializationVisitor::visitArray\(\): Node no longer exists [\#674](https://github.com/schmittjoh/serializer/issues/674) +- Fixed xml arrays with namespaced entry triggers error [\#675](https://github.com/schmittjoh/serializer/pull/675) ([goetas](https://github.com/goetas)) + +**Closed issues:** + +- Max depth produces array of nulls [\#671](https://github.com/schmittjoh/serializer/issues/671) + +## [1.4.1](https://github.com/schmittjoh/serializer/tree/1.4.1) (2016-11-02) +**Fixed bugs:** + +- Groups context might be not initialized [\#669](https://github.com/schmittjoh/serializer/pull/669) ([goetas](https://github.com/goetas)) + +**Closed issues:** + +- Warning: Invalid argument supplied for foreach\(\) on getCurrentPath method [\#668](https://github.com/schmittjoh/serializer/issues/668) + +## [1.4.0](https://github.com/schmittjoh/serializer/tree/1.4.0) (2016-10-31) +**Implemented enhancements:** + +- Document the implied 'Default' property group when no group is specified [\#661](https://github.com/schmittjoh/serializer/pull/661) ([akoebbe](https://github.com/akoebbe)) +- Allow discriminator map in the middle of the hierarchy when deserializing [\#659](https://github.com/schmittjoh/serializer/pull/659) ([goetas](https://github.com/goetas)) +- Handle both int and integer [\#657](https://github.com/schmittjoh/serializer/pull/657) ([Aliance](https://github.com/Aliance)) + +**Fixed bugs:** + +- Deserialization fails when discriminator base class extends another class [\#182](https://github.com/schmittjoh/serializer/issues/182) +- Xml setters ignored when deserializing [\#665](https://github.com/schmittjoh/serializer/pull/665) ([goetas](https://github.com/goetas)) + +**Closed issues:** + +- Move `FormErrorHandler` to the bundle [\#664](https://github.com/schmittjoh/serializer/issues/664) +- Not compatible with Symfony 3's Controller::json\(\) [\#663](https://github.com/schmittjoh/serializer/issues/663) +- Class name not reflecting in serialized json [\#662](https://github.com/schmittjoh/serializer/issues/662) +- YML virtual\_properties no group exlcusion [\#656](https://github.com/schmittjoh/serializer/issues/656) +- \[RFC\] Introduce normalizer\denormalizer interface [\#646](https://github.com/schmittjoh/serializer/issues/646) +- Plain arrays are serialized \(normalized\) as "objects", ignoring serializeNull [\#641](https://github.com/schmittjoh/serializer/issues/641) +- serializer doesn't serialize traits [\#638](https://github.com/schmittjoh/serializer/issues/638) +- Add metadata informations [\#637](https://github.com/schmittjoh/serializer/issues/637) +- Unexpected results when serializing arrays containing null value elements [\#593](https://github.com/schmittjoh/serializer/issues/593) +- Allow to set default serialization context when building serializer [\#528](https://github.com/schmittjoh/serializer/issues/528) +- Enable Sourcegraph [\#455](https://github.com/schmittjoh/serializer/issues/455) +- Use different accessor for each group [\#420](https://github.com/schmittjoh/serializer/issues/420) +- GenericSerializationVisitor and shouldSerializeNull [\#360](https://github.com/schmittjoh/serializer/issues/360) +- Specify group along with MaxDepth [\#150](https://github.com/schmittjoh/serializer/issues/150) +- Allow Post Serialize Event to overwrite existing data [\#129](https://github.com/schmittjoh/serializer/issues/129) +- Warning: array\_key\_exists\(\) expects parameter 2 to be array, string given [\#70](https://github.com/schmittjoh/serializer/issues/70) + +**Merged pull requests:** + +- Nullable array inconsistency [\#660](https://github.com/schmittjoh/serializer/pull/660) ([goetas](https://github.com/goetas)) +- Fixed PHP 7.0.11 BC break \(or bugfix\) [\#658](https://github.com/schmittjoh/serializer/pull/658) ([goetas](https://github.com/goetas)) +- Renamed replaceData to setData [\#653](https://github.com/schmittjoh/serializer/pull/653) ([goetas](https://github.com/goetas)) +- add required sqlite extension for developing [\#649](https://github.com/schmittjoh/serializer/pull/649) ([scasei](https://github.com/scasei)) +- Run serialization benchmarks in the build process [\#647](https://github.com/schmittjoh/serializer/pull/647) ([goetas](https://github.com/goetas)) +- Alcalyn feature default serializer context [\#645](https://github.com/schmittjoh/serializer/pull/645) ([goetas](https://github.com/goetas)) +- Add format output option [\#640](https://github.com/schmittjoh/serializer/pull/640) ([AyrtonRicardo](https://github.com/AyrtonRicardo)) +- Remove deprecated FileCacheReader for doctrine annotations [\#634](https://github.com/schmittjoh/serializer/pull/634) ([goetas](https://github.com/goetas)) +- Added tests to ensure SerializeNull policy [\#633](https://github.com/schmittjoh/serializer/pull/633) ([goetas](https://github.com/goetas)) +- Fix inheritance of discriminators on Doctrine entities [\#382](https://github.com/schmittjoh/serializer/pull/382) ([xoob](https://github.com/xoob)) +- Allow Post Serialize Event to overwrite existing data [\#273](https://github.com/schmittjoh/serializer/pull/273) ([jockri](https://github.com/jockri)) + +## [1.3.1](https://github.com/schmittjoh/serializer/tree/1.3.1) (2016-08-23) +**Closed issues:** + +- \[Idea\] Inline name [\#629](https://github.com/schmittjoh/serializer/issues/629) +- indexBy property doesn't work since 1.2.0 [\#618](https://github.com/schmittjoh/serializer/issues/618) +- Composer deps issue [\#494](https://github.com/schmittjoh/serializer/issues/494) +- PHP 7 compatability issue [\#478](https://github.com/schmittjoh/serializer/issues/478) +- Add new tag \(upgrade packagist\) [\#461](https://github.com/schmittjoh/serializer/issues/461) +- Custom Type Handler for String Values [\#384](https://github.com/schmittjoh/serializer/issues/384) +- serializer ignores properties added by traits [\#313](https://github.com/schmittjoh/serializer/issues/313) +- Skip an element during Xml deserialization process [\#229](https://github.com/schmittjoh/serializer/issues/229) +- Using serializer for JSON serialising [\#223](https://github.com/schmittjoh/serializer/issues/223) +- No way to serialize binary data with a custom type [\#202](https://github.com/schmittjoh/serializer/issues/202) +- Automatic mapping of properties [\#200](https://github.com/schmittjoh/serializer/issues/200) +- Maybe the serializer should also allow the legal literals {1, 0} for booleans [\#198](https://github.com/schmittjoh/serializer/issues/198) +- Customize how Booleans are serialized [\#180](https://github.com/schmittjoh/serializer/issues/180) +- Problem with deserialize related entity [\#123](https://github.com/schmittjoh/serializer/issues/123) +- serialized\_name does not work in yaml [\#118](https://github.com/schmittjoh/serializer/issues/118) + +**Merged pull requests:** + +- Revert "Default `$serializeNull` to false" [\#630](https://github.com/schmittjoh/serializer/pull/630) ([goetas](https://github.com/goetas)) + +## [1.3.0](https://github.com/schmittjoh/serializer/tree/1.3.0) (2016-08-17) +**Closed issues:** + +- problems with xml namespaces after update [\#621](https://github.com/schmittjoh/serializer/issues/621) +- Trying to decorate a member to ArrayCollection but gets an error when deserilizing because composer didn't download the class from doctrine. [\#596](https://github.com/schmittjoh/serializer/issues/596) +- Missing doctrine/common requirement ? [\#517](https://github.com/schmittjoh/serializer/issues/517) +- PHP Fatal error: Using $this when not in object context in JMS/Serializer/Serializer.php on line 99 [\#441](https://github.com/schmittjoh/serializer/issues/441) +- custom collection handler [\#415](https://github.com/schmittjoh/serializer/issues/415) +- Exclude annotation not preventing attempt to find public methods when using AccessType [\#367](https://github.com/schmittjoh/serializer/issues/367) +- serializer.pre\_serialize event only thrown on objects/classes [\#337](https://github.com/schmittjoh/serializer/issues/337) +- Installing through composer gets "Segmentation fault" [\#308](https://github.com/schmittjoh/serializer/issues/308) +- Erroneous data format for unserializing... [\#283](https://github.com/schmittjoh/serializer/issues/283) +- DoctrineObjectConstructor should skip empty identifier field [\#193](https://github.com/schmittjoh/serializer/issues/193) + +**Merged pull requests:** + +- Added public `hasData` function to check if a data key already have been added. [\#625](https://github.com/schmittjoh/serializer/pull/625) ([goetas](https://github.com/goetas)) +- $context is not used [\#622](https://github.com/schmittjoh/serializer/pull/622) ([olvlvl](https://github.com/olvlvl)) +- Fix Doctrine PHPCR ODM 2.0 compatibility [\#605](https://github.com/schmittjoh/serializer/pull/605) ([wouterj](https://github.com/wouterj)) +- Introducing NormalizerInterface [\#592](https://github.com/schmittjoh/serializer/pull/592) ([alcalyn](https://github.com/alcalyn)) +- Fixed type-hinting [\#586](https://github.com/schmittjoh/serializer/pull/586) ([jgendera](https://github.com/jgendera)) +- Fix multiple handler callbacks in YamlDriver [\#515](https://github.com/schmittjoh/serializer/pull/515) ([mpajunen](https://github.com/mpajunen)) +- Fixed minor typos [\#364](https://github.com/schmittjoh/serializer/pull/364) ([sdaoudi](https://github.com/sdaoudi)) +- Default `$serializeNull` to false [\#317](https://github.com/schmittjoh/serializer/pull/317) ([steveYeah](https://github.com/steveYeah)) +- Missing attribute 'xml-value' in XML Reference [\#269](https://github.com/schmittjoh/serializer/pull/269) ([holtkamp](https://github.com/holtkamp)) +- Removed unnecessary use statement [\#262](https://github.com/schmittjoh/serializer/pull/262) ([dunglas](https://github.com/dunglas)) + +## [1.2.0](https://github.com/schmittjoh/serializer/tree/1.2.0) (2016-08-03) +**Implemented enhancements:** + +- Issue543 - Adding DateTimeImmutable support [\#635](https://github.com/schmittjoh/serializer/pull/635) ([toby-griffiths](https://github.com/toby-griffiths)) + +**Fixed bugs:** + +- Fix xml-attribute-map for the xml driver [\#595](https://github.com/schmittjoh/serializer/pull/595) ([romantomchak](https://github.com/romantomchak)) +- Fix warning array\_key\_exists in deserialization. [\#398](https://github.com/schmittjoh/serializer/pull/398) ([leonnleite](https://github.com/leonnleite)) +- \#367 Exclude annotation not preventing attempt to find public methods when using AccessType [\#397](https://github.com/schmittjoh/serializer/pull/397) ([Strate](https://github.com/Strate)) + +**Closed issues:** + +- XML serialisation performance vs. SimpleXML? [\#606](https://github.com/schmittjoh/serializer/issues/606) +- Undefined Offset 21 - PropertyMetadata \(master\) [\#581](https://github.com/schmittjoh/serializer/issues/581) +- Invalid null serialization in arrays [\#571](https://github.com/schmittjoh/serializer/issues/571) +- List Polymorphic with XML Deserialization [\#568](https://github.com/schmittjoh/serializer/issues/568) +- Serialize null values as empty string [\#566](https://github.com/schmittjoh/serializer/issues/566) +- Type mismatch should throw an exception instead of coercing when deserializing JSON [\#561](https://github.com/schmittjoh/serializer/issues/561) +- Serialize to array [\#518](https://github.com/schmittjoh/serializer/issues/518) +- AnnotationDriver Exception on Missing Setter/Getter even on @Exclude'd Properties [\#516](https://github.com/schmittjoh/serializer/issues/516) +- Arrays are serialized as objects like {"0":... } when data contains empty objects [\#488](https://github.com/schmittjoh/serializer/issues/488) +- Tag new release [\#465](https://github.com/schmittjoh/serializer/issues/465) +- Forcing no scientific notation for larg number, type double [\#405](https://github.com/schmittjoh/serializer/issues/405) +- PHP \< 5.3.9 BC break [\#383](https://github.com/schmittjoh/serializer/issues/383) +- Ignoring a tag when deserializing [\#352](https://github.com/schmittjoh/serializer/issues/352) + +**Merged pull requests:** + +- Allow to not skip empty not inline array root node [\#611](https://github.com/schmittjoh/serializer/pull/611) ([goetas](https://github.com/goetas)) +- Allow to use custom serializer with primitive type [\#610](https://github.com/schmittjoh/serializer/pull/610) ([goetas](https://github.com/goetas)) +- Composer is not able to resolve a dependency [\#608](https://github.com/schmittjoh/serializer/pull/608) ([goetas](https://github.com/goetas)) +- Test on Travis always high and low deps [\#584](https://github.com/schmittjoh/serializer/pull/584) ([goetas](https://github.com/goetas)) +- Update Symfony validator and allow PHPUnit 7 [\#583](https://github.com/schmittjoh/serializer/pull/583) ([goetas](https://github.com/goetas)) +- Fix serialize bug [\#582](https://github.com/schmittjoh/serializer/pull/582) ([goetas](https://github.com/goetas)) +- HHVM compatibility [\#580](https://github.com/schmittjoh/serializer/pull/580) ([goetas](https://github.com/goetas)) +- Discriminator Groups [\#579](https://github.com/schmittjoh/serializer/pull/579) ([maennchen](https://github.com/maennchen)) +- Fixed test suite on master [\#578](https://github.com/schmittjoh/serializer/pull/578) ([goetas](https://github.com/goetas)) +- Fix for a broken test: a missing \(incorrectly positioned\) argument [\#577](https://github.com/schmittjoh/serializer/pull/577) ([zerkms](https://github.com/zerkms)) +- Add extra test for handling child elements [\#569](https://github.com/schmittjoh/serializer/pull/569) ([tarjei](https://github.com/tarjei)) +- Fix bug \#343 return integer when the column is datetime [\#562](https://github.com/schmittjoh/serializer/pull/562) ([Bukashk0zzz](https://github.com/Bukashk0zzz)) +- \[doc\] fix AccessorOrder documentation [\#553](https://github.com/schmittjoh/serializer/pull/553) ([aledeg](https://github.com/aledeg)) +- Generic way to solve setValue on a property which respects its setter [\#550](https://github.com/schmittjoh/serializer/pull/550) ([maennchen](https://github.com/maennchen)) +- Added travis-ci label [\#399](https://github.com/schmittjoh/serializer/pull/399) ([spolischook](https://github.com/spolischook)) +- Generate namespaced element on XmlList entries [\#301](https://github.com/schmittjoh/serializer/pull/301) ([goetas](https://github.com/goetas)) + +## [1.1.0](https://github.com/schmittjoh/serializer/tree/1.1.0) (2015-10-27) +**Closed issues:** + +- Possible to set xsi:schemalocation? [\#505](https://github.com/schmittjoh/serializer/issues/505) +- Travis needs a renewed token to be able to set the status [\#495](https://github.com/schmittjoh/serializer/issues/495) +- Serialize a many-to-many relation [\#474](https://github.com/schmittjoh/serializer/issues/474) +- The document type "..." is not allowed [\#427](https://github.com/schmittjoh/serializer/issues/427) +- Yml serializer don't serialize empty arrays [\#183](https://github.com/schmittjoh/serializer/issues/183) + +**Merged pull requests:** + +- Manage empty array for serializer [\#510](https://github.com/schmittjoh/serializer/pull/510) ([Soullivaneuh](https://github.com/Soullivaneuh)) +- Fix the method name for the serialization context factory [\#490](https://github.com/schmittjoh/serializer/pull/490) ([stof](https://github.com/stof)) +- Switch the Twig integration to use non-deprecated APIs [\#482](https://github.com/schmittjoh/serializer/pull/482) ([stof](https://github.com/stof)) +- Add PHP 7 on Travis [\#477](https://github.com/schmittjoh/serializer/pull/477) ([Soullivaneuh](https://github.com/Soullivaneuh)) +- Change Proxy class used to Doctrine\Common\Persistence\Proxy [\#351](https://github.com/schmittjoh/serializer/pull/351) ([bburnichon](https://github.com/bburnichon)) +- Added PHP 5.6 [\#297](https://github.com/schmittjoh/serializer/pull/297) ([Nyholm](https://github.com/Nyholm)) + +## [1.0.0](https://github.com/schmittjoh/serializer/tree/1.0.0) (2015-06-16) +**Closed issues:** + +- Unrecognized 4 parts namespace [\#449](https://github.com/schmittjoh/serializer/issues/449) +- Groups is ignored [\#440](https://github.com/schmittjoh/serializer/issues/440) +- Property FelDev\CoreBundle\Entity\Persona::$apellido does not exist [\#432](https://github.com/schmittjoh/serializer/issues/432) +- Erroneous data format for unserializing [\#430](https://github.com/schmittjoh/serializer/issues/430) +- Deserialize JSON into existing Doctrine entities and empty strings are ignored [\#417](https://github.com/schmittjoh/serializer/issues/417) +- Failing to deserealize JSON string [\#402](https://github.com/schmittjoh/serializer/issues/402) +- Empty results serializing virtual\_properties [\#400](https://github.com/schmittjoh/serializer/issues/400) +- API stable 1.0.0 release in sight? [\#395](https://github.com/schmittjoh/serializer/issues/395) +- Is this project maintained still? [\#361](https://github.com/schmittjoh/serializer/issues/361) +- PreSerialize [\#339](https://github.com/schmittjoh/serializer/issues/339) +- Change default `access\_type` globally [\#336](https://github.com/schmittjoh/serializer/issues/336) +- Deserialization of XmlList does not support namespaces [\#332](https://github.com/schmittjoh/serializer/issues/332) +- Recursion groups, serializing properties in entities [\#329](https://github.com/schmittjoh/serializer/issues/329) +- The testsuite is broken [\#326](https://github.com/schmittjoh/serializer/issues/326) +- Namespaces and serialize/deserialize process [\#303](https://github.com/schmittjoh/serializer/issues/303) +- Exclusion of parent properties failing [\#282](https://github.com/schmittjoh/serializer/issues/282) +- How to deserialize correctly an array of arbitrary values ? [\#280](https://github.com/schmittjoh/serializer/issues/280) +- Try to identify getter/setter from an excluded property [\#278](https://github.com/schmittjoh/serializer/issues/278) +- Bug Entity constructor not called [\#270](https://github.com/schmittjoh/serializer/issues/270) +- Make it possible to escape special characters on serialization [\#265](https://github.com/schmittjoh/serializer/issues/265) +- doctrine annotations without namespace [\#264](https://github.com/schmittjoh/serializer/issues/264) +- php-collection constraint [\#257](https://github.com/schmittjoh/serializer/issues/257) +- \[Metadata\] PHP warning only when unittesting [\#255](https://github.com/schmittjoh/serializer/issues/255) +- Discriminator [\#220](https://github.com/schmittjoh/serializer/issues/220) + +**Merged pull requests:** + +- fix json output \(from \[\] to {} if empty\) of form error [\#462](https://github.com/schmittjoh/serializer/pull/462) ([jhkchan](https://github.com/jhkchan)) +- Add toArray and fromArray methods to the serializer [\#435](https://github.com/schmittjoh/serializer/pull/435) ([tystr](https://github.com/tystr)) +- Erroneous data format for unserializing \#430 [\#431](https://github.com/schmittjoh/serializer/pull/431) ([tmilos](https://github.com/tmilos)) +- Scrutinizer Auto-Fixes [\#381](https://github.com/schmittjoh/serializer/pull/381) ([scrutinizer-auto-fixer](https://github.com/scrutinizer-auto-fixer)) +- Fixing tests for bugfixed PHP versions [\#375](https://github.com/schmittjoh/serializer/pull/375) ([urakozz](https://github.com/urakozz)) +- Making test running against phpunit 4.\* [\#369](https://github.com/schmittjoh/serializer/pull/369) ([joelwurtz](https://github.com/joelwurtz)) +- Fixes a typo in the annotations.rst [\#363](https://github.com/schmittjoh/serializer/pull/363) ([Potherca](https://github.com/Potherca)) +- \[doc\] Default group informations [\#345](https://github.com/schmittjoh/serializer/pull/345) ([emilien-puget](https://github.com/emilien-puget)) +- bump branch alias to 0.17 as 0.16 is already released [\#305](https://github.com/schmittjoh/serializer/pull/305) ([lsmith77](https://github.com/lsmith77)) +- Unserialization of XML booleans [\#302](https://github.com/schmittjoh/serializer/pull/302) ([goetas](https://github.com/goetas)) +- Added xml\_root\_namespace on YAML reference [\#299](https://github.com/schmittjoh/serializer/pull/299) ([goetas](https://github.com/goetas)) +- Fixed yml mapping file name [\#256](https://github.com/schmittjoh/serializer/pull/256) ([spolischook](https://github.com/spolischook)) +- Serialization of nested polymorphic objects [\#238](https://github.com/schmittjoh/serializer/pull/238) ([DavidMikeSimon](https://github.com/DavidMikeSimon)) + +## [0.16.0](https://github.com/schmittjoh/serializer/tree/0.16.0) (2014-03-18) +**Closed issues:** + +- best way to add root to json? [\#250](https://github.com/schmittjoh/serializer/issues/250) +- Use Doctrine metadata [\#247](https://github.com/schmittjoh/serializer/issues/247) +- Integration Points - run-time exclusion checking [\#239](https://github.com/schmittjoh/serializer/issues/239) +- Using DoctrineTypeDriver to use Doctrine Anotations [\#232](https://github.com/schmittjoh/serializer/issues/232) + +**Merged pull requests:** + +- Changed some constraint to allow latest versions [\#251](https://github.com/schmittjoh/serializer/pull/251) ([stof](https://github.com/stof)) +- XML root element namespace support [\#246](https://github.com/schmittjoh/serializer/pull/246) ([andreasferber](https://github.com/andreasferber)) +- Added test for leading backslash in front of class name to TypeParserTest [\#245](https://github.com/schmittjoh/serializer/pull/245) ([deralex](https://github.com/deralex)) +- Allow to fetch data from has\*\(\) with public\_method [\#243](https://github.com/schmittjoh/serializer/pull/243) ([jaymecd](https://github.com/jaymecd)) +- Improve yaml documentacion Fix \#100 [\#221](https://github.com/schmittjoh/serializer/pull/221) ([BraisGabin](https://github.com/BraisGabin)) + +## [0.15.0](https://github.com/schmittjoh/serializer/tree/0.15.0) (2014-02-10) +**Closed issues:** + +- Add trait support [\#228](https://github.com/schmittjoh/serializer/issues/228) +- "array" type: Not working for arrays of DateTime objects [\#199](https://github.com/schmittjoh/serializer/issues/199) +- Discriminator field filtered by exclusion strategy [\#189](https://github.com/schmittjoh/serializer/issues/189) +- DateTime within an array \(format get ignored\) [\#140](https://github.com/schmittjoh/serializer/issues/140) +- EntityNotFoundException using softDeletable [\#101](https://github.com/schmittjoh/serializer/issues/101) +- Virtual property documentation xml & yaml [\#100](https://github.com/schmittjoh/serializer/issues/100) + +**Merged pull requests:** + +- Read only class [\#227](https://github.com/schmittjoh/serializer/pull/227) ([goetas](https://github.com/goetas)) +- @Alex88's Serialize only form child of type Form \#117 [\#224](https://github.com/schmittjoh/serializer/pull/224) ([minayaserrano](https://github.com/minayaserrano)) +- @XmlElement notation consistency [\#219](https://github.com/schmittjoh/serializer/pull/219) ([ajgarlag](https://github.com/ajgarlag)) +- add $this-\>maxDepth to serialize / unserialize [\#218](https://github.com/schmittjoh/serializer/pull/218) ([rothfahl](https://github.com/rothfahl)) +- xml reference updated with virtual-property example [\#215](https://github.com/schmittjoh/serializer/pull/215) ([ribeiropaulor](https://github.com/ribeiropaulor)) +- Add XmlNamespace annotation documentation [\#213](https://github.com/schmittjoh/serializer/pull/213) ([jeserkin](https://github.com/jeserkin)) +- Scrutinizer Auto-Fixes [\#210](https://github.com/schmittjoh/serializer/pull/210) ([scrutinizer-auto-fixer](https://github.com/scrutinizer-auto-fixer)) +- Scrutinizer Auto-Fixes [\#206](https://github.com/schmittjoh/serializer/pull/206) ([scrutinizer-auto-fixer](https://github.com/scrutinizer-auto-fixer)) +- Add xmlAttributeMap to serialized values [\#204](https://github.com/schmittjoh/serializer/pull/204) ([colinfrei](https://github.com/colinfrei)) +- fix issue \#199: "array" type ignoring DateTime format [\#201](https://github.com/schmittjoh/serializer/pull/201) ([lukey78](https://github.com/lukey78)) +- Potential fix for "recursion detected" issue [\#104](https://github.com/schmittjoh/serializer/pull/104) ([tyler-sommer](https://github.com/tyler-sommer)) + +## [0.14.0](https://github.com/schmittjoh/serializer/tree/0.14.0) (2013-12-04) +**Implemented enhancements:** + +- Can now override groups on specific paths of the graph [\#170](https://github.com/schmittjoh/serializer/pull/170) ([adrienbrault](https://github.com/adrienbrault)) + +**Closed issues:** + +- @HandlerCallback not inherited [\#181](https://github.com/schmittjoh/serializer/issues/181) +- Conditional serialization [\#173](https://github.com/schmittjoh/serializer/issues/173) +- Deserialize XML partially [\#167](https://github.com/schmittjoh/serializer/issues/167) +- getter is not called when serializing Discriminator parent entity [\#156](https://github.com/schmittjoh/serializer/issues/156) +- Deserialize DateTime from js Date.toJSON format fail [\#145](https://github.com/schmittjoh/serializer/issues/145) +- Yaml driver for the parameter xml\_attribute\_map is broken [\#141](https://github.com/schmittjoh/serializer/issues/141) +- XmlKeyValueStore annotation does not seem to deserialize properly [\#139](https://github.com/schmittjoh/serializer/issues/139) +- Boolean conversion gone wrong [\#134](https://github.com/schmittjoh/serializer/issues/134) +- Serialize to/from array? [\#133](https://github.com/schmittjoh/serializer/issues/133) +- @XmlRoot annotation no longer working [\#131](https://github.com/schmittjoh/serializer/issues/131) +- Skip an element based on a condition in a XmlList [\#121](https://github.com/schmittjoh/serializer/issues/121) + +**Merged pull requests:** + +- No CData [\#187](https://github.com/schmittjoh/serializer/pull/187) ([mvrhov](https://github.com/mvrhov)) +- composer is preinstalled on travis [\#185](https://github.com/schmittjoh/serializer/pull/185) ([lsmith77](https://github.com/lsmith77)) +- \[WIP\] added support for PHPCR [\#184](https://github.com/schmittjoh/serializer/pull/184) ([lsmith77](https://github.com/lsmith77)) +- Metadata filename convention added to yml/xml references [\#172](https://github.com/schmittjoh/serializer/pull/172) ([rodrigodiez](https://github.com/rodrigodiez)) +- Fix inline bug with empty child [\#165](https://github.com/schmittjoh/serializer/pull/165) ([adrienbrault](https://github.com/adrienbrault)) +- Add virtual properties yaml example [\#163](https://github.com/schmittjoh/serializer/pull/163) ([adrienbrault](https://github.com/adrienbrault)) +- Allow deserialization to constructed objects [\#160](https://github.com/schmittjoh/serializer/pull/160) ([eugene-dounar](https://github.com/eugene-dounar)) +- Fix DoctrineDriverTest random failures [\#155](https://github.com/schmittjoh/serializer/pull/155) ([eugene-dounar](https://github.com/eugene-dounar)) +- Fix XML null DateTime deserialization [\#154](https://github.com/schmittjoh/serializer/pull/154) ([eugene-dounar](https://github.com/eugene-dounar)) +- Update doctrine/orm dev dependency [\#153](https://github.com/schmittjoh/serializer/pull/153) ([eugene-dounar](https://github.com/eugene-dounar)) +- composer install --dev fails [\#152](https://github.com/schmittjoh/serializer/pull/152) ([eugene-dounar](https://github.com/eugene-dounar)) +- Update annotations.rst [\#146](https://github.com/schmittjoh/serializer/pull/146) ([chrisjohnson00](https://github.com/chrisjohnson00)) +- Add Doctrine\ODM\PHPCR\ChildrenCollection to ArrayCollectionHandler [\#143](https://github.com/schmittjoh/serializer/pull/143) ([hacfi](https://github.com/hacfi)) +- xml\_attribute\_map fix for the yaml driver [\#142](https://github.com/schmittjoh/serializer/pull/142) ([mvanmeerbeck](https://github.com/mvanmeerbeck)) +- Support PropelCollection serialization [\#81](https://github.com/schmittjoh/serializer/pull/81) ([zebraf1](https://github.com/zebraf1)) +- Adds XML namespaces support [\#58](https://github.com/schmittjoh/serializer/pull/58) ([ajgarlag](https://github.com/ajgarlag)) + +## [0.13.0](https://github.com/schmittjoh/serializer/tree/0.13.0) (2013-07-29) +**Closed issues:** + +- Documentation on Exclusion Strategies has an error [\#122](https://github.com/schmittjoh/serializer/issues/122) +- How access to the current serializing group in a subscriber ? [\#99](https://github.com/schmittjoh/serializer/issues/99) +- DoctrineProxySubscriber not found [\#93](https://github.com/schmittjoh/serializer/issues/93) +- Namespaces at root level [\#86](https://github.com/schmittjoh/serializer/issues/86) +- Issues when requesting JSON or XML using Doctrine MongoDB ODM [\#85](https://github.com/schmittjoh/serializer/issues/85) +- addGlobalIgnoredName not working [\#78](https://github.com/schmittjoh/serializer/issues/78) +- serialize\_null configuration [\#77](https://github.com/schmittjoh/serializer/issues/77) +- Add json prefix to prevent script tag csrf attack [\#76](https://github.com/schmittjoh/serializer/issues/76) +- Add support for replacing serialization object inside events [\#74](https://github.com/schmittjoh/serializer/issues/74) +- Next stable version? [\#64](https://github.com/schmittjoh/serializer/issues/64) +- Deserialize with object refs [\#62](https://github.com/schmittjoh/serializer/issues/62) + +**Merged pull requests:** + +- fix wrong quote in used in docs [\#130](https://github.com/schmittjoh/serializer/pull/130) ([jaapio](https://github.com/jaapio)) +- Document the handler $context argument [\#116](https://github.com/schmittjoh/serializer/pull/116) ([adrienbrault](https://github.com/adrienbrault)) +- Document the SubscribingHandlerInterface a bit [\#115](https://github.com/schmittjoh/serializer/pull/115) ([adrienbrault](https://github.com/adrienbrault)) +- Add getter for the xml serialization visitor defaultRootName property [\#114](https://github.com/schmittjoh/serializer/pull/114) ([adrienbrault](https://github.com/adrienbrault)) +- Add Serializer::getMetadataFactory [\#113](https://github.com/schmittjoh/serializer/pull/113) ([adrienbrault](https://github.com/adrienbrault)) +- Accessor order [\#108](https://github.com/schmittjoh/serializer/pull/108) ([jaapio](https://github.com/jaapio)) +- Added xmlns:xsi namespace and fixed tests [\#107](https://github.com/schmittjoh/serializer/pull/107) ([josser](https://github.com/josser)) +- \[Doc\] Fixed typo in event\_system [\#106](https://github.com/schmittjoh/serializer/pull/106) ([lyrixx](https://github.com/lyrixx)) +- Fix discriminator map search in ClassMetadata [\#97](https://github.com/schmittjoh/serializer/pull/97) ([xanido](https://github.com/xanido)) +- Use the AnnotationReader interface in the SerializerBuilder, instead of the implemented AnnotationReader itself [\#82](https://github.com/schmittjoh/serializer/pull/82) ([HarmenM](https://github.com/HarmenM)) +- Remove useless YamlSerializationVisitor::prepare method [\#75](https://github.com/schmittjoh/serializer/pull/75) ([adrienbrault](https://github.com/adrienbrault)) +- Add the PRE\_DESERIALIZE event to the Events class [\#73](https://github.com/schmittjoh/serializer/pull/73) ([adrienbrault](https://github.com/adrienbrault)) +- Improve serialization example [\#71](https://github.com/schmittjoh/serializer/pull/71) ([tvlooy](https://github.com/tvlooy)) +- Max depth strategy [\#4](https://github.com/schmittjoh/serializer/pull/4) ([adrienbrault](https://github.com/adrienbrault)) + +## [0.12.0](https://github.com/schmittjoh/serializer/tree/0.12.0) (2013-03-28) +**Closed issues:** + +- Serialization profile/definition builder [\#68](https://github.com/schmittjoh/serializer/issues/68) +- I want to configure the default exclution policy [\#65](https://github.com/schmittjoh/serializer/issues/65) +- Mulit type property mapping [\#56](https://github.com/schmittjoh/serializer/issues/56) +- AccessType\("public\_method"\): Setters ignored when deserializing to non-standard XML properties [\#53](https://github.com/schmittjoh/serializer/issues/53) +- Adding @Accessor with custom getter causes LogicException if Doctrine ManyToOneEntity [\#52](https://github.com/schmittjoh/serializer/issues/52) +- Handler callback's does not get passed context [\#49](https://github.com/schmittjoh/serializer/issues/49) +- PostSerialize callback causes data loss [\#46](https://github.com/schmittjoh/serializer/issues/46) +- Empty Objects get serialized as "array\(\)" [\#43](https://github.com/schmittjoh/serializer/issues/43) +- Exclusion Policies aren't properly applied when "serializeNull" is "true" [\#42](https://github.com/schmittjoh/serializer/issues/42) +- Accessor annotation ignored [\#40](https://github.com/schmittjoh/serializer/issues/40) +- Support for multiple exclusion strategies [\#39](https://github.com/schmittjoh/serializer/issues/39) +- srholt123@yahoo.com [\#35](https://github.com/schmittjoh/serializer/issues/35) +- Could you tag a stable version? [\#34](https://github.com/schmittjoh/serializer/issues/34) +- Default conversion of camelCase to underscores is counterintuitive [\#33](https://github.com/schmittjoh/serializer/issues/33) +- Define the xml root when deserializing [\#18](https://github.com/schmittjoh/serializer/issues/18) + +**Merged pull requests:** + +- \[Annotation\] Added the ability to set the type when using @VirtualProperty [\#69](https://github.com/schmittjoh/serializer/pull/69) ([pylebecq](https://github.com/pylebecq)) +- Added documentation for the @VirtualProperty annotation [\#67](https://github.com/schmittjoh/serializer/pull/67) ([pylebecq](https://github.com/pylebecq)) +- Metadata stack tests [\#57](https://github.com/schmittjoh/serializer/pull/57) ([adrienbrault](https://github.com/adrienbrault)) +- Adding context to twig extension [\#55](https://github.com/schmittjoh/serializer/pull/55) ([smurfy](https://github.com/smurfy)) +- Allow deserialization of polymorphic classes by class without specifying the type [\#48](https://github.com/schmittjoh/serializer/pull/48) ([gordalina](https://github.com/gordalina)) +- Moves all state to dedicated context class [\#47](https://github.com/schmittjoh/serializer/pull/47) ([schmittjoh](https://github.com/schmittjoh)) +- Add PropertyNamingStrategy [\#37](https://github.com/schmittjoh/serializer/pull/37) ([passkey1510](https://github.com/passkey1510)) +- The NavigatorContext now holds a metadata stack [\#28](https://github.com/schmittjoh/serializer/pull/28) ([adrienbrault](https://github.com/adrienbrault)) + +## [0.11.0](https://github.com/schmittjoh/serializer/tree/0.11.0) (2013-01-29) +**Closed issues:** + +- Hooking into metadata directly... [\#17](https://github.com/schmittjoh/serializer/issues/17) +- Serializing null values [\#14](https://github.com/schmittjoh/serializer/issues/14) +- Strange caching-error [\#13](https://github.com/schmittjoh/serializer/issues/13) +- handling of plain array [\#10](https://github.com/schmittjoh/serializer/issues/10) +- Unsupported format doesn't throw exception anymore [\#8](https://github.com/schmittjoh/serializer/issues/8) + +**Merged pull requests:** + +- Fix typo [\#32](https://github.com/schmittjoh/serializer/pull/32) ([inanimatt](https://github.com/inanimatt)) +- Fixed the serialization of pluralized form errors [\#31](https://github.com/schmittjoh/serializer/pull/31) ([stof](https://github.com/stof)) +- Extract json specific logic from GenericSerializationVisitor [\#29](https://github.com/schmittjoh/serializer/pull/29) ([adrienbrault](https://github.com/adrienbrault)) +- \[Serializer\] Misc cleanup [\#27](https://github.com/schmittjoh/serializer/pull/27) ([vicb](https://github.com/vicb)) +- \[Builder\] Add ability to include if metadata [\#25](https://github.com/schmittjoh/serializer/pull/25) ([vicb](https://github.com/vicb)) +- Fix DateTimeZone issue when using the DateTime type [\#23](https://github.com/schmittjoh/serializer/pull/23) ([colinmorelli](https://github.com/colinmorelli)) +- Wrong exception message for parsing datetime [\#21](https://github.com/schmittjoh/serializer/pull/21) ([nickelc](https://github.com/nickelc)) +- Fixed typo in doc/reference/annotations.rst [\#16](https://github.com/schmittjoh/serializer/pull/16) ([iambrosi](https://github.com/iambrosi)) +- Typecast when serializing primitive types [\#15](https://github.com/schmittjoh/serializer/pull/15) ([baldurrensch](https://github.com/baldurrensch)) +- add check and helpful exception message on inconsistent type situation [\#12](https://github.com/schmittjoh/serializer/pull/12) ([dbu](https://github.com/dbu)) +- Dispatch pre-serialization event before handling data to have ability change type in listener [\#7](https://github.com/schmittjoh/serializer/pull/7) ([megazoll](https://github.com/megazoll)) +- Fix tests running in different environments [\#6](https://github.com/schmittjoh/serializer/pull/6) ([megazoll](https://github.com/megazoll)) +- Add DateInterval serialization to DateHandler formerly DateTimeHandler [\#5](https://github.com/schmittjoh/serializer/pull/5) ([rpg600](https://github.com/rpg600)) +- WIP Navigator context [\#3](https://github.com/schmittjoh/serializer/pull/3) ([adrienbrault](https://github.com/adrienbrault)) +- Update src/JMS/Serializer/Construction/DoctrineObjectConstructor.php [\#2](https://github.com/schmittjoh/serializer/pull/2) ([robocoder](https://github.com/robocoder)) +- Filter out non-identifiers from $data before calling find\(\) [\#1](https://github.com/schmittjoh/serializer/pull/1) ([robocoder](https://github.com/robocoder)) + + + +\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)* \ No newline at end of file diff --git a/vendor/jms/serializer/LICENSE b/vendor/jms/serializer/LICENSE new file mode 100644 index 0000000000..f49a4e16e6 --- /dev/null +++ b/vendor/jms/serializer/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/vendor/jms/serializer/META.md b/vendor/jms/serializer/META.md new file mode 100644 index 0000000000..442ea6bfc6 --- /dev/null +++ b/vendor/jms/serializer/META.md @@ -0,0 +1,7 @@ +# Generating changelog + +Use: https://github.com/skywinder/Github-Changelog-Generator + +```bash +github_changelog_generator --pull-requests --no-compare-link --no-unreleased -t GITHUB-TOKEN +``` diff --git a/vendor/jms/serializer/README.md b/vendor/jms/serializer/README.md new file mode 100644 index 0000000000..dd9f551a7b --- /dev/null +++ b/vendor/jms/serializer/README.md @@ -0,0 +1,4 @@ +Serializer [![Scrutinizer Quality Score](https://scrutinizer-ci.com/g/schmittjoh/serializer/badges/quality-score.png?s=189df68e00c75d3fe155bc0da0b53b53709a9895)](https://scrutinizer-ci.com/g/schmittjoh/serializer/) [![Build Status](https://travis-ci.org/schmittjoh/serializer.svg?branch=master)](https://travis-ci.org/schmittjoh/serializer) +========== + +Learn more about it in its [documentation](http://jmsyst.com/libs/serializer). diff --git a/vendor/jms/serializer/UPGRADING.md b/vendor/jms/serializer/UPGRADING.md new file mode 100644 index 0000000000..a4ada717b8 --- /dev/null +++ b/vendor/jms/serializer/UPGRADING.md @@ -0,0 +1,26 @@ +From 0.13 to ??? +================ + +- If you have implemented your own ObjectConstructor, you need to add the DeserializationContext as an additional + parameter for the ``construct`` method. + + +From 0.11 to 0.12 +================= + +- GraphNavigator::detachObject has been removed, you can directly use Context::stopVisiting instead. +- VisitorInterface::getNavigator was deprecated, instead use Context::accept +- Serializer::setGroups, Serializer::setExclusionStrategy and Serializer::setVersion were removed, these settings must + now be passed as part of a new Context object. + + Before: + + $serializer->setVersion(1); + $serializer->serialize($data, 'json'); + + After: + + $serializer->serialize($data, 'json', SerializationContext::create()->setVersion(1)); + +- All visit??? methods of the VisitorInterface, now require a third argument, the Context; the context is for example + passed as an additional argument to handlers, exclusion strategies, and also available in event listeners. diff --git a/vendor/jms/serializer/composer.json b/vendor/jms/serializer/composer.json new file mode 100644 index 0000000000..a801dfc8e4 --- /dev/null +++ b/vendor/jms/serializer/composer.json @@ -0,0 +1,57 @@ +{ + "name": "jms/serializer", + "type": "library", + "description": "Library for (de-)serializing data of any complexity; supports XML, JSON, and YAML.", + "keywords": ["serialization", "deserialization", "json", "jaxb", "xml"], + "homepage": "http://jmsyst.com/libs/serializer", + "license": "Apache-2.0", + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "require": { + "php": ">=5.5.0", + "jms/metadata": "~1.1", + "jms/parser-lib": "1.*", + "phpoption/phpoption": "^1.1", + "phpcollection/phpcollection": "~0.1", + "doctrine/annotations": "^1.0", + "doctrine/instantiator": "^1.0.3" + }, + "conflict": { + "jms/serializer-bundle": "<1.2.1", + "twig/twig": "<1.12" + }, + "suggest": { + "symfony/yaml": "Required if you'd like to serialize data to YAML format.", + "doctrine/collections": "Required if you like to use doctrine collection types as ArrayCollection.", + "doctrine/cache": "Required if you like to use cache functionality." + }, + "require-dev": { + "ext-pdo_sqlite": "*", + "twig/twig": "~1.12|~2.0", + "doctrine/orm": "~2.1", + "jackalope/jackalope-doctrine-dbal": "^1.1.5", + "doctrine/phpcr-odm": "^1.3|^2.0", + "propel/propel1": "~1.7", + "symfony/yaml": "^2.1|^3.0", + "symfony/translation": "^2.1|^3.0", + "symfony/validator": "^2.2|^3.0", + "symfony/form": "~2.1|^3.0", + "symfony/filesystem": "^2.1", + "symfony/expression-language": "^2.6|^3.0", + "phpunit/phpunit": "^4.8|^5.0" + }, + "autoload": { + "psr-0": { + "JMS\\Serializer": "src/" + } + }, + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + } +} diff --git a/vendor/jms/serializer/doc/LICENSE b/vendor/jms/serializer/doc/LICENSE new file mode 100644 index 0000000000..a9aba5c6c9 --- /dev/null +++ b/vendor/jms/serializer/doc/LICENSE @@ -0,0 +1,55 @@ +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + +1. Definitions + + "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License. + "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined above) for the purposes of this License. + "Distribute" means to make available to the public the original and copies of the Work through sale or other transfer of ownership. + "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License. + "Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast. + "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work. + "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. + "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images. + "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium. + +2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: + + to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections; and, + to Distribute and Publicly Perform the Work including as incorporated in Collections. + +The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats, but otherwise you have no rights to make Adaptations. Subject to 8(f), all rights not expressly granted by Licensor are hereby reserved, including but not limited to the rights set forth in Section 4(d). + +4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: + + You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(c), as requested. + You may not exercise any of the rights granted to You in Section 3 above in any manner that is primarily intended for or directed toward commercial advantage or private monetary compensation. The exchange of the Work for other copyrighted works by means of digital file-sharing or otherwise shall not be considered to be intended for or directed toward commercial advantage or private monetary compensation, provided there is no payment of any monetary compensation in connection with the exchange of copyrighted works. + If You Distribute, or Publicly Perform the Work or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work. The credit required by this Section 4(c) may be implemented in any reasonable manner; provided, however, that in the case of a Collection, at a minimum such credit will appear, if a credit for all contributing authors of Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties. + + For the avoidance of doubt: + Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; + Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License if Your exercise of such rights is for a purpose or use which is otherwise than noncommercial as permitted under Section 4(b) and otherwise waives the right to collect royalties through any statutory or compulsory licensing scheme; and, + Voluntary License Schemes. The Licensor reserves the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License that is for a purpose or use which is otherwise than noncommercial as permitted under Section 4(b). + Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. + Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. + +8. Miscellaneous + + Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. + If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. + This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. + The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law. diff --git a/vendor/jms/serializer/doc/configuration.rst b/vendor/jms/serializer/doc/configuration.rst new file mode 100644 index 0000000000..3e1106f827 --- /dev/null +++ b/vendor/jms/serializer/doc/configuration.rst @@ -0,0 +1,100 @@ +Configuration +============= + +.. note :: + + If you are using Symfony2, this section is mostly irrelevant for you as the entire integration is provided by + JMSSerializerBundle; please see `its documentation `_. If you are + using another framework, there also might be a module, or other special integration. Please check packagist, or + whatever registry usually holds such information for your framework. + +Constructing a Serializer +------------------------- + +This library provides a special builder object which makes constructing serializer instances a breeze in any PHP +project. In its shortest version, it's just a single line of code:: + + $serializer = JMS\Serializer\SerializerBuilder::create()->build(); + +This serializer is fully functional, but you might want to tweak it a bit for example to configure a cache directory. + +Configuring a Cache Directory +----------------------------- +The serializer collects several metadata about your objects from various sources such as YML, XML, or annotations. In +order to make this process as efficient as possible, it is encourage to let the serializer cache that information. For +that, you can configure a cache directory:: + + $builder = new JMS\Serializer\SerializerBuilder(); + + $serializer = + JMS\Serializer\SerializerBuilder::create() + ->setCacheDir($someWritableDir) + ->setDebug($trueOrFalse) + ->build(); + +As you can see, we also added a call to the ``setDebug`` method. In debug mode, the serializer will perform a bit more +filesystem checks to see whether the data that it has cached is still valid. These checks are useful during development +so that you do not need to manually clear cache folders, however in production they are just unnecessary overhead. The +debug setting allows you to make the behavior environment specific. + +Adding Custom Handlers +---------------------- +If you have created custom handlers, you can add them to the serializer easily:: + + $serializer = + JMS\Serializer\SerializerBuilder::create() + ->addDefaultHandlers() + ->configureHandlers(function(JMS\Serializer\Handler\HandlerRegistry $registry) { + $registry->registerHandler('serialization', 'MyObject', 'json', + function($visitor, MyObject $obj, array $type) { + return $obj->getName(); + } + ); + }) + ->build(); + +For more complex handlers, it is advisable to extract them to dedicated classes, +see :doc:`handlers documentation `. + +Configuring Metadata Locations +------------------------------ +This library supports several metadata sources. By default, it uses Doctrine annotations, but you may also store +metadata in XML, or YML files. For the latter, it is necessary to configure a metadata directory where those files +are located:: + + $serializer = + JMS\Serializer\SerializerBuilder::create() + ->addMetadataDir($someDir) + ->build(); + +The serializer would expect the metadata files to be named like the fully qualified class names where all ``\`` are +replaced with ``.``. So, if you class would be named ``Vendor\Package\Foo``, the metadata file would need to be located +at ``$someDir/Vendor.Package.Foo.(xml|yml)``. For more information, see the :doc:`reference `. + +Setting a default SerializationContext factory +-------------------------------------------- +To avoid to pass an instance of SerializationContext +every time you call method ``serialize()`` (or ``toArray()``), +you can set a ``SerializationContextFactory`` to the Serializer. + +Example using the SerializerBuilder:: + + use JMS\Serializer\SerializationContext; + + $serializer = JMS\Serializer\SerializerBuilder::create() + ->setSerializationContextFactory(function () { + return SerializationContext::create() + ->setSerializeNull(true) + ; + }) + ->build() + ; + +Then, calling ``$serializer->serialize($data, 'json');`` will generate +a serialization context from your callable and use it. + +.. note :: + + You can also set a default DeserializationContextFactory with + ``->setDeserializationContextFactory(function () { /* ... */ })`` + to be used with methods ``deserialize()`` and ``fromArray()``. diff --git a/vendor/jms/serializer/doc/cookbook.rst b/vendor/jms/serializer/doc/cookbook.rst new file mode 100644 index 0000000000..985edd2d56 --- /dev/null +++ b/vendor/jms/serializer/doc/cookbook.rst @@ -0,0 +1,7 @@ +Cookbook +======== + +.. toctree :: + :glob: + + cookbook/* \ No newline at end of file diff --git a/vendor/jms/serializer/doc/cookbook/arrays.rst b/vendor/jms/serializer/doc/cookbook/arrays.rst new file mode 100644 index 0000000000..7cb2704a00 --- /dev/null +++ b/vendor/jms/serializer/doc/cookbook/arrays.rst @@ -0,0 +1,47 @@ +Serailizing arrays and hashes +============================= + +Introduction +------------ +Serializing arrays and hashes (a concept that in PHP has not explicit boundaries) +can be challenging. The serializer offers via ``@Type`` annotation different options +to configure its behavior, but if we try to serialize directly an array +(not as a property of an object), we need to use context information to determine the +array "type" + +Examples +-------- + +In case of a JSON serialization: + +.. code-block :: php + + serialize([1, 2]); // [1, 2] + $serializer->serialize(['a', 'b']); // ['a', 'b'] + $serializer->serialize(['c' => 'd']); // {"c" => "d"} + + // same as default (let the PHP's json_encode function decide) + $serializer->serialize([1, 2], SerializationContext::create()->setInitialType('array')); // [1, 2] + $serializer->serialize([1 => 2], SerializationContext::create()->setInitialType('array')); // {"1": 2} + $serializer->serialize(['a', 'b'], SerializationContext::create()->setInitialType('array')); // ['a', 'b'] + $serializer->serialize(['c' => 'd'], SerializationContext::create()->setInitialType('array')); // {"c" => "d"} + + // typehint as strict array, keys will be always discarded + $serializer->serialize([], SerializationContext::create()->setInitialType('array')); // [] + $serializer->serialize([1, 2], SerializationContext::create()->setInitialType('array')); // [1, 2] + $serializer->serialize(['a', 'b'], SerializationContext::create()->setInitialType('array')); // ['a', 'b'] + $serializer->serialize(['c' => 'd'], SerializationContext::create()->setInitialType('array')); // ["d"] + + // typehint as hash, keys will be always considered + $serializer->serialize([], SerializationContext::create()->setInitialType('array')); // {} + $serializer->serialize([1, 2], SerializationContext::create()->setInitialType('array')); // {"0" : 1, "1" : 2} + $serializer->serialize(['a', 'b'], SerializationContext::create()->setInitialType('array')); // {"0" : "a", "1" : "b"} + $serializer->serialize(['c' => 'd'], SerializationContext::create()->setInitialType('array')); // {"d" : "d"} + + +.. note :: + + This applies only for the JSON and YAML serialization. diff --git a/vendor/jms/serializer/doc/cookbook/exclusion_strategies.rst b/vendor/jms/serializer/doc/cookbook/exclusion_strategies.rst new file mode 100644 index 0000000000..9c3cd4e291 --- /dev/null +++ b/vendor/jms/serializer/doc/cookbook/exclusion_strategies.rst @@ -0,0 +1,311 @@ +Exclusion Strategies +==================== + +Introduction +------------ +The serializer supports different exclusion strategies. Each strategy allows +you to define which properties of your objects should be serialized. + +General Exclusion Strategies +---------------------------- +If you would like to always expose, or exclude certain properties. Then, you can +do this with the annotations ``@ExclusionPolicy``, ``@Exclude``, and ``@Expose``. + +The default exclusion policy is to exclude nothing. That is, all properties of the +object will be serialized. If you only want to expose a few of the properties, +then it is easier to change the exclusion policy, and only mark these few properties: + +.. code-block :: php + + serialize(new VersionObject(), 'json', SerializationContext::create()->setVersion(1)); + + +Creating Different Views of Your Objects +---------------------------------------- +Another default exclusion strategy is to create different views of your objects. +Let's say you would like to serialize your object in a different view depending +whether it is displayed in a list view or in a details view. + +You can achieve that by using the ``@Groups`` annotation on your properties. Any +property without an explicit ``@Groups`` annotation will be included in a +``Default`` group, which can be used when specifying groups in the serialization +context. + +.. code-block :: php + + use JMS\Serializer\Annotation\Groups; + + class BlogPost + { + /** @Groups({"list", "details"}) */ + private $id; + + /** @Groups({"list", "details"}) */ + private $title; + + /** @Groups({"list"}) */ + private $nbComments; + + /** @Groups({"details"}) */ + private $comments; + + private $createdAt; + } + +You can then tell the serializer which groups to serialize in your controller:: + + use JMS\Serializer\SerializationContext; + + $serializer->serialize(new BlogPost(), 'json', SerializationContext::create()->setGroups(array('list'))); + + //will output $id, $title and $nbComments. + + $serializer->serialize(new BlogPost(), 'json', SerializationContext::create()->setGroups(array('Default', 'list'))); + + //will output $id, $title, $nbComments and $createdAt. + +Overriding Groups of Deeper Branches of the Graph +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +In some cases you want to control more precisely what is serialized because you may have the same class at different +depths of the object graph. + +For example if you have a User that has a manager and friends:: + + use JMS\Serializer\Annotation\Groups; + + class User + { + private $name; + + /** @Groups({"manager_group"}) */ + private $manager; + + /** @Groups({"friends_group"}) */ + private $friends; + + public function __construct($name, User $manager = null, array $friends = null) + { + $this->name = $name; + $this->manager = $manager; + $this->friends = $friends; + } + } + +And the following object graph:: + + $john = new User( + 'John', + new User( + 'John Manager', + new User('The boss'), + array( + new User('John Manager friend 1'), + ) + ), + array( + new User( + 'John friend 1', + new User('John friend 1 manager') + ), + new User( + 'John friend 2', + new User('John friend 2 manager') + ), + ) + ); + +You can override groups on specific paths:: + + use JMS\Serializer\SerializationContext; + + $context = SerializationContext::create()->setGroups(array( + 'Default', // Serialize John's name + 'manager_group', // Serialize John's manager + 'friends_group', // Serialize John's friends + + 'manager' => array( // Override the groups for the manager of John + 'Default', // Serialize John manager's name + 'friends_group', // Serialize John manager's friends. If you do not override the groups for the friends, it will default to Default. + ), + + 'friends' => array( // Override the groups for the friends of John + 'manager_group' // Serialize John friends' managers. + + 'manager' => array( // Override the groups for the John friends' manager + 'Default', // This would be the default if you did not override the groups of the manager property. + ), + ), + )); + $serializer->serialize($john, 'json', $context); + +This would result in the following json:: + + { + "name": "John", + "manager": { + "name": "John Manager", + "friends": [ + { + "name": "John Manager friend 1" + } + ] + }, + "friends": [ + { + "manager": { + "name": "John friend 1 manager" + }, + }, + { + "manager": { + "name": "John friend 2 manager" + }, + }, + ] + } + +Limiting serialization depth of some properties +----------------------------------------------- +You can limit the depth of what will be serialized in a property with the +``@MaxDepth`` annotation. +This exclusion strategy is a bit different from the others, because it will +affect the serialized content of others classes than the one you apply the +annotation to. + +.. code-block :: php + + use JMS\Serializer\Annotation\MaxDepth; + + class User + { + private $username; + + /** @MaxDepth(1) */ + private $friends; + + /** @MaxDepth(2) */ + private $posts; + } + + class Post + { + private $title; + + private $author; + } + +In this example, serializing a user, because the max depth of the ``$friends`` +property is 1, the user friends would be serialized, but not their friends; +and because the the max depth of the ``$posts`` property is 2, the posts would +be serialized, and their author would also be serialized. + +You need to tell the serializer to take into account MaxDepth checks:: + + use JMS\Serializer\SerializationContext; + + $serializer->serialize($data, 'json', SerializationContext::create()->enableMaxDepthChecks()); + + +Dynamic exclusion strategy +-------------------------- + +If the previous exclusion strategies are not enough, is possible to use the ``ExpressionLanguageExclusionStrategy`` +that uses the `symfony expression language`_ to +allow a more sophisticated exclusion strategies using ``@Exclude(if="expression")`` and ``@Expose(if="expression")`` methods. + + +.. code-block :: php + + setExpressionEvaluator(new ExpressionEvaluator(new ExpressionLanguage())) + ->build(); + +.. _symfony expression language: https://github.com/symfony/expression-language diff --git a/vendor/jms/serializer/doc/cookbook/stdclass.rst b/vendor/jms/serializer/doc/cookbook/stdclass.rst new file mode 100644 index 0000000000..c70a21eafe --- /dev/null +++ b/vendor/jms/serializer/doc/cookbook/stdclass.rst @@ -0,0 +1,16 @@ +stdClass +======== + +The serializer offers support for serializing ``stdClass`` objects, however the use of +``stdClass`` objects is discouraged. + +The current implementation serializes all the properties of a ``stdClass`` object in +the order they appear. + +There are may know limitations wen dealing with ``stdClass`` objects, +more in detail, is not possible to: + +- change serialization order of properties +- apply per-property exclusion policies +- specify any extra serialization information for properties that are part of the ``stdClass`` object, as serialization name, type, xml structure and so on +- deserialize data into ``stdClass`` objects diff --git a/vendor/jms/serializer/doc/event_system.rst b/vendor/jms/serializer/doc/event_system.rst new file mode 100644 index 0000000000..0b1c890184 --- /dev/null +++ b/vendor/jms/serializer/doc/event_system.rst @@ -0,0 +1,79 @@ +Event System +============ + +The serializer dispatches different events during the serialization, and +deserialization process which you can use to hook in and alter the default +behavior. + +Register an Event Listener, or Subscriber +----------------------------------------- +The difference between listeners, and subscribers is that listener do not know to which events they listen +while subscribers contain that information. Thus, subscribers are easier to share, and re-use. Listeners +on the other hand, can be simple callables and do not require a dedicated class. + +.. code-block :: php + + class MyEventSubscriber implements JMS\Serializer\EventDispatcher\EventSubscriberInterface + { + public static function getSubscribedEvents() + { + return array( + array('event' => 'serializer.pre_serialize', 'method' => 'onPreSerialize'), + ); + } + + public function onPreSerialize(JMS\Serializer\EventDispatcher\PreSerializeEvent $event) + { + // do something + } + } + + $builder + ->configureListeners(function(JMS\Serializer\EventDispatcher\EventDispatcher $dispatcher) { + $dispatcher->addListener('serializer.pre_serialize', + function(JMS\Serializer\EventDispatcher\PreSerializeEvent $event) { + // do something + } + ); + + $dispatcher->addSubscriber(new MyEventSubscriber()); + }) + ; + +Events +------ + +serializer.pre_serialize +~~~~~~~~~~~~~~~~~~~~~~~~ +This is dispatched before a type is visited. You have access to the visitor, +data, and type. Listeners may modify the type that is being used for +serialization. + +**Event Object**: ``JMS\Serializer\EventDispatcher\PreSerializeEvent`` + +serializer.post_serialize +~~~~~~~~~~~~~~~~~~~~~~~~~ +This is dispatched right before a type is left. You can for example use this +to add additional data for an object that you normally do not save inside +objects such as links. + +**Event Object**: ``JMS\Serializer\EventDispatcher\ObjectEvent`` + +serializer.pre_deserialize +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. versionadded : 0.12 + Event was added + +This is dispatched before an object is deserialized. You can use this to +modify submitted data, or modify the type that is being used for deserialization. + +**Event Object**: ``JMS\Serializer\EventDispatcher\PreDeserializeEvent`` + +serializer.post_deserialize +~~~~~~~~~~~~~~~~~~~~~~~~~~~ +This is dispatched after a type is processed. You can use it to normalize +submitted data if you require external services for example, or also to +perform validation of the submitted data. + +**Event Object**: ``JMS\Serializer\EventDispatcher\ObjectEvent`` diff --git a/vendor/jms/serializer/doc/handlers.rst b/vendor/jms/serializer/doc/handlers.rst new file mode 100644 index 0000000000..e0e9cdfb76 --- /dev/null +++ b/vendor/jms/serializer/doc/handlers.rst @@ -0,0 +1,63 @@ +Handlers +======== + +Introduction +------------ +Handlers allow you to change the serialization, or deserialization process +for a single type/format combination. + +Handlers are simple callback which receive three arguments: the visitor, +the data, and the type. + +Simple Callables +---------------- +You can register simple callables on the builder object:: + + $builder + ->configureHandlers(function(JMS\Serializer\Handler\HandlerRegistry $registry) { + $registry->registerHandler('serialization', 'MyObject', 'json', + function($visitor, MyObject $obj, array $type) { + return $obj->getName(); + } + ); + }) + ; + +Subscribing Handlers +-------------------- +Subscribing handlers contain the configuration themselves which makes them easier to share with other users, +and easier to set-up in general:: + + use JMS\Serializer\Handler\SubscribingHandlerInterface; + use JMS\Serializer\GraphNavigator; + use JMS\Serializer\JsonSerializationVisitor; + use JMS\Serializer\Context; + + class MyHandler implements SubscribingHandlerInterface + { + public static function getSubscribingMethods() + { + return array( + array( + 'direction' => GraphNavigator::DIRECTION_SERIALIZATION, + 'format' => 'json', + 'type' => 'DateTime', + 'method' => 'serializeDateTimeToJson', + ), + ); + } + + public function serializeDateTimeToJson(JsonSerializationVisitor $visitor, \DateTime $date, array $type, Context $context) + { + return $date->format($type['params'][0]); + } + } + +Also, this type of handler is registered via the builder object:: + + $builder + ->configureHandlers(function(JMS\Serializer\Handler\HandlerRegistry $registry) { + $registry->registerSubscribingHandler(new MyHandler()); + }) + ; + diff --git a/vendor/jms/serializer/doc/index.rst b/vendor/jms/serializer/doc/index.rst new file mode 100644 index 0000000000..cd7b096117 --- /dev/null +++ b/vendor/jms/serializer/doc/index.rst @@ -0,0 +1,72 @@ +Serializer +========== + +Introduction +------------ +This library allows you to (de-)serialize data of any complexity. Currently, it supports XML, JSON, and YAML. + +It also provides you with a rich tool-set to adapt the output to your specific needs. + +Built-in features include: + +- (De-)serialize data of any complexity; circular references are handled gracefully. +- Supports many built-in PHP types (such as dates) +- Integrates with Doctrine ORM, et. al. +- Supports versioning, e.g. for APIs +- Configurable via PHP, XML, YAML, or Doctrine Annotations + +Installation +------------ +This library can be easily installed via composer + +.. code-block :: bash + + composer require jms/serializer + +or just add it to your ``composer.json`` file directly. + +Usage +----- +For standalone projects usage of the provided builder is encouraged:: + + $serializer = JMS\Serializer\SerializerBuilder::create()->build(); + $jsonContent = $serializer->serialize($data, 'json'); + echo $jsonContent; // or return it in a Response + +Documentation +------------- + +.. toctree :: + :hidden: + + configuration + usage + event_system + handlers + reference + cookbook + +- :doc:`Configuration ` +- :doc:`Usage ` +- :doc:`Events ` +- :doc:`Handlers ` + +- Recipes + * :doc:`/cookbook/exclusion_strategies` + +- Reference + * :doc:`Annotations ` + * :doc:`XML Reference ` + * :doc:`YML Reference ` + +License +------- + +The code is released under the business-friendly `Apache2 license`_. + +Documentation is subject to the `Attribution-NonCommercial-NoDerivs 3.0 Unported +license`_. + +.. _Apache2 license: http://www.apache.org/licenses/LICENSE-2.0.html +.. _Attribution-NonCommercial-NoDerivs 3.0 Unported license: http://creativecommons.org/licenses/by-nc-nd/3.0/ + diff --git a/vendor/jms/serializer/doc/reference.rst b/vendor/jms/serializer/doc/reference.rst new file mode 100644 index 0000000000..123d6f6338 --- /dev/null +++ b/vendor/jms/serializer/doc/reference.rst @@ -0,0 +1,8 @@ +Reference +========= + +.. toctree :: + :glob: + :maxdepth: 1 + + reference/* \ No newline at end of file diff --git a/vendor/jms/serializer/doc/reference/annotations.rst b/vendor/jms/serializer/doc/reference/annotations.rst new file mode 100644 index 0000000000..45751e7233 --- /dev/null +++ b/vendor/jms/serializer/doc/reference/annotations.rst @@ -0,0 +1,746 @@ +Annotations +----------- + +@ExclusionPolicy +~~~~~~~~~~~~~~~~ +This annotation can be defined on a class to indicate the exclusion strategy +that should be used for the class. + ++----------+----------------------------------------------------------------+ +| Policy | Description | ++==========+================================================================+ +| all | all properties are excluded by default; only properties marked | +| | with @Expose will be serialized/unserialized | ++----------+----------------------------------------------------------------+ +| none | no properties are excluded by default; all properties except | +| | those marked with @Exclude will be serialized/unserialized | ++----------+----------------------------------------------------------------+ + +@Exclude +~~~~~~~~ +This annotation can be defined on a property to indicate that the property should +not be serialized/unserialized. Works only in combination with NoneExclusionPolicy. + +If the ``ExpressionLanguageExclusionStrategy`` exclusion strategy is enabled, will +be possible to use ``@Exclude(if="expression")`` to exclude dynamically a property. + +@Expose +~~~~~~~ +This annotation can be defined on a property to indicate that the property should +be serialized/unserialized. Works only in combination with AllExclusionPolicy. + +If the ``ExpressionLanguageExclusionStrategy`` exclusion strategy is enabled, will +be possible to use ``@Expose(if="expression")`` to expose dynamically a property. + +@SkipWhenEmpty +~~~~~~~~~~~~~~ +This annotation can be defined on a property to indicate that the property should +not be serialized if the result will be "empty". + +Works option works only when serializing. + +@SerializedName +~~~~~~~~~~~~~~~ +This annotation can be defined on a property to define the serialized name for a +property. If this is not defined, the property will be translated from camel-case +to a lower-cased underscored name, e.g. camelCase -> camel_case. + +@Since +~~~~~~ +This annotation can be defined on a property to specify starting from which +version this property is available. If an earlier version is serialized, then +this property is excluded automatically. The version must be in a format that is +understood by PHP's ``version_compare`` function. + +@Until +~~~~~~ +This annotation can be defined on a property to specify until which version this +property was available. If a later version is serialized, then this property is +excluded automatically. The version must be in a format that is understood by +PHP's ``version_compare`` function. + +@Groups +~~~~~~~ +This annotation can be defined on a property to specify if the property +should be serialized when only serializing specific groups (see +:doc:`../cookbook/exclusion_strategies`). + +@MaxDepth +~~~~~~~~~ +This annotation can be defined on a property to limit the depth to which the +content will be serialized. It is very useful when a property will contain a +large object graph. + +@AccessType +~~~~~~~~~~~ +This annotation can be defined on a property, or a class to specify in which way +the properties should be accessed. By default, the serializer will retrieve, or +set the value via reflection, but you may change this to use a public method instead: + +.. code-block :: php + + name; + } + + public function setName($name) + { + $this->name = trim($name); + } + } + +@Accessor +~~~~~~~~~ +This annotation can be defined on a property to specify which public method should +be called to retrieve, or set the value of the given property: + +.. code-block :: php + + name); + } + + public function setName($name) + { + $this->name = $name; + } + } + +.. note :: + + If you need only to serialize your data, you can avoid providing a setter by + setting the property as read-only using the ``@ReadOnly`` annotation. + +@AccessorOrder +~~~~~~~~~~~~~~ +This annotation can be defined on a class to control the order of properties. By +default the order is undefined, but you may change it to either "alphabetical", or +"custom". + +.. code-block :: php + + lastName; + } + + public function getFirstName() + { + return $this->firstName; + } + } + +In this example: + +- ``id`` is exposed using the object reflection. +- ``lastName`` is exposed using the ``getLastName`` getter method. +- ``firstName`` is exposed using the ``object.getFirstName()`` expression (``exp`` can contain any valid symfony expression). + + +.. note :: + + This only works for serialization and is completely ignored during deserialization. + +@Inline +~~~~~~~ +This annotation can be defined on a property to indicate that the data of the property +should be inlined. + +**Note**: This only works for serialization, the serializer will not be able to deserialize +objects with this annotation. Also, AccessorOrder will be using the name of the property +to determine the order. + +@ReadOnly +~~~~~~~~~ +This annotation can be defined on a property to indicate that the data of the property +is read only and cannot be set during deserialization. + +A property can be marked as non read only with ``@ReadOnly(false)`` annotation (useful when a class is marked as read only). + +@PreSerialize +~~~~~~~~~~~~~ +This annotation can be defined on a method which is supposed to be called before +the serialization of the object starts. + +@PostSerialize +~~~~~~~~~~~~~~ +This annotation can be defined on a method which is then called directly after the +object has been serialized. + +@PostDeserialize +~~~~~~~~~~~~~~~~ +This annotation can be defined on a method which is supposed to be called after +the object has been deserialized. + +@HandlerCallback +~~~~~~~~~~~~~~~~ +This annotation can be defined on a method if serialization/deserialization is handled +by the object itself. + +.. code-block :: php + + | A list of type T (T can be any available type). | +| | Examples: | +| | array, array, etc. | ++-------------------------------------+--------------------------------------------------+ +| array | A map of keys of type K to values of type V. | +| | Examples: array, | +| | array, etc. | ++-------------------------------------+--------------------------------------------------+ +| DateTime | PHP's DateTime object (default format/timezone) | ++-------------------------------------+--------------------------------------------------+ +| DateTime<'format'> | PHP's DateTime object (custom format/default | +| | timezone) | ++-------------------------------------+--------------------------------------------------+ +| DateTime<'format', 'zone'> | PHP's DateTime object (custom format/timezone) | ++-------------------------------------+--------------------------------------------------+ +| DateTimeImmutable | PHP's DateTimeImmutable object (default format/ | +| | timezone) | ++-------------------------------------+--------------------------------------------------+ +| DateTimeImmutable<'format'> | PHP's DateTimeImmutable object (custom format/ | +| | default timezone) | ++-------------------------------------+--------------------------------------------------+ +| DateTimeImmutable<'format', 'zone'> | PHP's DateTimeImmutable object (custom format/ | +| | timezone) | ++-------------------------------------+--------------------------------------------------+ +| DateInterval | PHP's DateInterval object using ISO 8601 format | ++-------------------------------------+--------------------------------------------------+ +| T | Where T is a fully qualified class name. | ++-------------------------------------+--------------------------------------------------+ +| ArrayCollection | Similar to array, but will be deserialized | +| | into Doctrine's ArrayCollection class. | ++-------------------------------------+--------------------------------------------------+ +| ArrayCollection | Similar to array, but will be deserialized | +| | into Doctrine's ArrayCollection class. | ++-------------------------------------+--------------------------------------------------+ + +Examples: + +.. code-block :: php + + ") + */ + private $comments; + + /** + * @Type("string") + */ + private $title; + + /** + * @Type("MyNamespace\Author") + */ + private $author; + + /** + * @Type("DateTime") + */ + private $startAt; + + /** + * @Type("DateTime<'Y-m-d'>") + */ + private $endAt; + + /** + * @Type("DateTimeImmutable") + */ + private $createdAt; + + /** + * @Type("DateTimeImmutable<'Y-m-d'>") + */ + private $updatedAt; + + /** + * @Type("boolean") + */ + private $published; + + /** + * @Type("array") + */ + private $keyValueStore; + } + +@XmlRoot +~~~~~~~~ +This allows you to specify the name of the top-level element. + +.. code-block :: php + + + + + +.. note :: + + @XmlRoot only applies to the root element, but is for example not taken into + account for collections. You can define the entry name for collections using + @XmlList, or @XmlMap. + +@XmlAttribute +~~~~~~~~~~~~~ +This allows you to mark properties which should be set as attributes, +and not as child elements. + +.. code-block :: php + + + + + + +@XmlDiscriminator +~~~~~~~~~~~~~~~~~ +This annotation allows to modify the behaviour of @Discriminator regarding handling of XML. + + +Available Options: + ++-------------------------------------+--------------------------------------------------+ +| Type | Description | ++=====================================+==================================================+ +| attribute | use an attribute instead of a child node | ++-------------------------------------+--------------------------------------------------+ +| cdata | render child node content with or without cdata | ++-------------------------------------+--------------------------------------------------+ +| namespace | render child node using the specified namespace | ++-------------------------------------+--------------------------------------------------+ + +Example for "attribute": +.. code-block :: php + + + + +Example for "cdata": + +.. code-block :: php + car + + +@XmlValue +~~~~~~~~~ +This allows you to mark properties which should be set as the value of the +current element. Note that this has the limitation that any additional +properties of that object must have the @XmlAttribute annotation. +XMlValue also has property cdata. Which has the same meaning as the one in +XMLElement. + +.. code-block :: php + + 1.23 + +@XmlList +~~~~~~~~ +This allows you to define several properties of how arrays should be +serialized. This is very similar to @XmlMap, and should be used if the +keys of the array are not important. + +.. code-block :: php + + text = $text; + } + } + +Resulting XML: + +.. code-block :: xml + + + + + + + + + + +You can also specify the entry tag namespace using the ``namespace`` attribute (``@XmlList(inline = true, entry = "comment", namespace="http://www.example.com/ns")``). + +@XmlMap +~~~~~~~ +Similar to @XmlList, but the keys of the array are meaningful. + +@XmlKeyValuePairs +~~~~~~~~~~~~~~~~~ +This allows you to use the keys of an array as xml tags. + +.. note :: + + When a key is an invalid xml tag name (e.g. 1_foo) the tag name *entry* will be used instead of the key. + +@XmlAttributeMap +~~~~~~~~~~~~~~~~ + +This is similar to the @XmlKeyValuePairs, but instead of creating child elements, it creates attributes. + +.. code-block :: php + + 'firstname', + 'value' => 'Adrien', + ); + } + +Resulting XML: + +.. code-block :: xml + + + +@XmlElement +~~~~~~~~~~~ +This annotation can be defined on a property to add additional xml serialization/deserialization properties. + +.. code-block :: php + + my_id + +@XmlNamespace +~~~~~~~~~~~~~ +This annotation allows you to specify Xml namespace/s and prefix used. + +.. code-block :: php + + + + + + + diff --git a/vendor/jms/serializer/doc/reference/xml_reference.rst b/vendor/jms/serializer/doc/reference/xml_reference.rst new file mode 100644 index 0000000000..eb1df441e1 --- /dev/null +++ b/vendor/jms/serializer/doc/reference/xml_reference.rst @@ -0,0 +1,99 @@ +XML Reference +------------- +:: + + + + + + + + ClassName + + foo + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/jms/serializer/doc/reference/yml_reference.rst b/vendor/jms/serializer/doc/reference/yml_reference.rst new file mode 100644 index 0000000000..0128ad12a4 --- /dev/null +++ b/vendor/jms/serializer/doc/reference/yml_reference.rst @@ -0,0 +1,82 @@ +YAML Reference +-------------- +:: + + # Vendor\MyBundle\Resources\config\serializer\Model.ClassName.yml + Vendor\MyBundle\Model\ClassName: + exclusion_policy: ALL + xml_root_name: foobar + xml_root_namespace: http://your.default.namespace + exclude: true + read_only: false + access_type: public_method # defaults to property + accessor_order: custom + custom_accessor_order: [propertyName1, propertyName2, ..., propertyNameN] + discriminator: + field_name: type + disabled: false + map: + some-value: ClassName + groups: [foo, bar] + xml_attribute: true + xml_element: + cdata: false + namespace: http://www.w3.org/2005/Atom + virtual_properties: + getSomeProperty: + serialized_name: foo + type: integer + expression_prop: + exp: object.getName() + serialized_name: foo + type: integer + xml_namespaces: + "": http://your.default.namespace + atom: http://www.w3.org/2005/Atom + properties: + some-property: + exclude: true + expose: true + exclude_if: expr + expose_if: expr + skip_when_empty: false + access_type: public_method # defaults to property + accessor: # access_type must be set to public_method + getter: getSomeOtherProperty + setter: setSomeOtherProperty + type: string + serialized_name: foo + since_version: 1.0 + until_version: 1.1 + groups: [foo, bar] + xml_attribute: true + xml_value: true + inline: true + read_only: true + xml_key_value_pairs: true + xml_list: + inline: true + entry_name: foo + namespace: http://www.w3.org/2005/Atom + xml_map: + inline: true + key_attribute_name: foo + entry_name: bar + namespace: http://www.w3.org/2005/Atom + xml_attribute_map: true + xml_element: + cdata: false + namespace: http://www.w3.org/2005/Atom + max_depth: 2 + + handler_callbacks: + serialization: + xml: serializeToXml + json: serializeToJson + deserialization: + xml: deserializeFromXml + + callback_methods: + pre_serialize: [foo, bar] + post_serialize: [foo, bar] + post_deserialize: [foo, bar] diff --git a/vendor/jms/serializer/doc/usage.rst b/vendor/jms/serializer/doc/usage.rst new file mode 100644 index 0000000000..cd78c206ad --- /dev/null +++ b/vendor/jms/serializer/doc/usage.rst @@ -0,0 +1,38 @@ +Usage +===== + +Serializing Objects +------------------- +Most common usage is probably to serialize objects. This can be achieved +very easily: + +.. configuration-block :: + + .. code-block :: php + + build(); + $serializer->serialize($object, 'json'); + $serializer->serialize($object, 'xml'); + $serializer->serialize($object, 'yml'); + + .. code-block :: jinja + + {{ object | serialize }} {# uses JSON #} + {{ object | serialize('json') }} + {{ object | serialize('xml') }} + {{ object | serialize('yml') }} + +Deserializing Objects +--------------------- +You can also deserialize objects from their XML, or JSON representation. For +example, when accepting data via an API. + +.. code-block :: php + + build(); + $object = $serializer->deserialize($jsonData, 'MyNamespace\MyObject', 'json'); + diff --git a/vendor/jms/serializer/phpunit.xml.dist b/vendor/jms/serializer/phpunit.xml.dist new file mode 100644 index 0000000000..cd62f11a77 --- /dev/null +++ b/vendor/jms/serializer/phpunit.xml.dist @@ -0,0 +1,31 @@ + + + + + + ./tests + + + + + + performance + + + + + src + + + diff --git a/vendor/jms/serializer/src/JMS/Serializer/AbstractVisitor.php b/vendor/jms/serializer/src/JMS/Serializer/AbstractVisitor.php new file mode 100644 index 0000000000..8fdbe08591 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/AbstractVisitor.php @@ -0,0 +1,66 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer; + +use JMS\Serializer\Accessor\AccessorStrategyInterface; +use JMS\Serializer\Accessor\DefaultAccessorStrategy; +use JMS\Serializer\Naming\PropertyNamingStrategyInterface; + +abstract class AbstractVisitor implements VisitorInterface +{ + protected $namingStrategy; + + /** + * @var AccessorStrategyInterface + */ + protected $accessor; + + public function __construct(PropertyNamingStrategyInterface $namingStrategy, AccessorStrategyInterface $accessorStrategy = null) + { + $this->namingStrategy = $namingStrategy; + $this->accessor = $accessorStrategy ?: new DefaultAccessorStrategy(); + } + + public function getNamingStrategy() + { + return $this->namingStrategy; + } + + public function prepare($data) + { + return $data; + } + + /** + * @param array $typeArray + */ + protected function getElementType($typeArray) + { + if (false === isset($typeArray['params'][0])) { + return null; + } + + if (isset($typeArray['params'][1]) && is_array($typeArray['params'][1])) { + return $typeArray['params'][1]; + } else { + return $typeArray['params'][0]; + } + } + +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Accessor/AccessorStrategyInterface.php b/vendor/jms/serializer/src/JMS/Serializer/Accessor/AccessorStrategyInterface.php new file mode 100644 index 0000000000..6abcf8a234 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Accessor/AccessorStrategyInterface.php @@ -0,0 +1,42 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Accessor; + +use JMS\Serializer\Metadata\PropertyMetadata; + +/** + * @author Asmir Mustafic + */ +interface AccessorStrategyInterface +{ + /** + * @param object $object + * @param PropertyMetadata $metadata + * @return mixed + */ + public function getValue($object, PropertyMetadata $metadata); + + /** + * @param object $object + * @param mixed $value + * @param PropertyMetadata $metadata + * @return void + */ + public function setValue($object, $value, PropertyMetadata $metadata); +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Accessor/DefaultAccessorStrategy.php b/vendor/jms/serializer/src/JMS/Serializer/Accessor/DefaultAccessorStrategy.php new file mode 100644 index 0000000000..57a4435668 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Accessor/DefaultAccessorStrategy.php @@ -0,0 +1,38 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Accessor; + +use JMS\Serializer\Metadata\PropertyMetadata; + +/** + * @author Asmir Mustafic + */ +class DefaultAccessorStrategy implements AccessorStrategyInterface +{ + + public function getValue($object, PropertyMetadata $metadata) + { + return $metadata->getValue($object); + } + + public function setValue($object, $value, PropertyMetadata $metadata) + { + $metadata->setValue($object, $value); + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Accessor/ExpressionAccessorStrategy.php b/vendor/jms/serializer/src/JMS/Serializer/Accessor/ExpressionAccessorStrategy.php new file mode 100644 index 0000000000..4dc6054548 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Accessor/ExpressionAccessorStrategy.php @@ -0,0 +1,57 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Accessor; + +use JMS\Serializer\Expression\ExpressionEvaluatorInterface; +use JMS\Serializer\Metadata\ExpressionPropertyMetadata; +use JMS\Serializer\Metadata\PropertyMetadata; + +/** + * @author Asmir Mustafic + */ +class ExpressionAccessorStrategy implements AccessorStrategyInterface +{ + /** + * @var AccessorStrategyInterface + */ + private $fallback; + /** + * @var ExpressionEvaluatorInterface + */ + private $evaluator; + + public function __construct(ExpressionEvaluatorInterface $evaluator, AccessorStrategyInterface $fallback) + { + $this->fallback = $fallback; + $this->evaluator = $evaluator; + } + + public function getValue($object, PropertyMetadata $metadata) + { + if ($metadata instanceof ExpressionPropertyMetadata) { + return $this->evaluator->evaluate($metadata->expression, array('object' => $object)); + } + return $this->fallback->getValue($object, $metadata); + } + + public function setValue($object, $value, PropertyMetadata $metadata) + { + $this->fallback->setValue($object, $value, $metadata); + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Annotation/AccessType.php b/vendor/jms/serializer/src/JMS/Serializer/Annotation/AccessType.php new file mode 100644 index 0000000000..e4125e4e87 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Annotation/AccessType.php @@ -0,0 +1,34 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Annotation; + +/** + * @Annotation + * @Target({"CLASS", "PROPERTY"}) + * + * @author Johannes M. Schmitt + */ +final class AccessType +{ + /** + * @Required + * @var string + */ + public $type; +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Annotation/Accessor.php b/vendor/jms/serializer/src/JMS/Serializer/Annotation/Accessor.php new file mode 100644 index 0000000000..910fe7f54c --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Annotation/Accessor.php @@ -0,0 +1,38 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Annotation; + +/** + * @Annotation + * @Target("PROPERTY") + * + * @author Johannes M. Schmitt + */ +final class Accessor +{ + /** + * @var string + */ + public $getter; + + /** + * @var string + */ + public $setter; +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Annotation/AccessorOrder.php b/vendor/jms/serializer/src/JMS/Serializer/Annotation/AccessorOrder.php new file mode 100644 index 0000000000..15510daf75 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Annotation/AccessorOrder.php @@ -0,0 +1,40 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Annotation; + +/** + * Controls the order of properties in a class. + * + * @Annotation + * @Target("CLASS") + * @author Johannes M. Schmitt + */ +final class AccessorOrder +{ + /** + * @Required + * @var string + */ + public $order; + + /** + * @var array + */ + public $custom = array(); +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Annotation/Discriminator.php b/vendor/jms/serializer/src/JMS/Serializer/Annotation/Discriminator.php new file mode 100644 index 0000000000..750e7eb7d9 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Annotation/Discriminator.php @@ -0,0 +1,38 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Annotation; + +/** + * @Annotation + * @Target("CLASS") + */ +class Discriminator +{ + /** @var array */ + public $map; + + /** @var string */ + public $field = 'type'; + + /** @var boolean */ + public $disabled = false; + + /** @var string[] */ + public $groups = array(); +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Annotation/Exclude.php b/vendor/jms/serializer/src/JMS/Serializer/Annotation/Exclude.php new file mode 100644 index 0000000000..27f3ec2b41 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Annotation/Exclude.php @@ -0,0 +1,28 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Annotation; + +/** + * @Annotation + * @Target({"PROPERTY", "CLASS", "METHOD", "ANNOTATION"}) + */ +final class Exclude +{ + public $if; +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Annotation/ExclusionPolicy.php b/vendor/jms/serializer/src/JMS/Serializer/Annotation/ExclusionPolicy.php new file mode 100644 index 0000000000..965af6c2d2 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Annotation/ExclusionPolicy.php @@ -0,0 +1,46 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Annotation; + +use JMS\Serializer\Exception\RuntimeException; + +/** + * @Annotation + * @Target("CLASS") + */ +final class ExclusionPolicy +{ + const NONE = 'NONE'; + const ALL = 'ALL'; + + public $policy; + + public function __construct(array $values) + { + if ( ! is_string($values['value'])) { + throw new RuntimeException('"value" must be a string.'); + } + + $this->policy = strtoupper($values['value']); + + if (self::NONE !== $this->policy && self::ALL !== $this->policy) { + throw new RuntimeException('Exclusion policy must either be "ALL", or "NONE".'); + } + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Annotation/Expose.php b/vendor/jms/serializer/src/JMS/Serializer/Annotation/Expose.php new file mode 100644 index 0000000000..53f7cd84df --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Annotation/Expose.php @@ -0,0 +1,28 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Annotation; + +/** + * @Annotation + * @Target({"PROPERTY", "METHOD","ANNOTATION"}) + */ +final class Expose +{ + public $if; +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Annotation/Groups.php b/vendor/jms/serializer/src/JMS/Serializer/Annotation/Groups.php new file mode 100644 index 0000000000..70f0ad7e38 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Annotation/Groups.php @@ -0,0 +1,29 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Annotation; + +/** + * @Annotation + * @Target({"PROPERTY","METHOD","ANNOTATION"}) + */ +final class Groups +{ + /** @var array @Required */ + public $groups; +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Annotation/HandlerCallback.php b/vendor/jms/serializer/src/JMS/Serializer/Annotation/HandlerCallback.php new file mode 100644 index 0000000000..588b949ca8 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Annotation/HandlerCallback.php @@ -0,0 +1,40 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Annotation; + +/** + * @Annotation + * @Target("METHOD") + * + * @author Johannes M. Schmitt + */ +final class HandlerCallback +{ + /** + * @Required + * @var string + */ + public $format; + + /** + * @Required + * @var string + */ + public $direction; +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Annotation/Inline.php b/vendor/jms/serializer/src/JMS/Serializer/Annotation/Inline.php new file mode 100644 index 0000000000..ba82d5f863 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Annotation/Inline.php @@ -0,0 +1,27 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Annotation; + +/** + * @Annotation + * @Target({"PROPERTY","METHOD","ANNOTATION"}) + */ +final class Inline +{ +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Annotation/MaxDepth.php b/vendor/jms/serializer/src/JMS/Serializer/Annotation/MaxDepth.php new file mode 100644 index 0000000000..7b05a3fcb6 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Annotation/MaxDepth.php @@ -0,0 +1,32 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Annotation; + +/** + * @Annotation + * @Target({"PROPERTY","METHOD","ANNOTATION"}) + */ +final class MaxDepth +{ + /** + * @Required + * @var integer + */ + public $depth; +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Annotation/PostDeserialize.php b/vendor/jms/serializer/src/JMS/Serializer/Annotation/PostDeserialize.php new file mode 100644 index 0000000000..b7ff4b5f26 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Annotation/PostDeserialize.php @@ -0,0 +1,33 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Annotation; + +/** + * This annotation can be defined on methods which are called after the + * deserialization of the object is complete. + * + * These methods do not necessarily have to be public. + * + * @Annotation + * @Target("METHOD") + * @author Johannes M. Schmitt + */ +final class PostDeserialize +{ +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Annotation/PostSerialize.php b/vendor/jms/serializer/src/JMS/Serializer/Annotation/PostSerialize.php new file mode 100644 index 0000000000..bb9cfd3f24 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Annotation/PostSerialize.php @@ -0,0 +1,27 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Annotation; + +/** + * @Annotation + * @Target("METHOD") + */ +final class PostSerialize +{ +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Annotation/PreSerialize.php b/vendor/jms/serializer/src/JMS/Serializer/Annotation/PreSerialize.php new file mode 100644 index 0000000000..c9ddbf1a63 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Annotation/PreSerialize.php @@ -0,0 +1,34 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Annotation; + +/** + * This annotation can be declared on methods which should be called + * before the Serialization process. + * + * These methods do not need to be public, and should do any clean-up, or + * preparation of the object that is necessary. + * + * @Annotation + * @Target("METHOD") + * @author Johannes M. Schmitt + */ +final class PreSerialize +{ +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Annotation/ReadOnly.php b/vendor/jms/serializer/src/JMS/Serializer/Annotation/ReadOnly.php new file mode 100644 index 0000000000..4712cb1041 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Annotation/ReadOnly.php @@ -0,0 +1,31 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Annotation; + +/** + * @Annotation + * @Target({"CLASS","PROPERTY"}) + */ +final class ReadOnly +{ + /** + * @var boolean + */ + public $readOnly = true; +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Annotation/SerializedName.php b/vendor/jms/serializer/src/JMS/Serializer/Annotation/SerializedName.php new file mode 100644 index 0000000000..968705e2da --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Annotation/SerializedName.php @@ -0,0 +1,39 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Annotation; + +use JMS\Serializer\Exception\RuntimeException; + +/** + * @Annotation + * @Target({"PROPERTY","METHOD", "ANNOTATION"}) + */ +final class SerializedName +{ + public $name; + + public function __construct(array $values) + { + if (!isset($values['value']) || !is_string($values['value'])) { + throw new RuntimeException(sprintf('"value" must be a string.')); + } + + $this->name = $values['value']; + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Annotation/Since.php b/vendor/jms/serializer/src/JMS/Serializer/Annotation/Since.php new file mode 100644 index 0000000000..851d151100 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Annotation/Since.php @@ -0,0 +1,27 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Annotation; + +/** + * @Annotation + * @Target({"PROPERTY", "METHOD"}) + */ +final class Since extends Version +{ +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Annotation/SkipWhenEmpty.php b/vendor/jms/serializer/src/JMS/Serializer/Annotation/SkipWhenEmpty.php new file mode 100644 index 0000000000..d2a5433e00 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Annotation/SkipWhenEmpty.php @@ -0,0 +1,27 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Annotation; + +/** + * @Annotation + * @Target({"PROPERTY","METHOD","ANNOTATION"}) + */ +final class SkipWhenEmpty +{ +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Annotation/Type.php b/vendor/jms/serializer/src/JMS/Serializer/Annotation/Type.php new file mode 100644 index 0000000000..fb82886908 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Annotation/Type.php @@ -0,0 +1,32 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Annotation; + +/** + * @Annotation + * @Target({"PROPERTY", "METHOD","ANNOTATION"}) + */ +final class Type +{ + /** + * @Required + * @var string + */ + public $name; +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Annotation/Until.php b/vendor/jms/serializer/src/JMS/Serializer/Annotation/Until.php new file mode 100644 index 0000000000..8eef0485a5 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Annotation/Until.php @@ -0,0 +1,27 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Annotation; + +/** + * @Annotation + * @Target({"PROPERTY", "METHOD"}) + */ +final class Until extends Version +{ +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Annotation/Version.php b/vendor/jms/serializer/src/JMS/Serializer/Annotation/Version.php new file mode 100644 index 0000000000..62b663c07b --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Annotation/Version.php @@ -0,0 +1,28 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Annotation; + +abstract class Version +{ + /** + * @Required + * @var string + */ + public $version; +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Annotation/VirtualProperty.php b/vendor/jms/serializer/src/JMS/Serializer/Annotation/VirtualProperty.php new file mode 100644 index 0000000000..ee168d91aa --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Annotation/VirtualProperty.php @@ -0,0 +1,48 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Annotation; + +/** + * @Annotation + * @Target({"METHOD", "CLASS"}) + * + * @author Alexander Klimenkov + */ +final class VirtualProperty +{ + public $exp; + public $name; + public $options = array(); + + public function __construct(array $data) + { + if (isset($data['value'])) { + $data['name'] = $data['value']; + unset($data['value']); + } + + foreach ($data as $key => $value) { + if (!property_exists(__CLASS__, $key)) { + throw new \BadMethodCallException(sprintf('Unknown property "%s" on annotation "%s".', $key, __CLASS__)); + } + $this->{$key} = $value; + } + } +} + diff --git a/vendor/jms/serializer/src/JMS/Serializer/Annotation/XmlAttribute.php b/vendor/jms/serializer/src/JMS/Serializer/Annotation/XmlAttribute.php new file mode 100644 index 0000000000..9f7ef31b5f --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Annotation/XmlAttribute.php @@ -0,0 +1,31 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Annotation; + +/** + * @Annotation + * @Target({"PROPERTY", "METHOD","ANNOTATION"}) + */ +final class XmlAttribute +{ + /** + * @var string + */ + public $namespace; +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Annotation/XmlAttributeMap.php b/vendor/jms/serializer/src/JMS/Serializer/Annotation/XmlAttributeMap.php new file mode 100644 index 0000000000..2bdef0d425 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Annotation/XmlAttributeMap.php @@ -0,0 +1,27 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Annotation; + +/** + * @Annotation + * @Target({"PROPERTY", "METHOD"}) + */ +final class XmlAttributeMap +{ +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Annotation/XmlCollection.php b/vendor/jms/serializer/src/JMS/Serializer/Annotation/XmlCollection.php new file mode 100644 index 0000000000..699b59994b --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Annotation/XmlCollection.php @@ -0,0 +1,42 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Annotation; + +abstract class XmlCollection +{ + /** + * @var string + */ + public $entry = 'entry'; + + /** + * @var boolean + */ + public $inline = false; + + /** + * @var string + */ + public $namespace; + + /** + * @var boolean + */ + public $skipWhenEmpty = true; +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Annotation/XmlDiscriminator.php b/vendor/jms/serializer/src/JMS/Serializer/Annotation/XmlDiscriminator.php new file mode 100644 index 0000000000..caedd4c46c --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Annotation/XmlDiscriminator.php @@ -0,0 +1,42 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Annotation; + + +/** + * @Annotation + * @Target("CLASS") + */ +class XmlDiscriminator +{ + /** + * @var boolean + */ + public $attribute = false; + + /** + * @var boolean + */ + public $cdata = true; + + /** + * @var string + */ + public $namespace; +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Annotation/XmlElement.php b/vendor/jms/serializer/src/JMS/Serializer/Annotation/XmlElement.php new file mode 100644 index 0000000000..450fede8a7 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Annotation/XmlElement.php @@ -0,0 +1,36 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Annotation; + +/** + * @Annotation + * @Target({"PROPERTY", "METHOD","ANNOTATION"}) + */ +final class XmlElement +{ + /** + * @var boolean + */ + public $cdata = true; + + /** + * @var string + */ + public $namespace; +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Annotation/XmlKeyValuePairs.php b/vendor/jms/serializer/src/JMS/Serializer/Annotation/XmlKeyValuePairs.php new file mode 100644 index 0000000000..71fecab5d4 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Annotation/XmlKeyValuePairs.php @@ -0,0 +1,27 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Annotation; + +/** + * @Annotation + * @Target({"PROPERTY","METHOD","ANNOTATION"}) + */ +final class XmlKeyValuePairs +{ +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Annotation/XmlList.php b/vendor/jms/serializer/src/JMS/Serializer/Annotation/XmlList.php new file mode 100644 index 0000000000..291daa90b5 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Annotation/XmlList.php @@ -0,0 +1,27 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Annotation; + +/** + * @Annotation + * @Target({"PROPERTY","METHOD","ANNOTATION"}) + */ +final class XmlList extends XmlCollection +{ +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Annotation/XmlMap.php b/vendor/jms/serializer/src/JMS/Serializer/Annotation/XmlMap.php new file mode 100644 index 0000000000..813009df15 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Annotation/XmlMap.php @@ -0,0 +1,31 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Annotation; + +/** + * @Annotation + * @Target({"PROPERTY","METHOD","ANNOTATION"}) + */ +final class XmlMap extends XmlCollection +{ + /** + * @var string + */ + public $keyAttribute = '_key'; +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Annotation/XmlNamespace.php b/vendor/jms/serializer/src/JMS/Serializer/Annotation/XmlNamespace.php new file mode 100644 index 0000000000..582e128ac7 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Annotation/XmlNamespace.php @@ -0,0 +1,37 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Annotation; + +/** + * @Annotation + * @Target("CLASS") + */ +final class XmlNamespace +{ + /** + * @Required + * @var string + */ + public $uri; + + /** + * @var string + */ + public $prefix = ''; +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Annotation/XmlRoot.php b/vendor/jms/serializer/src/JMS/Serializer/Annotation/XmlRoot.php new file mode 100644 index 0000000000..46bcf479f4 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Annotation/XmlRoot.php @@ -0,0 +1,37 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Annotation; + +/** + * @Annotation + * @Target("CLASS") + */ +final class XmlRoot +{ + /** + * @Required + * @var string + */ + public $name; + + /** + * @var string + */ + public $namespace; +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Annotation/XmlValue.php b/vendor/jms/serializer/src/JMS/Serializer/Annotation/XmlValue.php new file mode 100644 index 0000000000..2fbf8723f5 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Annotation/XmlValue.php @@ -0,0 +1,31 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Annotation; + +/** + * @Annotation + * @Target({"PROPERTY","METHOD","ANNOTATION"}) + */ +final class XmlValue +{ + /** + * @var boolean + */ + public $cdata = true; +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/ArrayTransformerInterface.php b/vendor/jms/serializer/src/JMS/Serializer/ArrayTransformerInterface.php new file mode 100644 index 0000000000..fcd3fb1fa6 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/ArrayTransformerInterface.php @@ -0,0 +1,50 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer; + +/** + * Interface for array transformation. + * + * @author Daniel Bojdo + */ +interface ArrayTransformerInterface +{ + /** + * Converts objects to an array structure. + * + * This is useful when the data needs to be passed on to other methods which expect array data. + * + * @param mixed $data anything that converts to an array, typically an object or an array of objects + * @param SerializationContext|null $context + * + * @return array + */ + public function toArray($data, SerializationContext $context = null); + + /** + * Restores objects from an array structure. + * + * @param array $data + * @param string $type + * @param DeserializationContext|null $context + * + * @return mixed this returns whatever the passed type is, typically an object or an array of objects + */ + public function fromArray(array $data, $type, DeserializationContext $context = null); +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Builder/CallbackDriverFactory.php b/vendor/jms/serializer/src/JMS/Serializer/Builder/CallbackDriverFactory.php new file mode 100644 index 0000000000..e9ad7a1f63 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Builder/CallbackDriverFactory.php @@ -0,0 +1,29 @@ +callback = $callable; + } + + public function createDriver(array $metadataDirs, Reader $reader) + { + $driver = call_user_func($this->callback, $metadataDirs, $reader); + if ( ! $driver instanceof DriverInterface) { + throw new \LogicException('The callback must return an instance of DriverInterface.'); + } + + return $driver; + } +} \ No newline at end of file diff --git a/vendor/jms/serializer/src/JMS/Serializer/Builder/DefaultDriverFactory.php b/vendor/jms/serializer/src/JMS/Serializer/Builder/DefaultDriverFactory.php new file mode 100644 index 0000000000..b85f90a4ef --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Builder/DefaultDriverFactory.php @@ -0,0 +1,28 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Construction; + +use Doctrine\Common\Persistence\ManagerRegistry; +use JMS\Serializer\DeserializationContext; +use JMS\Serializer\Exception\InvalidArgumentException; +use JMS\Serializer\Exception\ObjectConstructionException; +use JMS\Serializer\Metadata\ClassMetadata; +use JMS\Serializer\VisitorInterface; + +/** + * Doctrine object constructor for new (or existing) objects during deserialization. + */ +class DoctrineObjectConstructor implements ObjectConstructorInterface +{ + const ON_MISSING_NULL = 'null'; + const ON_MISSING_EXCEPTION = 'exception'; + const ON_MISSING_FALLBACK = 'fallback'; + /** + * @var string + */ + private $fallbackStrategy; + + private $managerRegistry; + private $fallbackConstructor; + + /** + * Constructor. + * + * @param ManagerRegistry $managerRegistry Manager registry + * @param ObjectConstructorInterface $fallbackConstructor Fallback object constructor + * @param string $fallbackStrategy + */ + public function __construct(ManagerRegistry $managerRegistry, ObjectConstructorInterface $fallbackConstructor, $fallbackStrategy = self::ON_MISSING_NULL) + { + $this->managerRegistry = $managerRegistry; + $this->fallbackConstructor = $fallbackConstructor; + $this->fallbackStrategy = $fallbackStrategy; + } + + /** + * {@inheritdoc} + */ + public function construct(VisitorInterface $visitor, ClassMetadata $metadata, $data, array $type, DeserializationContext $context) + { + // Locate possible ObjectManager + $objectManager = $this->managerRegistry->getManagerForClass($metadata->name); + + if ( ! $objectManager) { + // No ObjectManager found, proceed with normal deserialization + return $this->fallbackConstructor->construct($visitor, $metadata, $data, $type, $context); + } + + // Locate possible ClassMetadata + $classMetadataFactory = $objectManager->getMetadataFactory(); + + if ($classMetadataFactory->isTransient($metadata->name)) { + // No ClassMetadata found, proceed with normal deserialization + return $this->fallbackConstructor->construct($visitor, $metadata, $data, $type, $context); + } + + // Managed entity, check for proxy load + if ( ! is_array($data)) { + // Single identifier, load proxy + return $objectManager->getReference($metadata->name, $data); + } + + // Fallback to default constructor if missing identifier(s) + $classMetadata = $objectManager->getClassMetadata($metadata->name); + $identifierList = array(); + + foreach ($classMetadata->getIdentifierFieldNames() as $name) { + if ( ! array_key_exists($name, $data)) { + return $this->fallbackConstructor->construct($visitor, $metadata, $data, $type, $context); + } + + $identifierList[$name] = $data[$name]; + } + + // Entity update, load it from database + $object = $objectManager->find($metadata->name, $identifierList); + + if (null === $object) { + switch ($this->fallbackStrategy) { + case self::ON_MISSING_NULL: + return null; + case self::ON_MISSING_EXCEPTION: + throw new ObjectConstructionException(sprintf("Entity %s can not be found", $metadata->name)); + case self::ON_MISSING_FALLBACK: + return $this->fallbackConstructor->construct($visitor, $metadata, $data, $type, $context); + default: + throw new InvalidArgumentException("The provided fallback strategy for the object constructor is not valid"); + } + } + + $objectManager->initializeObject($object); + + return $object; + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Construction/ObjectConstructorInterface.php b/vendor/jms/serializer/src/JMS/Serializer/Construction/ObjectConstructorInterface.php new file mode 100644 index 0000000000..e2c4be3f09 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Construction/ObjectConstructorInterface.php @@ -0,0 +1,47 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Construction; + +use JMS\Serializer\VisitorInterface; +use JMS\Serializer\Metadata\ClassMetadata; +use JMS\Serializer\DeserializationContext; + +/** + * Implementations of this interface construct new objects during deserialization. + * + * @author Johannes M. Schmitt + */ +interface ObjectConstructorInterface +{ + /** + * Constructs a new object. + * + * Implementations could for example create a new object calling "new", use + * "unserialize" techniques, reflection, or other means. + * + * @param VisitorInterface $visitor + * @param ClassMetadata $metadata + * @param mixed $data + * @param array $type ["name" => string, "params" => array] + * @param DeserializationContext $context + * + * @return object + */ + public function construct(VisitorInterface $visitor, ClassMetadata $metadata, $data, array $type, DeserializationContext $context); +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Construction/UnserializeObjectConstructor.php b/vendor/jms/serializer/src/JMS/Serializer/Construction/UnserializeObjectConstructor.php new file mode 100644 index 0000000000..9614d75034 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Construction/UnserializeObjectConstructor.php @@ -0,0 +1,47 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Construction; + +use Doctrine\Instantiator\Instantiator; +use JMS\Serializer\VisitorInterface; +use JMS\Serializer\Metadata\ClassMetadata; +use JMS\Serializer\DeserializationContext; + +class UnserializeObjectConstructor implements ObjectConstructorInterface +{ + /** @var Instantiator */ + private $instantiator; + + public function construct(VisitorInterface $visitor, ClassMetadata $metadata, $data, array $type, DeserializationContext $context) + { + return $this->getInstantiator()->instantiate($metadata->name); + } + + /** + * @return Instantiator + */ + private function getInstantiator() + { + if (null == $this->instantiator) { + $this->instantiator = new Instantiator(); + } + + return $this->instantiator; + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Context.php b/vendor/jms/serializer/src/JMS/Serializer/Context.php new file mode 100644 index 0000000000..d5ad6ff5b2 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Context.php @@ -0,0 +1,280 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer; + +use JMS\Serializer\Exception\RuntimeException; +use JMS\Serializer\Exclusion\DepthExclusionStrategy; +use JMS\Serializer\Exclusion\DisjunctExclusionStrategy; +use JMS\Serializer\Exclusion\ExclusionStrategyInterface; +use JMS\Serializer\Exclusion\GroupsExclusionStrategy; +use JMS\Serializer\Exclusion\VersionExclusionStrategy; +use JMS\Serializer\Metadata\ClassMetadata; +use JMS\Serializer\Metadata\PropertyMetadata; +use Metadata\MetadataFactory; +use Metadata\MetadataFactoryInterface; +use PhpCollection\Map; + +abstract class Context +{ + /** + * @var \PhpCollection\Map + */ + public $attributes; + + private $format; + + /** @var VisitorInterface */ + private $visitor; + + /** @var GraphNavigator */ + private $navigator; + + /** @var MetadataFactory */ + private $metadataFactory; + + /** @var ExclusionStrategyInterface */ + private $exclusionStrategy; + + /** @var boolean|null */ + private $serializeNull; + + private $initialized = false; + + /** @var \SplStack */ + private $metadataStack; + + public function __construct() + { + $this->attributes = new Map(); + } + + /** + * @param string $format + */ + public function initialize($format, VisitorInterface $visitor, GraphNavigator $navigator, MetadataFactoryInterface $factory) + { + if ($this->initialized) { + throw new \LogicException('This context was already initialized, and cannot be re-used.'); + } + + $this->initialized = true; + $this->format = $format; + $this->visitor = $visitor; + $this->navigator = $navigator; + $this->metadataFactory = $factory; + $this->metadataStack = new \SplStack(); + } + + public function accept($data, array $type = null) + { + return $this->navigator->accept($data, $type, $this); + } + + public function getMetadataFactory() + { + return $this->metadataFactory; + } + + public function getVisitor() + { + return $this->visitor; + } + + public function getNavigator() + { + return $this->navigator; + } + + public function getExclusionStrategy() + { + return $this->exclusionStrategy; + } + + public function setAttribute($key, $value) + { + $this->assertMutable(); + $this->attributes->set($key, $value); + + return $this; + } + + private function assertMutable() + { + if ( ! $this->initialized) { + return; + } + + throw new \LogicException('This context was already initialized and is immutable; you cannot modify it anymore.'); + } + + public function addExclusionStrategy(ExclusionStrategyInterface $strategy) + { + $this->assertMutable(); + + if (null === $this->exclusionStrategy) { + $this->exclusionStrategy = $strategy; + + return $this; + } + + if ($this->exclusionStrategy instanceof DisjunctExclusionStrategy) { + $this->exclusionStrategy->addStrategy($strategy); + + return $this; + } + + $this->exclusionStrategy = new DisjunctExclusionStrategy(array( + $this->exclusionStrategy, + $strategy, + )); + + return $this; + } + + /** + * @param integer $version + */ + public function setVersion($version) + { + if (null === $version) { + throw new \LogicException('The version must not be null.'); + } + + $this->attributes->set('version', $version); + $this->addExclusionStrategy(new VersionExclusionStrategy($version)); + + return $this; + } + + /** + * @param array|string $groups + */ + public function setGroups($groups) + { + if (empty($groups)) { + throw new \LogicException('The groups must not be empty.'); + } + + $this->attributes->set('groups', (array) $groups); + $this->addExclusionStrategy(new GroupsExclusionStrategy((array) $groups)); + + return $this; + } + + public function enableMaxDepthChecks() + { + $this->addExclusionStrategy(new DepthExclusionStrategy()); + + return $this; + } + + /** + * Set if NULLs should be serialized (TRUE) ot not (FALSE) + * + * @param bool $bool + * @return $this + */ + public function setSerializeNull($bool) + { + $this->serializeNull = (boolean) $bool; + + return $this; + } + + /** + * Returns TRUE when NULLs should be serialized + * Returns FALSE when NULLs should not be serialized + * Returns NULL when NULLs should not be serialized, + * but the user has not explicitly decided to use this policy + * + * @return bool|null + */ + public function shouldSerializeNull() + { + return $this->serializeNull; + } + + /** + * @return string + */ + public function getFormat() + { + return $this->format; + } + + public function pushClassMetadata(ClassMetadata $metadata) + { + $this->metadataStack->push($metadata); + } + + public function pushPropertyMetadata(PropertyMetadata $metadata) + { + $this->metadataStack->push($metadata); + } + + public function popPropertyMetadata() + { + $metadata = $this->metadataStack->pop(); + + if ( ! $metadata instanceof PropertyMetadata) { + throw new RuntimeException('Context metadataStack not working well'); + } + } + + public function popClassMetadata() + { + $metadata = $this->metadataStack->pop(); + + if ( ! $metadata instanceof ClassMetadata) { + throw new RuntimeException('Context metadataStack not working well'); + } + } + + public function getMetadataStack() + { + return $this->metadataStack; + } + + /** + * @return array + */ + public function getCurrentPath() + { + if (!$this->metadataStack) { + return array(); + } + + $paths = array(); + foreach ($this->metadataStack as $metadata) { + if ($metadata instanceof PropertyMetadata) { + array_unshift($paths, $metadata->name); + } + } + + return $paths; + } + + + abstract public function getDepth(); + + /** + * @return integer + */ + abstract public function getDirection(); +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/ContextFactory/CallableContextFactory.php b/vendor/jms/serializer/src/JMS/Serializer/ContextFactory/CallableContextFactory.php new file mode 100644 index 0000000000..84c26b05d2 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/ContextFactory/CallableContextFactory.php @@ -0,0 +1,48 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\ContextFactory; + +/** + * Context Factory using a callable. + */ +abstract class CallableContextFactory +{ + /** + * @var callable + */ + private $callable; + + /** + * @param callable $callable + */ + public function __construct(callable $callable) + { + $this->callable = $callable; + } + + /** + * @return mixed + */ + protected function createContext() + { + $callable = $this->callable; + + return $callable(); + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/ContextFactory/CallableDeserializationContextFactory.php b/vendor/jms/serializer/src/JMS/Serializer/ContextFactory/CallableDeserializationContextFactory.php new file mode 100644 index 0000000000..20f9808557 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/ContextFactory/CallableDeserializationContextFactory.php @@ -0,0 +1,34 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\ContextFactory; + +/** + * Deserialization Context Factory using a callable. + */ +class CallableDeserializationContextFactory extends CallableContextFactory implements + DeserializationContextFactoryInterface +{ + /** + * {@InheritDoc} + */ + public function createDeserializationContext() + { + return $this->createContext(); + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/ContextFactory/CallableSerializationContextFactory.php b/vendor/jms/serializer/src/JMS/Serializer/ContextFactory/CallableSerializationContextFactory.php new file mode 100644 index 0000000000..083666b357 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/ContextFactory/CallableSerializationContextFactory.php @@ -0,0 +1,34 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\ContextFactory; + +/** + * Serialization Context Factory using a callable. + */ +class CallableSerializationContextFactory extends CallableContextFactory implements + SerializationContextFactoryInterface +{ + /** + * {@InheritDoc} + */ + public function createSerializationContext() + { + return $this->createContext(); + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/ContextFactory/DefaultDeserializationContextFactory.php b/vendor/jms/serializer/src/JMS/Serializer/ContextFactory/DefaultDeserializationContextFactory.php new file mode 100644 index 0000000000..d2b1d5eed4 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/ContextFactory/DefaultDeserializationContextFactory.php @@ -0,0 +1,35 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\ContextFactory; + +use JMS\Serializer\DeserializationContext; + +/** + * Default Deserialization Context Factory. + */ +class DefaultDeserializationContextFactory implements DeserializationContextFactoryInterface +{ + /** + * {@InheritDoc} + */ + public function createDeserializationContext() + { + return new DeserializationContext(); + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/ContextFactory/DefaultSerializationContextFactory.php b/vendor/jms/serializer/src/JMS/Serializer/ContextFactory/DefaultSerializationContextFactory.php new file mode 100644 index 0000000000..a292d27167 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/ContextFactory/DefaultSerializationContextFactory.php @@ -0,0 +1,35 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\ContextFactory; + +use JMS\Serializer\SerializationContext; + +/** + * Default Serialization Context Factory. + */ +class DefaultSerializationContextFactory implements SerializationContextFactoryInterface +{ + /** + * {@InheritDoc} + */ + public function createSerializationContext() + { + return new SerializationContext(); + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/ContextFactory/DeserializationContextFactoryInterface.php b/vendor/jms/serializer/src/JMS/Serializer/ContextFactory/DeserializationContextFactoryInterface.php new file mode 100644 index 0000000000..3b6718b1de --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/ContextFactory/DeserializationContextFactoryInterface.php @@ -0,0 +1,32 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\ContextFactory; + +use JMS\Serializer\DeserializationContext; + +/** + * Deserialization Context Factory Interface. + */ +interface DeserializationContextFactoryInterface +{ + /** + * @return DeserializationContext + */ + public function createDeserializationContext(); +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/ContextFactory/SerializationContextFactoryInterface.php b/vendor/jms/serializer/src/JMS/Serializer/ContextFactory/SerializationContextFactoryInterface.php new file mode 100644 index 0000000000..725d83bb15 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/ContextFactory/SerializationContextFactoryInterface.php @@ -0,0 +1,32 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\ContextFactory; + +use JMS\Serializer\SerializationContext; + +/** + * Serialization Context Factory Interface. + */ +interface SerializationContextFactoryInterface +{ + /** + * @return SerializationContext + */ + public function createSerializationContext(); +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/DeserializationContext.php b/vendor/jms/serializer/src/JMS/Serializer/DeserializationContext.php new file mode 100644 index 0000000000..32aa8677e9 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/DeserializationContext.php @@ -0,0 +1,53 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer; + +class DeserializationContext extends Context +{ + private $depth = 0; + + public static function create() + { + return new self(); + } + + public function getDirection() + { + return GraphNavigator::DIRECTION_DESERIALIZATION; + } + + public function getDepth() + { + return $this->depth; + } + + public function increaseDepth() + { + $this->depth += 1; + } + + public function decreaseDepth() + { + if ($this->depth <= 0) { + throw new \LogicException('Depth cannot be smaller than zero.'); + } + + $this->depth -= 1; + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/EventDispatcher/Event.php b/vendor/jms/serializer/src/JMS/Serializer/EventDispatcher/Event.php new file mode 100644 index 0000000000..46fda85c07 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/EventDispatcher/Event.php @@ -0,0 +1,76 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\EventDispatcher; + +use JMS\Serializer\Context; + +class Event +{ + /** + * @var bool Whether no further event listeners should be triggered + */ + private $propagationStopped = false; + + protected $type; + private $context; + + public function __construct(Context $context, array $type) + { + $this->context = $context; + $this->type = $type; + } + + public function getVisitor() + { + return $this->context->getVisitor(); + } + + public function getContext() + { + return $this->context; + } + + public function getType() + { + return $this->type; + } + + /** + * Returns whether further event listeners should be triggered. + * + * @see Event::stopPropagation() + * + * @return bool Whether propagation was already stopped for this event + */ + public function isPropagationStopped() + { + return $this->propagationStopped; + } + /** + * Stops the propagation of the event to further event listeners. + * + * If multiple event listeners are connected to the same event, no + * further event listener will be triggered once any trigger calls + * stopPropagation(). + */ + public function stopPropagation() + { + $this->propagationStopped = true; + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/EventDispatcher/EventDispatcher.php b/vendor/jms/serializer/src/JMS/Serializer/EventDispatcher/EventDispatcher.php new file mode 100644 index 0000000000..8f4f075db8 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/EventDispatcher/EventDispatcher.php @@ -0,0 +1,130 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\EventDispatcher; +use JMS\Serializer\Exception\InvalidArgumentException; + +/** + * Light-weight event dispatcher. + * + * This implementation focuses primarily on performance, and dispatching + * events for certain classes. It is not a general purpose event dispatcher. + * + * @author Johannes M. Schmitt + */ +class EventDispatcher implements EventDispatcherInterface +{ + private $listeners = array(); + private $classListeners = array(); + + public static function getDefaultMethodName($eventName) + { + return 'on'.str_replace(array('_', '.'), '', $eventName); + } + + /** + * Sets the listeners. + * + * @param array $listeners + */ + public function setListeners(array $listeners) + { + $this->listeners = $listeners; + $this->classListeners = array(); + } + + public function addListener($eventName, $callable, $class = null, $format = null) + { + $this->listeners[$eventName][] = array($callable, null === $class ? null : strtolower($class), $format); + unset($this->classListeners[$eventName]); + } + + public function addSubscriber(EventSubscriberInterface $subscriber) + { + foreach ($subscriber->getSubscribedEvents() as $eventData) { + if ( ! isset($eventData['event'])) { + throw new InvalidArgumentException(sprintf('Each event must have a "event" key.')); + } + + $method = isset($eventData['method']) ? $eventData['method'] : self::getDefaultMethodName($eventData['event']); + $class = isset($eventData['class']) ? strtolower($eventData['class']) : null; + $format = isset($eventData['format']) ? $eventData['format'] : null; + $this->listeners[$eventData['event']][] = array(array($subscriber, $method), $class, $format); + unset($this->classListeners[$eventData['event']]); + } + } + + public function hasListeners($eventName, $class, $format) + { + if ( ! isset($this->listeners[$eventName])) { + return false; + } + + $loweredClass = strtolower($class); + if ( ! isset($this->classListeners[$eventName][$loweredClass][$format])) { + $this->classListeners[$eventName][$loweredClass][$format] = $this->initializeListeners($eventName, $loweredClass, $format); + } + + return !!$this->classListeners[$eventName][$loweredClass][$format]; + } + + public function dispatch($eventName, $class, $format, Event $event) + { + if ( ! isset($this->listeners[$eventName])) { + return; + } + + $loweredClass = strtolower($class); + if ( ! isset($this->classListeners[$eventName][$loweredClass][$format])) { + $this->classListeners[$eventName][$loweredClass][$format] = $this->initializeListeners($eventName, $loweredClass, $format); + } + + foreach ($this->classListeners[$eventName][$loweredClass][$format] as $listener) { + + if ($event->isPropagationStopped()) { + break; + } + + call_user_func($listener, $event, $eventName, $loweredClass, $format, $this); + } + } + + /** + * @param string $eventName + * @param string $loweredClass + * @param string $format + * + * @return array An array of listeners + */ + protected function initializeListeners($eventName, $loweredClass, $format) + { + $listeners = array(); + foreach ($this->listeners[$eventName] as $listener) { + if (null !== $listener[1] && $loweredClass !== $listener[1]) { + continue; + } + if (null !== $listener[2] && $format !== $listener[2]) { + continue; + } + + $listeners[] = $listener[0]; + } + + return $listeners; + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/EventDispatcher/EventDispatcherInterface.php b/vendor/jms/serializer/src/JMS/Serializer/EventDispatcher/EventDispatcherInterface.php new file mode 100644 index 0000000000..d757f99af2 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/EventDispatcher/EventDispatcherInterface.php @@ -0,0 +1,66 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\EventDispatcher; + +interface EventDispatcherInterface +{ + /** + * Returns whether there are listeners. + * + * @param string $eventName + * @param string $class + * @param string $format + * + * @return boolean + */ + public function hasListeners($eventName, $class, $format); + + /** + * Dispatches an event. + * + * The listeners/subscribers are called in the same order in which they + * were added to the dispatcher. + * + * @param string $eventName + * @param string $class + * @param string $format + * @param Event $event + * @return void + */ + public function dispatch($eventName, $class, $format, Event $event); + + /** + * Adds a listener. + * + * @param string $eventName + * @param callable $callable + * @param string|null $class + * @param string|null $format + * @return void + */ + public function addListener($eventName, $callable, $class = null, $format = null); + + /** + * Adds a subscribers. + * + * @param EventSubscriberInterface $subscriber + * @return void + */ + public function addSubscriber(EventSubscriberInterface $subscriber); +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/EventDispatcher/EventSubscriberInterface.php b/vendor/jms/serializer/src/JMS/Serializer/EventDispatcher/EventSubscriberInterface.php new file mode 100644 index 0000000000..a079ea5ffa --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/EventDispatcher/EventSubscriberInterface.php @@ -0,0 +1,38 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\EventDispatcher; + +interface EventSubscriberInterface +{ + /** + * Returns the events to which this class has subscribed. + * + * Return format: + * array( + * array('event' => 'the-event-name', 'method' => 'onEventName', 'class' => 'some-class', 'format' => 'json'), + * array(...), + * ) + * + * The class may be omitted if the class wants to subscribe to events of all classes. + * Same goes for the format key. + * + * @return array + */ + public static function getSubscribedEvents(); +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/EventDispatcher/Events.php b/vendor/jms/serializer/src/JMS/Serializer/EventDispatcher/Events.php new file mode 100644 index 0000000000..b0211e36d7 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/EventDispatcher/Events.php @@ -0,0 +1,29 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\EventDispatcher; + +abstract class Events +{ + const PRE_SERIALIZE = 'serializer.pre_serialize'; + const POST_SERIALIZE = 'serializer.post_serialize'; + const PRE_DESERIALIZE = 'serializer.pre_deserialize'; + const POST_DESERIALIZE = 'serializer.post_deserialize'; + + final private function __construct() { } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/EventDispatcher/LazyEventDispatcher.php b/vendor/jms/serializer/src/JMS/Serializer/EventDispatcher/LazyEventDispatcher.php new file mode 100644 index 0000000000..fbc782fcd5 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/EventDispatcher/LazyEventDispatcher.php @@ -0,0 +1,53 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\EventDispatcher; + +use Symfony\Component\DependencyInjection\ContainerInterface; + +class LazyEventDispatcher extends EventDispatcher +{ + private $container; + + public function __construct(ContainerInterface $container) + { + $this->container = $container; + } + + /** + * {@inheritdoc} + */ + protected function initializeListeners($eventName, $loweredClass, $format) + { + $listeners = parent::initializeListeners($eventName, $loweredClass, $format); + + foreach ($listeners as &$listener) { + if ( ! is_array($listener) || ! is_string($listener[0])) { + continue; + } + + if ( ! $this->container->has($listener[0])) { + continue; + } + + $listener[0] = $this->container->get($listener[0]); + } + + return $listeners; + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/EventDispatcher/ObjectEvent.php b/vendor/jms/serializer/src/JMS/Serializer/EventDispatcher/ObjectEvent.php new file mode 100644 index 0000000000..c619d41a54 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/EventDispatcher/ObjectEvent.php @@ -0,0 +1,38 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\EventDispatcher; + +use JMS\Serializer\Context; + +class ObjectEvent extends Event +{ + private $object; + + public function __construct(Context $context, $object, array $type) + { + parent::__construct($context, $type); + + $this->object = $object; + } + + public function getObject() + { + return $this->object; + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/EventDispatcher/PreDeserializeEvent.php b/vendor/jms/serializer/src/JMS/Serializer/EventDispatcher/PreDeserializeEvent.php new file mode 100644 index 0000000000..228eadeb0a --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/EventDispatcher/PreDeserializeEvent.php @@ -0,0 +1,48 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\EventDispatcher; + +use JMS\Serializer\DeserializationContext; + +class PreDeserializeEvent extends Event +{ + private $data; + + public function __construct(DeserializationContext $context, $data, array $type) + { + parent::__construct($context, $type); + + $this->data = $data; + } + + public function setType($name, array $params = array()) + { + $this->type = array('name' => $name, 'params' => $params); + } + + public function getData() + { + return $this->data; + } + + public function setData($data) + { + $this->data = $data; + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/EventDispatcher/PreSerializeEvent.php b/vendor/jms/serializer/src/JMS/Serializer/EventDispatcher/PreSerializeEvent.php new file mode 100644 index 0000000000..ca3ed9cb19 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/EventDispatcher/PreSerializeEvent.php @@ -0,0 +1,31 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\EventDispatcher; + +class PreSerializeEvent extends ObjectEvent +{ + /** + * @param string $typeName + * @param array $params + */ + public function setType($typeName, array $params = array()) + { + $this->type = array('name' => $typeName, 'params' => $params); + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/EventDispatcher/Subscriber/DoctrineProxySubscriber.php b/vendor/jms/serializer/src/JMS/Serializer/EventDispatcher/Subscriber/DoctrineProxySubscriber.php new file mode 100644 index 0000000000..1f91d7702f --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/EventDispatcher/Subscriber/DoctrineProxySubscriber.php @@ -0,0 +1,123 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\EventDispatcher\Subscriber; + +use Doctrine\ORM\PersistentCollection; +use Doctrine\ODM\MongoDB\PersistentCollection as MongoDBPersistentCollection; +use Doctrine\ODM\PHPCR\PersistentCollection as PHPCRPersistentCollection; +use Doctrine\Common\Persistence\Proxy; +use Doctrine\ORM\Proxy\Proxy as ORMProxy; +use JMS\Serializer\EventDispatcher\EventDispatcherInterface; +use JMS\Serializer\EventDispatcher\PreSerializeEvent; +use JMS\Serializer\EventDispatcher\EventSubscriberInterface; + +class DoctrineProxySubscriber implements EventSubscriberInterface +{ + /** + * @var bool + */ + private $skipVirtualTypeInit = false; + + /** + * @var bool + */ + private $initializeExcluded = true; + + public function __construct($skipVirtualTypeInit = false, $initializeExcluded = true) + { + $this->skipVirtualTypeInit = (bool)$skipVirtualTypeInit; + $this->initializeExcluded = (bool)$initializeExcluded; + } + + public function onPreSerialize(PreSerializeEvent $event) + { + $object = $event->getObject(); + $type = $event->getType(); + + // If the set type name is not an actual class, but a faked type for which a custom handler exists, we do not + // modify it with this subscriber. Also, we forgo autoloading here as an instance of this type is already created, + // so it must be loaded if its a real class. + $virtualType = ! class_exists($type['name'], false); + + if ($object instanceof PersistentCollection + || $object instanceof MongoDBPersistentCollection + || $object instanceof PHPCRPersistentCollection + ) { + if ( ! $virtualType) { + $event->setType('ArrayCollection'); + } + + return; + } + + if (($this->skipVirtualTypeInit && $virtualType) || + (!$object instanceof Proxy && !$object instanceof ORMProxy) + ) { + return; + } + + // do not initialize the proxy if is going to be excluded by-class by some exclusion strategy + if ($this->initializeExcluded === false && !$virtualType) { + $context = $event->getContext(); + $exclusionStrategy = $context->getExclusionStrategy(); + if ($exclusionStrategy !== null && $exclusionStrategy->shouldSkipClass($context->getMetadataFactory()->getMetadataForClass(get_parent_class($object)), $context)) { + return; + } + } + + $object->__load(); + + if ( ! $virtualType) { + $event->setType(get_parent_class($object)); + } + } + + public function onPreSerializeTypedProxy(PreSerializeEvent $event, $eventName, $class, $format, EventDispatcherInterface $dispatcher) + { + $type = $event->getType(); + // is a virtual type? then there is no need to change the event name + if (!class_exists($type['name'], false)) { + return; + } + + $object = $event->getObject(); + if ($object instanceof Proxy) { + $parentClassName = get_parent_class($object); + + // check if this is already a re-dispatch + if (strtolower($class) !== strtolower($parentClassName)) { + $event->stopPropagation(); + $newEvent = new PreSerializeEvent($event->getContext(), $object, array('name' => $parentClassName, 'params' => $type['params'])); + $dispatcher->dispatch($eventName, $parentClassName, $format, $newEvent); + + // update the type in case some listener changed it + $newType = $newEvent->getType(); + $event->setType($newType['name'], $newType['params']); + } + } + } + + public static function getSubscribedEvents() + { + return array( + array('event' => 'serializer.pre_serialize', 'method' => 'onPreSerializeTypedProxy'), + array('event' => 'serializer.pre_serialize', 'method' => 'onPreSerialize'), + ); + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/EventDispatcher/Subscriber/SymfonyValidatorSubscriber.php b/vendor/jms/serializer/src/JMS/Serializer/EventDispatcher/Subscriber/SymfonyValidatorSubscriber.php new file mode 100644 index 0000000000..b34a8bc947 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/EventDispatcher/Subscriber/SymfonyValidatorSubscriber.php @@ -0,0 +1,61 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\EventDispatcher\Subscriber; + +use JMS\Serializer\EventDispatcher\Event; +use JMS\Serializer\EventDispatcher\EventSubscriberInterface; +use JMS\Serializer\Exception\ValidationFailedException; +use Symfony\Component\Validator\ValidatorInterface; + +class SymfonyValidatorSubscriber implements EventSubscriberInterface +{ + private $validator; + + public function __construct(ValidatorInterface $validator) + { + $this->validator = $validator; + } + + public static function getSubscribedEvents() + { + return array( + array('event' => 'serializer.post_deserialize', 'method' => 'onPostDeserialize'), + ); + } + + public function onPostDeserialize(Event $event) + { + $context = $event->getContext(); + + if ($context->getDepth() > 0) { + return; + } + + $validator = $this->validator; + $context->attributes->get('validation_groups')->map( + function(array $groups) use ($event, $validator) { + $list = $validator->validate($event->getObject(), $groups); + + if ($list->count() > 0) { + throw new ValidationFailedException($list); + } + } + ); + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/EventDispatcher/Subscriber/SymfonyValidatorValidatorSubscriber.php b/vendor/jms/serializer/src/JMS/Serializer/EventDispatcher/Subscriber/SymfonyValidatorValidatorSubscriber.php new file mode 100644 index 0000000000..75ab85d5ed --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/EventDispatcher/Subscriber/SymfonyValidatorValidatorSubscriber.php @@ -0,0 +1,73 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\EventDispatcher\Subscriber; + +use JMS\Serializer\EventDispatcher\Event; +use JMS\Serializer\EventDispatcher\EventSubscriberInterface; +use JMS\Serializer\Exception\ValidationFailedException; +use PhpOption\None; +use Symfony\Component\Validator\Validator\ValidatorInterface; + +class SymfonyValidatorValidatorSubscriber implements EventSubscriberInterface +{ + /** + * @var ValidatorInterface + */ + private $validator; + + public function __construct(ValidatorInterface $validator) + { + $this->validator = $validator; + } + + public static function getSubscribedEvents() + { + return array( + array('event' => 'serializer.post_deserialize', 'method' => 'onPostDeserialize'), + ); + } + + public function onPostDeserialize(Event $event) + { + $context = $event->getContext(); + + if ($context->getDepth() > 0) { + return; + } + + $validator = $this->validator; + $groups = $context->attributes->get('validation_groups') instanceof None + ? null + : $context->attributes->get('validation_groups')->get(); + + if (!$groups) { + return; + } + + $constraints = $context->attributes->get('validation_constraints') instanceof None + ? null + : $context->attributes->get('validation_constraints')->get(); + + $list = $validator->validate($event->getObject(), $constraints, $groups); + + if ($list->count() > 0) { + throw new ValidationFailedException($list); + } + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Exception/Exception.php b/vendor/jms/serializer/src/JMS/Serializer/Exception/Exception.php new file mode 100644 index 0000000000..ae8fa65367 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Exception/Exception.php @@ -0,0 +1,28 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Exception; + +/** + * Base exception for the Serializer. + * + * @author Johannes M. Schmitt + */ +interface Exception +{ +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Exception/ExpressionLanguageRequiredException.php b/vendor/jms/serializer/src/JMS/Serializer/Exception/ExpressionLanguageRequiredException.php new file mode 100644 index 0000000000..3df970fe47 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Exception/ExpressionLanguageRequiredException.php @@ -0,0 +1,26 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Exception; + +/** + * @author Asmir Mustafic + */ +class ExpressionLanguageRequiredException extends LogicException +{ +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Exception/InvalidArgumentException.php b/vendor/jms/serializer/src/JMS/Serializer/Exception/InvalidArgumentException.php new file mode 100644 index 0000000000..fb5d344c21 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Exception/InvalidArgumentException.php @@ -0,0 +1,28 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Exception; + +/** + * InvalidArgumentException for the Serializer. + * + * @author Johannes M. Schmitt + */ +class InvalidArgumentException extends \InvalidArgumentException implements Exception +{ +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Exception/LogicException.php b/vendor/jms/serializer/src/JMS/Serializer/Exception/LogicException.php new file mode 100644 index 0000000000..f74b0153ea --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Exception/LogicException.php @@ -0,0 +1,28 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Exception; + +/** + * LogicException for the Serializer. + * + * @author Johannes M. Schmitt + */ +class LogicException extends \LogicException implements Exception +{ +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Exception/ObjectConstructionException.php b/vendor/jms/serializer/src/JMS/Serializer/Exception/ObjectConstructionException.php new file mode 100644 index 0000000000..9b8a845d04 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Exception/ObjectConstructionException.php @@ -0,0 +1,28 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Exception; + +/** + * InvalidArgumentException for the Serializer. + * + * @author Asmir Mustafic + */ +class ObjectConstructionException extends RuntimeException implements Exception +{ +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Exception/RuntimeException.php b/vendor/jms/serializer/src/JMS/Serializer/Exception/RuntimeException.php new file mode 100644 index 0000000000..cf15a7cd9d --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Exception/RuntimeException.php @@ -0,0 +1,28 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Exception; + +/** + * RuntimeException for the Serializer. + * + * @author Johannes M. Schmitt + */ +class RuntimeException extends \RuntimeException implements Exception +{ +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Exception/UnsupportedFormatException.php b/vendor/jms/serializer/src/JMS/Serializer/Exception/UnsupportedFormatException.php new file mode 100644 index 0000000000..bf8e6d74f8 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Exception/UnsupportedFormatException.php @@ -0,0 +1,23 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Exception; + +class UnsupportedFormatException extends InvalidArgumentException +{ +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Exception/ValidationFailedException.php b/vendor/jms/serializer/src/JMS/Serializer/Exception/ValidationFailedException.php new file mode 100644 index 0000000000..2627b919ab --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Exception/ValidationFailedException.php @@ -0,0 +1,44 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Exception; + +use Symfony\Component\Validator\ConstraintViolationListInterface; + +class ValidationFailedException extends RuntimeException +{ + /** + * @var ConstraintViolationListInterface + */ + private $list; + + public function __construct(ConstraintViolationListInterface $list) + { + parent::__construct(sprintf('Validation failed with %d error(s).', count($list))); + + $this->list = $list; + } + + /** + * @return ConstraintViolationListInterface + */ + public function getConstraintViolationList() + { + return $this->list; + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Exception/XmlErrorException.php b/vendor/jms/serializer/src/JMS/Serializer/Exception/XmlErrorException.php new file mode 100644 index 0000000000..509a5947d8 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Exception/XmlErrorException.php @@ -0,0 +1,53 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Exception; + +class XmlErrorException extends RuntimeException +{ + private $xmlError; + + public function __construct(\LibXMLError $error) + { + switch ($error->level) { + case LIBXML_ERR_WARNING: + $level = 'WARNING'; + break; + + case LIBXML_ERR_FATAL: + $level = 'FATAL'; + break; + + case LIBXML_ERR_ERROR: + $level = 'ERROR'; + break; + + default: + $level = 'UNKNOWN'; + } + + parent::__construct(sprintf('[%s] %s in %s (line: %d, column: %d)', $level, $error->message, $error->file, $error->line, $error->column)); + + $this->xmlError = $error; + } + + public function getXmlError() + { + return $this->xmlError; + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Exclusion/DepthExclusionStrategy.php b/vendor/jms/serializer/src/JMS/Serializer/Exclusion/DepthExclusionStrategy.php new file mode 100644 index 0000000000..89295fcaa8 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Exclusion/DepthExclusionStrategy.php @@ -0,0 +1,67 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Exclusion; + +use JMS\Serializer\Context; +use JMS\Serializer\Metadata\ClassMetadata; +use JMS\Serializer\Metadata\PropertyMetadata; + +/** + * @author Adrien Brault + */ +class DepthExclusionStrategy implements ExclusionStrategyInterface +{ + /** + * {@inheritDoc} + */ + public function shouldSkipClass(ClassMetadata $metadata, Context $context) + { + return $this->isTooDeep($context); + } + + /** + * {@inheritDoc} + */ + public function shouldSkipProperty(PropertyMetadata $property, Context $context) + { + return $this->isTooDeep($context); + } + + private function isTooDeep(Context $context) + { + $depth = $context->getDepth(); + $metadataStack = $context->getMetadataStack(); + + $nthProperty = 0; + // iterate from the first added items to the lasts + for ($i = $metadataStack->count() - 1; $i > 0; $i--) { + $metadata = $metadataStack[$i]; + if ($metadata instanceof PropertyMetadata) { + $nthProperty++; + $relativeDepth = $depth - $nthProperty; + + if (null !== $metadata->maxDepth && $relativeDepth > $metadata->maxDepth) { + return true; + } + } + } + + return false; + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Exclusion/DisjunctExclusionStrategy.php b/vendor/jms/serializer/src/JMS/Serializer/Exclusion/DisjunctExclusionStrategy.php new file mode 100644 index 0000000000..fcede93f68 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Exclusion/DisjunctExclusionStrategy.php @@ -0,0 +1,93 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Exclusion; + +use JMS\Serializer\Context; +use JMS\Serializer\Metadata\ClassMetadata; +use JMS\Serializer\Metadata\PropertyMetadata; +use PhpCollection\Sequence; +use PhpCollection\SequenceInterface; + +/** + * Disjunct Exclusion Strategy. + * + * This strategy is short-circuiting and will skip a class, or property as soon as one of the delegates skips it. + * + * @author Johannes M. Schmitt + */ +class DisjunctExclusionStrategy implements ExclusionStrategyInterface +{ + /** @var \PhpCollection\SequenceInterface */ + private $delegates; + + /** + * @param ExclusionStrategyInterface[]|SequenceInterface $delegates + */ + public function __construct($delegates) + { + if ( ! $delegates instanceof SequenceInterface) { + $delegates = new Sequence($delegates); + } + + $this->delegates = $delegates; + } + + public function addStrategy(ExclusionStrategyInterface $strategy) + { + $this->delegates->add($strategy); + } + + /** + * Whether the class should be skipped. + * + * @param ClassMetadata $metadata + * + * @return boolean + */ + public function shouldSkipClass(ClassMetadata $metadata, Context $context) + { + foreach ($this->delegates as $delegate) { + /** @var $delegate ExclusionStrategyInterface */ + if ($delegate->shouldSkipClass($metadata, $context)) { + return true; + } + } + + return false; + } + + /** + * Whether the property should be skipped. + * + * @param PropertyMetadata $property + * + * @return boolean + */ + public function shouldSkipProperty(PropertyMetadata $property, Context $context) + { + foreach ($this->delegates as $delegate) { + /** @var $delegate ExclusionStrategyInterface */ + if ($delegate->shouldSkipProperty($property, $context)) { + return true; + } + } + + return false; + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Exclusion/ExclusionStrategyInterface.php b/vendor/jms/serializer/src/JMS/Serializer/Exclusion/ExclusionStrategyInterface.php new file mode 100644 index 0000000000..a84e1df2d8 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Exclusion/ExclusionStrategyInterface.php @@ -0,0 +1,49 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Exclusion; + +use JMS\Serializer\Metadata\ClassMetadata; +use JMS\Serializer\Metadata\PropertyMetadata; +use JMS\Serializer\Context; + +/** + * Interface for exclusion strategies. + * + * @author Johannes M. Schmitt + */ +interface ExclusionStrategyInterface +{ + /** + * Whether the class should be skipped. + * + * @param ClassMetadata $metadata + * + * @return boolean + */ + public function shouldSkipClass(ClassMetadata $metadata, Context $context); + + /** + * Whether the property should be skipped. + * + * @param PropertyMetadata $property + * + * @return boolean + */ + public function shouldSkipProperty(PropertyMetadata $property, Context $context); +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Exclusion/ExpressionLanguageExclusionStrategy.php b/vendor/jms/serializer/src/JMS/Serializer/Exclusion/ExpressionLanguageExclusionStrategy.php new file mode 100644 index 0000000000..e6dc309fcb --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Exclusion/ExpressionLanguageExclusionStrategy.php @@ -0,0 +1,64 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Exclusion; + +use JMS\Serializer\Context; +use JMS\Serializer\Metadata\PropertyMetadata; +use JMS\Serializer\SerializationContext; +use JMS\Serializer\Expression\ExpressionEvaluatorInterface; + +/** + * Exposes an exclusion strategy based on the Symfony's expression language. + * This is not a standard exclusion strategy and can not be used in user applications. + * + * @internal + * + * @author Asmir Mustafic + */ +class ExpressionLanguageExclusionStrategy +{ + /** + * @var ExpressionEvaluatorInterface + */ + private $expressionEvaluator; + + public function __construct(ExpressionEvaluatorInterface $expressionEvaluator) + { + $this->expressionEvaluator = $expressionEvaluator; + } + + /** + * {@inheritDoc} + */ + public function shouldSkipProperty(PropertyMetadata $property, Context $navigatorContext) + { + if (null === $property->excludeIf) { + return false; + } + + $variables = [ + 'context' => $navigatorContext, + ]; + if ($navigatorContext instanceof SerializationContext) { + $variables['object'] = $navigatorContext->getObject(); + } + + return $this->expressionEvaluator->evaluate($property->excludeIf, $variables); + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Exclusion/GroupsExclusionStrategy.php b/vendor/jms/serializer/src/JMS/Serializer/Exclusion/GroupsExclusionStrategy.php new file mode 100644 index 0000000000..6d15663250 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Exclusion/GroupsExclusionStrategy.php @@ -0,0 +1,92 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Exclusion; + +use JMS\Serializer\Metadata\ClassMetadata; +use JMS\Serializer\Metadata\PropertyMetadata; +use JMS\Serializer\Context; + +class GroupsExclusionStrategy implements ExclusionStrategyInterface +{ + const DEFAULT_GROUP = 'Default'; + + private $groups = array(); + + public function __construct(array $groups) + { + if (empty($groups)) { + $groups = array(self::DEFAULT_GROUP); + } + + $this->groups = $groups; + } + + /** + * {@inheritDoc} + */ + public function shouldSkipClass(ClassMetadata $metadata, Context $navigatorContext) + { + return false; + } + + /** + * {@inheritDoc} + */ + public function shouldSkipProperty(PropertyMetadata $property, Context $navigatorContext) + { + $groups = $this->getGroupsFor($navigatorContext); + + if ( ! $property->groups) { + return ! in_array(self::DEFAULT_GROUP, $groups); + } + + return $this->shouldSkipUsingGroups($property, $groups); + } + + private function shouldSkipUsingGroups(PropertyMetadata $property, $groups) + { + foreach ($property->groups as $group) { + if (in_array($group, $groups)) { + return false; + } + } + + return true; + } + + private function getGroupsFor(Context $navigatorContext) + { + $paths = $navigatorContext->getCurrentPath(); + + $groups = $this->groups; + foreach ($paths as $index => $path) { + if (!array_key_exists($path, $groups)) { + if ($index > 0) { + $groups = array(self::DEFAULT_GROUP); + } + + break; + } + + $groups = $groups[$path]; + } + + return $groups; + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Exclusion/VersionExclusionStrategy.php b/vendor/jms/serializer/src/JMS/Serializer/Exclusion/VersionExclusionStrategy.php new file mode 100644 index 0000000000..04650dc674 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Exclusion/VersionExclusionStrategy.php @@ -0,0 +1,57 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Exclusion; + +use JMS\Serializer\Metadata\ClassMetadata; +use JMS\Serializer\Metadata\PropertyMetadata; +use JMS\Serializer\Context; + +class VersionExclusionStrategy implements ExclusionStrategyInterface +{ + private $version; + + public function __construct($version) + { + $this->version = $version; + } + + /** + * {@inheritDoc} + */ + public function shouldSkipClass(ClassMetadata $metadata, Context $navigatorContext) + { + return false; + } + + /** + * {@inheritDoc} + */ + public function shouldSkipProperty(PropertyMetadata $property, Context $navigatorContext) + { + if ((null !== $version = $property->sinceVersion) && version_compare($this->version, $version, '<')) { + return true; + } + + if ((null !== $version = $property->untilVersion) && version_compare($this->version, $version, '>')) { + return true; + } + + return false; + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Expression/ExpressionEvaluator.php b/vendor/jms/serializer/src/JMS/Serializer/Expression/ExpressionEvaluator.php new file mode 100644 index 0000000000..223cd3d4cb --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Expression/ExpressionEvaluator.php @@ -0,0 +1,79 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Expression; + +use Symfony\Component\ExpressionLanguage\ExpressionLanguage; + +/** + * @author Asmir Mustafic + */ +class ExpressionEvaluator implements ExpressionEvaluatorInterface +{ + + /** + * @var ExpressionLanguage + */ + private $expressionLanguage; + + /** + * @var array + */ + private $context = array(); + + /** + * @var array + */ + private $cache = array(); + + public function __construct(ExpressionLanguage $expressionLanguage, array $context = array(), array $cache = array()) + { + $this->expressionLanguage = $expressionLanguage; + $this->context = $context; + $this->cache = $cache; + } + + /** + * @param string $name + * @param mixed $value + */ + public function setContextVariable($name, $value) + { + $this->context[$name] = $value; + } + + /** + * @param string $expression + * @param array $data + * @return mixed + */ + public function evaluate($expression, array $data = array()) + { + if (!is_string($expression)) { + return $expression; + } + + $context = $data + $this->context; + + if (!array_key_exists($expression, $this->cache)) { + $this->cache[$expression] = $this->expressionLanguage->parse($expression, array_keys($context)); + } + + return $this->expressionLanguage->evaluate($this->cache[$expression], $context); + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Expression/ExpressionEvaluatorInterface.php b/vendor/jms/serializer/src/JMS/Serializer/Expression/ExpressionEvaluatorInterface.php new file mode 100644 index 0000000000..9d1be23a14 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Expression/ExpressionEvaluatorInterface.php @@ -0,0 +1,32 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Expression; + +/** + * @author Asmir Mustafic + */ +interface ExpressionEvaluatorInterface +{ + /** + * @param string $expression + * @param array $data + * @return mixed + */ + public function evaluate($expression, array $data = array()); +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/GenericDeserializationVisitor.php b/vendor/jms/serializer/src/JMS/Serializer/GenericDeserializationVisitor.php new file mode 100644 index 0000000000..22b3d3c1fb --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/GenericDeserializationVisitor.php @@ -0,0 +1,217 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer; + +use JMS\Serializer\Exception\RuntimeException; +use JMS\Serializer\Metadata\PropertyMetadata; +use JMS\Serializer\Metadata\ClassMetadata; + +/** + * Generic Deserialization Visitor. + * + * @author Johannes M. Schmitt + */ +abstract class GenericDeserializationVisitor extends AbstractVisitor +{ + private $navigator; + private $result; + private $objectStack; + private $currentObject; + + public function setNavigator(GraphNavigator $navigator) + { + $this->navigator = $navigator; + $this->result = null; + $this->objectStack = new \SplStack; + } + + public function getNavigator() + { + return $this->navigator; + } + + public function prepare($data) + { + return $this->decode($data); + } + + public function visitNull($data, array $type, Context $context) + { + return null; + } + + public function visitString($data, array $type, Context $context) + { + $data = (string) $data; + + if (null === $this->result) { + $this->result = $data; + } + + return $data; + } + + public function visitBoolean($data, array $type, Context $context) + { + $data = (Boolean) $data; + + if (null === $this->result) { + $this->result = $data; + } + + return $data; + } + + public function visitInteger($data, array $type, Context $context) + { + $data = (integer) $data; + + if (null === $this->result) { + $this->result = $data; + } + + return $data; + } + + public function visitDouble($data, array $type, Context $context) + { + $data = (double) $data; + + if (null === $this->result) { + $this->result = $data; + } + + return $data; + } + + public function visitArray($data, array $type, Context $context) + { + if ( ! is_array($data)) { + throw new RuntimeException(sprintf('Expected array, but got %s: %s', gettype($data), json_encode($data))); + } + + // If no further parameters were given, keys/values are just passed as is. + if ( ! $type['params']) { + if (null === $this->result) { + $this->result = $data; + } + + return $data; + } + + switch (count($type['params'])) { + case 1: // Array is a list. + $listType = $type['params'][0]; + + $result = array(); + if (null === $this->result) { + $this->result = &$result; + } + + foreach ($data as $v) { + $result[] = $this->navigator->accept($v, $listType, $context); + } + + return $result; + + case 2: // Array is a map. + list($keyType, $entryType) = $type['params']; + + $result = array(); + if (null === $this->result) { + $this->result = &$result; + } + + foreach ($data as $k => $v) { + $result[$this->navigator->accept($k, $keyType, $context)] = $this->navigator->accept($v, $entryType, $context); + } + + return $result; + + default: + throw new RuntimeException(sprintf('Array type cannot have more than 2 parameters, but got %s.', json_encode($type['params']))); + } + } + + public function startVisitingObject(ClassMetadata $metadata, $object, array $type, Context $context) + { + $this->setCurrentObject($object); + + if (null === $this->result) { + $this->result = $this->currentObject; + } + } + + public function visitProperty(PropertyMetadata $metadata, $data, Context $context) + { + $name = $this->namingStrategy->translateName($metadata); + + if (null === $data) { + return; + } + + if ( ! is_array($data)) { + throw new RuntimeException(sprintf('Invalid data "%s"(%s), expected "%s".', $data, $metadata->type['name'], $metadata->reflection->class)); + } + + if ( ! array_key_exists($name, $data)) { + return; + } + + if ( ! $metadata->type) { + throw new RuntimeException(sprintf('You must define a type for %s::$%s.', $metadata->reflection->class, $metadata->name)); + } + + $v = $data[$name] !== null ? $this->navigator->accept($data[$name], $metadata->type, $context) : null; + + $this->accessor->setValue($this->currentObject, $v, $metadata); + + } + + public function endVisitingObject(ClassMetadata $metadata, $data, array $type, Context $context) + { + $obj = $this->currentObject; + $this->revertCurrentObject(); + + return $obj; + } + + public function getResult() + { + return $this->result; + } + + public function setCurrentObject($object) + { + $this->objectStack->push($this->currentObject); + $this->currentObject = $object; + } + + public function getCurrentObject() + { + return $this->currentObject; + } + + public function revertCurrentObject() + { + return $this->currentObject = $this->objectStack->pop(); + } + + abstract protected function decode($str); +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/GenericSerializationVisitor.php b/vendor/jms/serializer/src/JMS/Serializer/GenericSerializationVisitor.php new file mode 100644 index 0000000000..2d73908741 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/GenericSerializationVisitor.php @@ -0,0 +1,222 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer; + +use JMS\Serializer\Metadata\ClassMetadata; +use JMS\Serializer\Exception\InvalidArgumentException; +use JMS\Serializer\Metadata\PropertyMetadata; + +/** + * @deprecated + */ +abstract class GenericSerializationVisitor extends AbstractVisitor +{ + private $navigator; + private $root; + private $dataStack; + private $data; + + public function setNavigator(GraphNavigator $navigator) + { + $this->navigator = $navigator; + $this->root = null; + $this->dataStack = new \SplStack; + } + + /** + * @return GraphNavigator + */ + public function getNavigator() + { + return $this->navigator; + } + + public function visitNull($data, array $type, Context $context) + { + return null; + } + + public function visitString($data, array $type, Context $context) + { + if (null === $this->root) { + $this->root = $data; + } + + return (string) $data; + } + + public function visitBoolean($data, array $type, Context $context) + { + if (null === $this->root) { + $this->root = $data; + } + + return (boolean) $data; + } + + public function visitInteger($data, array $type, Context $context) + { + if (null === $this->root) { + $this->root = $data; + } + + return (int) $data; + } + + public function visitDouble($data, array $type, Context $context) + { + if (null === $this->root) { + $this->root = $data; + } + + return (float) $data; + } + + /** + * @param array $data + * @param array $type + */ + public function visitArray($data, array $type, Context $context) + { + $this->dataStack->push($data); + + $isHash = isset($type['params'][1]); + + if (null === $this->root) { + $this->root = $isHash ? new \ArrayObject() : array(); + $rs = &$this->root; + } else { + $rs = $isHash ? new \ArrayObject() : array(); + } + + $isList = isset($type['params'][0]) && ! isset($type['params'][1]); + + foreach ($data as $k => $v) { + $v = $this->navigator->accept($v, $this->getElementType($type), $context); + + if (null === $v && $context->shouldSerializeNull() !== true) { + continue; + } + + if ($isList) { + $rs[] = $v; + } else { + $rs[$k] = $v; + } + } + + $this->dataStack->pop(); + + return $rs; + } + + public function startVisitingObject(ClassMetadata $metadata, $data, array $type, Context $context) + { + if (null === $this->root) { + $this->root = new \stdClass; + } + + $this->dataStack->push($this->data); + $this->data = array(); + } + + public function endVisitingObject(ClassMetadata $metadata, $data, array $type, Context $context) + { + $rs = $this->data; + $this->data = $this->dataStack->pop(); + + if ($this->root instanceof \stdClass && 0 === $this->dataStack->count()) { + $this->root = $rs; + } + + return $rs; + } + + public function visitProperty(PropertyMetadata $metadata, $data, Context $context) + { + $v = $this->accessor->getValue($data, $metadata); + + $v = $this->navigator->accept($v, $metadata->type, $context); + if (null === $v && $context->shouldSerializeNull() !== true) { + return; + } + + $k = $this->namingStrategy->translateName($metadata); + + if ($metadata->inline) { + if (is_array($v)) { + $this->data = array_merge($this->data, $v); + } + } else { + $this->data[$k] = $v; + } + } + + /** + * Allows you to add additional data to the current object/root element. + * @deprecated use setData instead + * @param string $key + * @param integer|float|boolean|string|array|null $value This value must either be a regular scalar, or an array. + * It must not contain any objects anymore. + */ + public function addData($key, $value) + { + if (isset($this->data[$key])) { + throw new InvalidArgumentException(sprintf('There is already data for "%s".', $key)); + } + + $this->data[$key] = $value; + } + + /** + * Checks if some data key exists. + * + * @param string $key + * @return boolean + */ + public function hasData($key) + { + return isset($this->data[$key]); + } + + /** + * Allows you to replace existing data on the current object/root element. + * + * @param string $key + * @param integer|float|boolean|string|array|null $value This value must either be a regular scalar, or an array. + * It must not contain any objects anymore. + */ + public function setData($key, $value) + { + $this->data[$key] = $value; + } + + public function getRoot() + { + return $this->root; + } + + /** + * @param array|\ArrayObject $data the passed data must be understood by whatever encoding function is applied later. + */ + public function setRoot($data) + { + $this->root = $data; + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/GraphNavigator.php b/vendor/jms/serializer/src/JMS/Serializer/GraphNavigator.php new file mode 100644 index 0000000000..bde1017a25 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/GraphNavigator.php @@ -0,0 +1,354 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer; + +use JMS\Serializer\EventDispatcher\ObjectEvent; +use JMS\Serializer\EventDispatcher\PreDeserializeEvent; +use JMS\Serializer\EventDispatcher\PreSerializeEvent; +use JMS\Serializer\Exception\RuntimeException; +use JMS\Serializer\Construction\ObjectConstructorInterface; +use JMS\Serializer\Handler\HandlerRegistryInterface; +use JMS\Serializer\EventDispatcher\EventDispatcherInterface; +use JMS\Serializer\Metadata\ClassMetadata; +use Metadata\MetadataFactoryInterface; +use JMS\Serializer\Exception\InvalidArgumentException; +use JMS\Serializer\Exception\ExpressionLanguageRequiredException; +use JMS\Serializer\Exclusion\ExpressionLanguageExclusionStrategy; +use JMS\Serializer\Expression\ExpressionEvaluatorInterface; + +/** + * Handles traversal along the object graph. + * + * This class handles traversal along the graph, and calls different methods + * on visitors, or custom handlers to process its nodes. + * + * @author Johannes M. Schmitt + */ +final class GraphNavigator +{ + const DIRECTION_SERIALIZATION = 1; + const DIRECTION_DESERIALIZATION = 2; + + /** + * @var ExpressionLanguageExclusionStrategy + */ + private $expressionExclusionStrategy; + + private $dispatcher; + private $metadataFactory; + private $handlerRegistry; + private $objectConstructor; + + /** + * Parses a direction string to one of the direction constants. + * + * @param string $dirStr + * + * @return integer + */ + public static function parseDirection($dirStr) + { + switch (strtolower($dirStr)) { + case 'serialization': + return self::DIRECTION_SERIALIZATION; + + case 'deserialization': + return self::DIRECTION_DESERIALIZATION; + + default: + throw new InvalidArgumentException(sprintf('The direction "%s" does not exist.', $dirStr)); + } + } + + public function __construct( + MetadataFactoryInterface $metadataFactory, + HandlerRegistryInterface $handlerRegistry, + ObjectConstructorInterface $objectConstructor, + EventDispatcherInterface $dispatcher = null, + ExpressionEvaluatorInterface $expressionEvaluator = null + ) + { + $this->dispatcher = $dispatcher; + $this->metadataFactory = $metadataFactory; + $this->handlerRegistry = $handlerRegistry; + $this->objectConstructor = $objectConstructor; + if ($expressionEvaluator) { + $this->expressionExclusionStrategy = new ExpressionLanguageExclusionStrategy($expressionEvaluator); + } + } + + /** + * Called for each node of the graph that is being traversed. + * + * @param mixed $data the data depends on the direction, and type of visitor + * @param null|array $type array has the format ["name" => string, "params" => array] + * @param Context $context + * @return mixed the return value depends on the direction, and type of visitor + */ + public function accept($data, array $type = null, Context $context) + { + $visitor = $context->getVisitor(); + + // If the type was not given, we infer the most specific type from the + // input data in serialization mode. + if (null === $type) { + if ($context instanceof DeserializationContext) { + throw new RuntimeException('The type must be given for all properties when deserializing.'); + } + + $typeName = gettype($data); + if ('object' === $typeName) { + $typeName = get_class($data); + } + + $type = array('name' => $typeName, 'params' => array()); + } + // If the data is null, we have to force the type to null regardless of the input in order to + // guarantee correct handling of null values, and not have any internal auto-casting behavior. + else if ($context instanceof SerializationContext && null === $data) { + $type = array('name' => 'NULL', 'params' => array()); + } + + switch ($type['name']) { + case 'NULL': + return $visitor->visitNull($data, $type, $context); + + case 'string': + return $visitor->visitString($data, $type, $context); + + case 'int': + case 'integer': + return $visitor->visitInteger($data, $type, $context); + + case 'boolean': + return $visitor->visitBoolean($data, $type, $context); + + case 'double': + case 'float': + return $visitor->visitDouble($data, $type, $context); + + case 'array': + return $visitor->visitArray($data, $type, $context); + + case 'resource': + $msg = 'Resources are not supported in serialized data.'; + if ($context instanceof SerializationContext && null !== $path = $context->getPath()) { + $msg .= ' Path: '.$path; + } + + throw new RuntimeException($msg); + + default: + // TODO: The rest of this method needs some refactoring. + if ($context instanceof SerializationContext) { + if (null !== $data) { + if ($context->isVisiting($data)) { + return null; + } + $context->startVisiting($data); + } + + // If we're serializing a polymorphic type, then we'll be interested in the + // metadata for the actual type of the object, not the base class. + if (class_exists($type['name'], false) || interface_exists($type['name'], false)) { + if (is_subclass_of($data, $type['name'], false)) { + $type = array('name' => get_class($data), 'params' => array()); + } + } + } elseif ($context instanceof DeserializationContext) { + $context->increaseDepth(); + } + + // Trigger pre-serialization callbacks, and listeners if they exist. + // Dispatch pre-serialization event before handling data to have ability change type in listener + if ($context instanceof SerializationContext) { + if (null !== $this->dispatcher && $this->dispatcher->hasListeners('serializer.pre_serialize', $type['name'], $context->getFormat())) { + $this->dispatcher->dispatch('serializer.pre_serialize', $type['name'], $context->getFormat(), $event = new PreSerializeEvent($context, $data, $type)); + $type = $event->getType(); + } + } elseif ($context instanceof DeserializationContext) { + if (null !== $this->dispatcher && $this->dispatcher->hasListeners('serializer.pre_deserialize', $type['name'], $context->getFormat())) { + $this->dispatcher->dispatch('serializer.pre_deserialize', $type['name'], $context->getFormat(), $event = new PreDeserializeEvent($context, $data, $type)); + $type = $event->getType(); + $data = $event->getData(); + } + } + + // First, try whether a custom handler exists for the given type. This is done + // before loading metadata because the type name might not be a class, but + // could also simply be an artifical type. + if (null !== $handler = $this->handlerRegistry->getHandler($context->getDirection(), $type['name'], $context->getFormat())) { + $rs = call_user_func($handler, $visitor, $data, $type, $context); + $this->leaveScope($context, $data); + + return $rs; + } + + $exclusionStrategy = $context->getExclusionStrategy(); + + /** @var $metadata ClassMetadata */ + $metadata = $this->metadataFactory->getMetadataForClass($type['name']); + + if ($metadata->usingExpression && !$this->expressionExclusionStrategy) { + throw new ExpressionLanguageRequiredException("To use conditional exclude/expose in {$metadata->name} you must configure the expression language."); + } + + if ($context instanceof DeserializationContext && ! empty($metadata->discriminatorMap) && $type['name'] === $metadata->discriminatorBaseClass) { + $metadata = $this->resolveMetadata($data, $metadata); + } + + if (null !== $exclusionStrategy && $exclusionStrategy->shouldSkipClass($metadata, $context)) { + $this->leaveScope($context, $data); + + return null; + } + + $context->pushClassMetadata($metadata); + + if ($context instanceof SerializationContext) { + foreach ($metadata->preSerializeMethods as $method) { + $method->invoke($data); + } + } + + $object = $data; + if ($context instanceof DeserializationContext) { + $object = $this->objectConstructor->construct($visitor, $metadata, $data, $type, $context); + } + + if (isset($metadata->handlerCallbacks[$context->getDirection()][$context->getFormat()])) { + $rs = $object->{$metadata->handlerCallbacks[$context->getDirection()][$context->getFormat()]}( + $visitor, + $context instanceof SerializationContext ? null : $data, + $context + ); + $this->afterVisitingObject($metadata, $object, $type, $context); + + return $context instanceof SerializationContext ? $rs : $object; + } + + $visitor->startVisitingObject($metadata, $object, $type, $context); + foreach ($metadata->propertyMetadata as $propertyMetadata) { + if (null !== $exclusionStrategy && $exclusionStrategy->shouldSkipProperty($propertyMetadata, $context)) { + continue; + } + + if (null !== $this->expressionExclusionStrategy && $this->expressionExclusionStrategy->shouldSkipProperty($propertyMetadata, $context)) { + continue; + } + + if ($context instanceof DeserializationContext && $propertyMetadata->readOnly) { + continue; + } + + $context->pushPropertyMetadata($propertyMetadata); + $visitor->visitProperty($propertyMetadata, $data, $context); + $context->popPropertyMetadata(); + } + + if ($context instanceof SerializationContext) { + $this->afterVisitingObject($metadata, $data, $type, $context); + + return $visitor->endVisitingObject($metadata, $data, $type, $context); + } + + $rs = $visitor->endVisitingObject($metadata, $data, $type, $context); + $this->afterVisitingObject($metadata, $rs, $type, $context); + + return $rs; + } + } + + private function resolveMetadata($data, ClassMetadata $metadata) + { + switch (true) { + case is_array($data) && isset($data[$metadata->discriminatorFieldName]): + $typeValue = (string) $data[$metadata->discriminatorFieldName]; + break; + + // Check XML attribute for discriminatorFieldName + case is_object($data) && $metadata->xmlDiscriminatorAttribute && isset($data[$metadata->discriminatorFieldName]): + $typeValue = (string) $data[$metadata->discriminatorFieldName]; + break; + + // Check XML element with namespace for discriminatorFieldName + case is_object($data) && !$metadata->xmlDiscriminatorAttribute && null !== $metadata->xmlDiscriminatorNamespace && isset($data->children($metadata->xmlDiscriminatorNamespace)->{$metadata->discriminatorFieldName}): + $typeValue = (string) $data->children($metadata->xmlDiscriminatorNamespace)->{$metadata->discriminatorFieldName}; + break; + + // Check XML element for discriminatorFieldName + case is_object($data) && isset($data->{$metadata->discriminatorFieldName}): + $typeValue = (string) $data->{$metadata->discriminatorFieldName}; + break; + + default: + throw new \LogicException(sprintf( + 'The discriminator field name "%s" for base-class "%s" was not found in input data.', + $metadata->discriminatorFieldName, + $metadata->name + )); + } + + if ( ! isset($metadata->discriminatorMap[$typeValue])) { + throw new \LogicException(sprintf( + 'The type value "%s" does not exist in the discriminator map of class "%s". Available types: %s', + $typeValue, + $metadata->name, + implode(', ', array_keys($metadata->discriminatorMap)) + )); + } + + return $this->metadataFactory->getMetadataForClass($metadata->discriminatorMap[$typeValue]); + } + + private function leaveScope(Context $context, $data) + { + if ($context instanceof SerializationContext) { + $context->stopVisiting($data); + } elseif ($context instanceof DeserializationContext) { + $context->decreaseDepth(); + } + } + + private function afterVisitingObject(ClassMetadata $metadata, $object, array $type, Context $context) + { + $this->leaveScope($context, $object); + $context->popClassMetadata(); + + if ($context instanceof SerializationContext) { + foreach ($metadata->postSerializeMethods as $method) { + $method->invoke($object); + } + + if (null !== $this->dispatcher && $this->dispatcher->hasListeners('serializer.post_serialize', $metadata->name, $context->getFormat())) { + $this->dispatcher->dispatch('serializer.post_serialize', $metadata->name, $context->getFormat(), new ObjectEvent($context, $object, $type)); + } + + return; + } + + foreach ($metadata->postDeserializeMethods as $method) { + $method->invoke($object); + } + + if (null !== $this->dispatcher && $this->dispatcher->hasListeners('serializer.post_deserialize', $metadata->name, $context->getFormat())) { + $this->dispatcher->dispatch('serializer.post_deserialize', $metadata->name, $context->getFormat(), new ObjectEvent($context, $object, $type)); + } + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Handler/ArrayCollectionHandler.php b/vendor/jms/serializer/src/JMS/Serializer/Handler/ArrayCollectionHandler.php new file mode 100644 index 0000000000..bd224e7b2a --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Handler/ArrayCollectionHandler.php @@ -0,0 +1,94 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Handler; + +use Doctrine\Common\Collections\ArrayCollection; +use JMS\Serializer\Context; +use JMS\Serializer\GraphNavigator; +use JMS\Serializer\VisitorInterface; +use Doctrine\Common\Collections\Collection; + +class ArrayCollectionHandler implements SubscribingHandlerInterface +{ + /** + * @var bool + */ + private $initializeExcluded = true; + + public function __construct($initializeExcluded = true) + { + $this->initializeExcluded = $initializeExcluded; + } + + public static function getSubscribingMethods() + { + $methods = array(); + $formats = array('json', 'xml', 'yml'); + $collectionTypes = array( + 'ArrayCollection', + 'Doctrine\Common\Collections\ArrayCollection', + 'Doctrine\ORM\PersistentCollection', + 'Doctrine\ODM\MongoDB\PersistentCollection', + 'Doctrine\ODM\PHPCR\PersistentCollection', + ); + + foreach ($collectionTypes as $type) { + foreach ($formats as $format) { + $methods[] = array( + 'direction' => GraphNavigator::DIRECTION_SERIALIZATION, + 'type' => $type, + 'format' => $format, + 'method' => 'serializeCollection', + ); + + $methods[] = array( + 'direction' => GraphNavigator::DIRECTION_DESERIALIZATION, + 'type' => $type, + 'format' => $format, + 'method' => 'deserializeCollection', + ); + } + } + + return $methods; + } + + public function serializeCollection(VisitorInterface $visitor, Collection $collection, array $type, Context $context) + { + // We change the base type, and pass through possible parameters. + $type['name'] = 'array'; + + if ($this->initializeExcluded === false) { + $exclusionStrategy = $context->getExclusionStrategy(); + if ($exclusionStrategy !== null && $exclusionStrategy->shouldSkipClass($context->getMetadataFactory()->getMetadataForClass(get_class($collection)), $context)) { + return $visitor->visitArray([], $type, $context); + } + } + + return $visitor->visitArray($collection->toArray(), $type, $context); + } + + public function deserializeCollection(VisitorInterface $visitor, $data, array $type, Context $context) + { + // See above. + $type['name'] = 'array'; + + return new ArrayCollection($visitor->visitArray($data, $type, $context)); + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Handler/ConstraintViolationHandler.php b/vendor/jms/serializer/src/JMS/Serializer/Handler/ConstraintViolationHandler.php new file mode 100644 index 0000000000..1879ee1568 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Handler/ConstraintViolationHandler.php @@ -0,0 +1,111 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Handler; + +use JMS\Serializer\Context; +use JMS\Serializer\YamlSerializationVisitor; +use JMS\Serializer\JsonSerializationVisitor; +use JMS\Serializer\GraphNavigator; +use Symfony\Component\Validator\ConstraintViolation; +use Symfony\Component\Validator\ConstraintViolationList; +use JMS\Serializer\XmlSerializationVisitor; + +class ConstraintViolationHandler implements SubscribingHandlerInterface +{ + public static function getSubscribingMethods() + { + $methods = array(); + $formats = array('xml', 'json', 'yml'); + $types = array('Symfony\Component\Validator\ConstraintViolationList' => 'serializeList', 'Symfony\Component\Validator\ConstraintViolation' => 'serializeViolation'); + + foreach ($types as $type => $method) { + foreach ($formats as $format) { + $methods[] = array( + 'direction' => GraphNavigator::DIRECTION_SERIALIZATION, + 'type' => $type, + 'format' => $format, + 'method' => $method.'To'.$format, + ); + } + } + + return $methods; + } + + public function serializeListToXml(XmlSerializationVisitor $visitor, ConstraintViolationList $list, array $type) + { + if (null === $visitor->document) { + $visitor->document = $visitor->createDocument(); + } + + foreach ($list as $violation) { + $this->serializeViolationToXml($visitor, $violation); + } + } + + public function serializeListToJson(JsonSerializationVisitor $visitor, ConstraintViolationList $list, array $type, Context $context) + { + return $visitor->visitArray(iterator_to_array($list), $type, $context); + } + + public function serializeListToYml(YamlSerializationVisitor $visitor, ConstraintViolationList $list, array $type, Context $context) + { + return $visitor->visitArray(iterator_to_array($list), $type, $context); + } + + public function serializeViolationToXml(XmlSerializationVisitor $visitor, ConstraintViolation $violation, array $type = null) + { + if (null === $visitor->document) { + $visitor->document = $visitor->createDocument(null, null, false); + $visitor->document->appendChild($violationNode = $visitor->document->createElement('violation')); + $visitor->setCurrentNode($violationNode); + } else { + $visitor->getCurrentNode()->appendChild( + $violationNode = $visitor->document->createElement('violation') + ); + } + + $violationNode->setAttribute('property_path', $violation->getPropertyPath()); + $violationNode->appendChild($messageNode = $visitor->document->createElement('message')); + + $messageNode->appendChild($visitor->document->createCDATASection($violation->getMessage())); + } + + public function serializeViolationToJson(JsonSerializationVisitor $visitor, ConstraintViolation $violation, array $type = null) + { + $data = array( + 'property_path' => $violation->getPropertyPath(), + 'message' => $violation->getMessage() + ); + + if (null === $visitor->getRoot()) { + $visitor->setRoot($data); + } + + return $data; + } + + public function serializeViolationToYml(YamlSerializationVisitor $visitor, ConstraintViolation $violation, array $type = null) + { + return array( + 'property_path' => $violation->getPropertyPath(), + 'message' => $violation->getMessage(), + ); + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Handler/DateHandler.php b/vendor/jms/serializer/src/JMS/Serializer/Handler/DateHandler.php new file mode 100644 index 0000000000..bf7339fd59 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Handler/DateHandler.php @@ -0,0 +1,257 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Handler; + +use JMS\Serializer\Context; +use JMS\Serializer\Exception\RuntimeException; +use JMS\Serializer\GraphNavigator; +use JMS\Serializer\JsonDeserializationVisitor; +use JMS\Serializer\VisitorInterface; +use JMS\Serializer\XmlDeserializationVisitor; +use JMS\Serializer\XmlSerializationVisitor; + +class DateHandler implements SubscribingHandlerInterface +{ + private $defaultFormat; + private $defaultTimezone; + private $xmlCData; + + public static function getSubscribingMethods() + { + $methods = array(); + $deserialisationTypes = array('DateTime', 'DateTimeImmutable', 'DateInterval'); + $serialisationTypes = array('DateTime', 'DateTimeImmutable', 'DateInterval'); + + foreach (array('json', 'xml', 'yml') as $format) { + + foreach ($deserialisationTypes as $type) { + $methods[] = [ + 'type' => $type, + 'direction' => GraphNavigator::DIRECTION_DESERIALIZATION, + 'format' => $format, + ]; + } + + foreach ($serialisationTypes as $type) { + $methods[] = array( + 'type' => $type, + 'format' => $format, + 'direction' => GraphNavigator::DIRECTION_SERIALIZATION, + 'method' => 'serialize'.$type, + ); + } + } + + return $methods; + } + + public function __construct($defaultFormat = \DateTime::ISO8601, $defaultTimezone = 'UTC', $xmlCData = true) + { + $this->defaultFormat = $defaultFormat; + $this->defaultTimezone = new \DateTimeZone($defaultTimezone); + $this->xmlCData = $xmlCData; + } + + private function serializeDateTimeInterface( + VisitorInterface $visitor, + \DateTimeInterface $date, + array $type, + Context $context + ) + { + if ($visitor instanceof XmlSerializationVisitor && false === $this->xmlCData) { + return $visitor->visitSimpleString($date->format($this->getFormat($type)), $type, $context); + } + + $format = $this->getFormat($type); + if ('U' === $format) { + return $visitor->visitInteger($date->format($format), $type, $context); + } + + return $visitor->visitString($date->format($this->getFormat($type)), $type, $context); + } + + public function serializeDateTime(VisitorInterface $visitor, \DateTime $date, array $type, Context $context) + { + return $this->serializeDateTimeInterface($visitor, $date, $type, $context); + } + + public function serializeDateTimeImmutable( + VisitorInterface $visitor, + \DateTimeImmutable $date, + array $type, + Context $context + ) + { + return $this->serializeDateTimeInterface($visitor, $date, $type, $context); + } + + public function serializeDateInterval(VisitorInterface $visitor, \DateInterval $date, array $type, Context $context) + { + $iso8601DateIntervalString = $this->format($date); + + if ($visitor instanceof XmlSerializationVisitor && false === $this->xmlCData) { + return $visitor->visitSimpleString($iso8601DateIntervalString, $type, $context); + } + + return $visitor->visitString($iso8601DateIntervalString, $type, $context); + } + + private function isDataXmlNull($data) + { + $attributes = $data->attributes('xsi', true); + return isset($attributes['nil'][0]) && (string) $attributes['nil'][0] === 'true'; + } + + public function deserializeDateTimeFromXml(XmlDeserializationVisitor $visitor, $data, array $type) + { + if ($this->isDataXmlNull($data)) { + return null; + } + + return $this->parseDateTime($data, $type); + } + + public function deserializeDateTimeImmutableFromXml(XmlDeserializationVisitor $visitor, $data, array $type) + { + if ($this->isDataXmlNull($data)) { + return null; + } + + return $this->parseDateTime($data, $type, true); + } + + public function deserializeDateIntervalFromXml(XmlDeserializationVisitor $visitor, $data, array $type) + { + if ($this->isDataXmlNull($data)) { + return null; + } + + return $this->parseDateInterval($data); + } + + public function deserializeDateTimeFromJson(JsonDeserializationVisitor $visitor, $data, array $type) + { + if (null === $data) { + return null; + } + + return $this->parseDateTime($data, $type); + } + + public function deserializeDateTimeImmutableFromJson(JsonDeserializationVisitor $visitor, $data, array $type) + { + if (null === $data) { + return null; + } + + return $this->parseDateTime($data, $type, true); + } + + public function deserializeDateIntervalFromJson(JsonDeserializationVisitor $visitor, $data, array $type) + { + if (null === $data) { + return null; + } + + return $this->parseDateInterval($data); + } + + private function parseDateTime($data, array $type, $immutable = false) + { + $timezone = isset($type['params'][1]) ? new \DateTimeZone($type['params'][1]) : $this->defaultTimezone; + $format = $this->getFormat($type); + + if ($immutable) { + $datetime = \DateTimeImmutable::createFromFormat($format, (string) $data, $timezone); + } else { + $datetime = \DateTime::createFromFormat($format, (string) $data, $timezone); + } + + if (false === $datetime) { + throw new RuntimeException(sprintf('Invalid datetime "%s", expected format %s.', $data, $format)); + } + + return $datetime; + } + + private function parseDateInterval($data) + { + $dateInterval = null; + try { + $dateInterval = new \DateInterval($data); + } catch (\Exception $e) { + throw new RuntimeException(sprintf('Invalid dateinterval "%s", expected ISO 8601 format', $data), null, $e); + } + + return $dateInterval; + } + + /** + * @return string + * @param array $type + */ + private function getFormat(array $type) + { + return isset($type['params'][0]) ? $type['params'][0] : $this->defaultFormat; + } + + /** + * @param \DateInterval $dateInterval + * @return string + */ + public function format(\DateInterval $dateInterval) + { + $format = 'P'; + + if (0 < $dateInterval->y) { + $format .= $dateInterval->y.'Y'; + } + + if (0 < $dateInterval->m) { + $format .= $dateInterval->m.'M'; + } + + if (0 < $dateInterval->d) { + $format .= $dateInterval->d.'D'; + } + + if (0 < $dateInterval->h || 0 < $dateInterval->i || 0 < $dateInterval->s) { + $format .= 'T'; + } + + if (0 < $dateInterval->h) { + $format .= $dateInterval->h.'H'; + } + + if (0 < $dateInterval->i) { + $format .= $dateInterval->i.'M'; + } + + if (0 < $dateInterval->s) { + $format .= $dateInterval->s.'S'; + } + + if ($format === 'P') { + $format = 'P0DT0S'; + } + + return $format; + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Handler/FormErrorHandler.php b/vendor/jms/serializer/src/JMS/Serializer/Handler/FormErrorHandler.php new file mode 100644 index 0000000000..6847d503e3 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Handler/FormErrorHandler.php @@ -0,0 +1,159 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Handler; + +use JMS\Serializer\YamlSerializationVisitor; +use JMS\Serializer\JsonSerializationVisitor; +use JMS\Serializer\GraphNavigator; +use JMS\Serializer\VisitorInterface; +use Symfony\Component\Form\Form; +use Symfony\Component\Form\FormError; +use Symfony\Component\Translation\TranslatorInterface; +use JMS\Serializer\XmlSerializationVisitor; + +class FormErrorHandler implements SubscribingHandlerInterface +{ + private $translator; + + public static function getSubscribingMethods() + { + $methods = array(); + foreach (array('xml', 'json', 'yml') as $format) { + $methods[] = array( + 'direction' => GraphNavigator::DIRECTION_SERIALIZATION, + 'type' => 'Symfony\Component\Form\Form', + 'format' => $format, + ); + $methods[] = array( + 'direction' => GraphNavigator::DIRECTION_SERIALIZATION, + 'type' => 'Symfony\Component\Form\FormError', + 'format' => $format, + ); + } + + return $methods; + } + + public function __construct(TranslatorInterface $translator) + { + $this->translator = $translator; + } + + public function serializeFormToXml(XmlSerializationVisitor $visitor, Form $form, array $type) + { + if (null === $visitor->document) { + $visitor->document = $visitor->createDocument(null, null, false); + $visitor->document->appendChild($formNode = $visitor->document->createElement('form')); + $visitor->setCurrentNode($formNode); + } else { + $visitor->getCurrentNode()->appendChild( + $formNode = $visitor->document->createElement('form') + ); + } + + $formNode->setAttribute('name', $form->getName()); + + $formNode->appendChild($errorsNode = $visitor->document->createElement('errors')); + foreach ($form->getErrors() as $error) { + $errorNode = $visitor->document->createElement('entry'); + $errorNode->appendChild($this->serializeFormErrorToXml($visitor, $error, array())); + $errorsNode->appendChild($errorNode); + } + + foreach ($form->all() as $child) { + if ($child instanceof Form) { + if (null !== $node = $this->serializeFormToXml($visitor, $child, array())) { + $formNode->appendChild($node); + } + } + } + + return $formNode; + } + + public function serializeFormToJson(JsonSerializationVisitor $visitor, Form $form, array $type) + { + return $this->convertFormToArray($visitor, $form); + } + + public function serializeFormToYml(YamlSerializationVisitor $visitor, Form $form, array $type) + { + return $this->convertFormToArray($visitor, $form); + } + + public function serializeFormErrorToXml(XmlSerializationVisitor $visitor, FormError $formError, array $type) + { + if (null === $visitor->document) { + $visitor->document = $visitor->createDocument(null, null, true); + } + + return $visitor->document->createCDATASection($this->getErrorMessage($formError)); + } + + public function serializeFormErrorToJson(JsonSerializationVisitor $visitor, FormError $formError, array $type) + { + return $this->getErrorMessage($formError); + } + + public function serializeFormErrorToYml(YamlSerializationVisitor $visitor, FormError $formError, array $type) + { + return $this->getErrorMessage($formError); + } + + private function getErrorMessage(FormError $error) + { + if (null !== $error->getMessagePluralization()) { + return $this->translator->transChoice($error->getMessageTemplate(), $error->getMessagePluralization(), $error->getMessageParameters(), 'validators'); + } + + return $this->translator->trans($error->getMessageTemplate(), $error->getMessageParameters(), 'validators'); + } + + private function convertFormToArray(VisitorInterface $visitor, Form $data) + { + $isRoot = null === $visitor->getRoot(); + + $form = new \ArrayObject(); + $errors = array(); + foreach ($data->getErrors() as $error) { + $errors[] = $this->getErrorMessage($error); + } + + if ($errors) { + $form['errors'] = $errors; + } + + $children = array(); + foreach ($data->all() as $child) { + if ($child instanceof Form) { + $children[$child->getName()] = $this->convertFormToArray($visitor, $child); + } + } + + if ($children) { + $form['children'] = $children; + } + + if ($isRoot) { + $visitor->setRoot($form); + } + + return $form; + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Handler/HandlerRegistry.php b/vendor/jms/serializer/src/JMS/Serializer/Handler/HandlerRegistry.php new file mode 100644 index 0000000000..ed7bfff772 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Handler/HandlerRegistry.php @@ -0,0 +1,88 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Handler; + +use JMS\Serializer\GraphNavigator; +use JMS\Serializer\Exception\RuntimeException; +use JMS\Serializer\Exception\LogicException; + +class HandlerRegistry implements HandlerRegistryInterface +{ + protected $handlers; + + public static function getDefaultMethod($direction, $type, $format) + { + if (false !== $pos = strrpos($type, '\\')) { + $type = substr($type, $pos + 1); + } + + switch ($direction) { + case GraphNavigator::DIRECTION_DESERIALIZATION: + return 'deserialize'.$type.'From'.$format; + + case GraphNavigator::DIRECTION_SERIALIZATION: + return 'serialize'.$type.'To'.$format; + + default: + throw new LogicException(sprintf('The direction %s does not exist; see GraphNavigator::DIRECTION_??? constants.', json_encode($direction))); + } + } + + public function __construct(array $handlers = array()) + { + $this->handlers = $handlers; + } + + public function registerSubscribingHandler(SubscribingHandlerInterface $handler) + { + foreach ($handler->getSubscribingMethods() as $methodData) { + if ( ! isset($methodData['type'], $methodData['format'])) { + throw new RuntimeException(sprintf('For each subscribing method a "type" and "format" attribute must be given, but only got "%s" for %s.', implode('" and "', array_keys($methodData)), get_class($handler))); + } + + $directions = array(GraphNavigator::DIRECTION_DESERIALIZATION, GraphNavigator::DIRECTION_SERIALIZATION); + if (isset($methodData['direction'])) { + $directions = array($methodData['direction']); + } + + foreach ($directions as $direction) { + $method = isset($methodData['method']) ? $methodData['method'] : self::getDefaultMethod($direction, $methodData['type'], $methodData['format']); + $this->registerHandler($direction, $methodData['type'], $methodData['format'], array($handler, $method)); + } + } + } + + public function registerHandler($direction, $typeName, $format, $handler) + { + if (is_string($direction)) { + $direction = GraphNavigator::parseDirection($direction); + } + + $this->handlers[$direction][$typeName][$format] = $handler; + } + + public function getHandler($direction, $typeName, $format) + { + if ( ! isset($this->handlers[$direction][$typeName][$format])) { + return null; + } + + return $this->handlers[$direction][$typeName][$format]; + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Handler/HandlerRegistryInterface.php b/vendor/jms/serializer/src/JMS/Serializer/Handler/HandlerRegistryInterface.php new file mode 100644 index 0000000000..bd869f9785 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Handler/HandlerRegistryInterface.php @@ -0,0 +1,55 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Handler; + +/** + * Handler Registry Interface. + * + * @author Johannes M. Schmitt + */ +interface HandlerRegistryInterface +{ + /** + * @param SubscribingHandlerInterface $handler + * + * @return void + */ + public function registerSubscribingHandler(SubscribingHandlerInterface $handler); + + /** + * Registers a handler in the registry. + * + * @param integer $direction one of the GraphNavigator::DIRECTION_??? constants + * @param string $typeName + * @param string $format + * @param callable $handler function(VisitorInterface, mixed $data, array $type): mixed + * + * @return void + */ + public function registerHandler($direction, $typeName, $format, $handler); + + /** + * @param integer $direction one of the GraphNavigator::DIRECTION_??? constants + * @param string $typeName + * @param string $format + * + * @return callable|null + */ + public function getHandler($direction, $typeName, $format); +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Handler/LazyHandlerRegistry.php b/vendor/jms/serializer/src/JMS/Serializer/Handler/LazyHandlerRegistry.php new file mode 100644 index 0000000000..7df39201d2 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Handler/LazyHandlerRegistry.php @@ -0,0 +1,57 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Handler; + +use Symfony\Component\DependencyInjection\ContainerInterface; + +class LazyHandlerRegistry extends HandlerRegistry +{ + private $container; + private $initializedHandlers = array(); + + public function __construct(ContainerInterface $container, array $handlers = array()) + { + parent::__construct($handlers); + $this->container = $container; + } + + public function registerHandler($direction, $typeName, $format, $handler) + { + parent::registerHandler($direction, $typeName, $format, $handler); + unset($this->initializedHandlers[$direction][$typeName][$format]); + } + + public function getHandler($direction, $typeName, $format) + { + if (isset($this->initializedHandlers[$direction][$typeName][$format])) { + return $this->initializedHandlers[$direction][$typeName][$format]; + } + + if ( ! isset($this->handlers[$direction][$typeName][$format])) { + return null; + } + + $handler = $this->handlers[$direction][$typeName][$format]; + if (is_array($handler) && is_string($handler[0]) && $this->container->has($handler[0])) { + $handler[0] = $this->container->get($handler[0]); + } + + return $this->initializedHandlers[$direction][$typeName][$format] = $handler; + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Handler/PhpCollectionHandler.php b/vendor/jms/serializer/src/JMS/Serializer/Handler/PhpCollectionHandler.php new file mode 100644 index 0000000000..ddc51b8e07 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Handler/PhpCollectionHandler.php @@ -0,0 +1,88 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Handler; + +use JMS\Serializer\Context; +use JMS\Serializer\GraphNavigator; +use JMS\Serializer\VisitorInterface; +use PhpCollection\Map; +use PhpCollection\Sequence; + +class PhpCollectionHandler implements SubscribingHandlerInterface +{ + public static function getSubscribingMethods() + { + $methods = array(); + $formats = array('json', 'xml', 'yml'); + $collectionTypes = array( + 'PhpCollection\Sequence' => 'Sequence', + 'PhpCollection\Map' => 'Map', + ); + + foreach ($collectionTypes as $type => $shortName) { + foreach ($formats as $format) { + $methods[] = array( + 'direction' => GraphNavigator::DIRECTION_SERIALIZATION, + 'type' => $type, + 'format' => $format, + 'method' => 'serialize'.$shortName, + ); + + $methods[] = array( + 'direction' => GraphNavigator::DIRECTION_DESERIALIZATION, + 'type' => $type, + 'format' => $format, + 'method' => 'deserialize'.$shortName, + ); + } + } + + return $methods; + } + + public function serializeMap(VisitorInterface $visitor, Map $map, array $type, Context $context) + { + $type['name'] = 'array'; + + return $visitor->visitArray(iterator_to_array($map), $type, $context); + } + + public function deserializeMap(VisitorInterface $visitor, $data, array $type, Context $context) + { + $type['name'] = 'array'; + + return new Map($visitor->visitArray($data, $type, $context)); + } + + public function serializeSequence(VisitorInterface $visitor, Sequence $sequence, array $type, Context $context) + { + // We change the base type, and pass through possible parameters. + $type['name'] = 'array'; + + return $visitor->visitArray($sequence->all(), $type, $context); + } + + public function deserializeSequence(VisitorInterface $visitor, $data, array $type, Context $context) + { + // See above. + $type['name'] = 'array'; + + return new Sequence($visitor->visitArray($data, $type, $context)); + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Handler/PropelCollectionHandler.php b/vendor/jms/serializer/src/JMS/Serializer/Handler/PropelCollectionHandler.php new file mode 100644 index 0000000000..defccc82f6 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Handler/PropelCollectionHandler.php @@ -0,0 +1,80 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Handler; + +use \PropelCollection; +use JMS\Serializer\Context; +use JMS\Serializer\GraphNavigator; +use JMS\Serializer\VisitorInterface; +use JMS\Serializer\Handler\SubscribingHandlerInterface; + +class PropelCollectionHandler implements SubscribingHandlerInterface +{ + public static function getSubscribingMethods() + { + $methods = array(); + $formats = array('json', 'xml', 'yml'); + //Note: issue when handling inheritance + $collectionTypes = array( + 'PropelCollection', + 'PropelObjectCollection', + 'PropelArrayCollection', + 'PropelOnDemandCollection' + ); + + foreach ($collectionTypes as $type) { + foreach ($formats as $format) { + $methods[] = array( + 'direction' => GraphNavigator::DIRECTION_SERIALIZATION, + 'type' => $type, + 'format' => $format, + 'method' => 'serializeCollection', + ); + + $methods[] = array( + 'direction' => GraphNavigator::DIRECTION_DESERIALIZATION, + 'type' => $type, + 'format' => $format, + 'method' => 'deserializeCollection', + ); + } + } + + return $methods; + } + + public function serializeCollection(VisitorInterface $visitor, PropelCollection $collection, array $type, Context $context) + { + // We change the base type, and pass through possible parameters. + $type['name'] = 'array'; + + return $visitor->visitArray($collection->getData(), $type, $context); + } + + public function deserializeCollection(VisitorInterface $visitor, $data, array $type, Context $context) + { + // See above. Set parameter type to PropelCollection or PropelCollection + $type['name'] = 'array'; + + $collection = new PropelCollection(); + $collection->setData($visitor->visitArray($data, $type, $context)); + + return $collection; + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Handler/StdClassHandler.php b/vendor/jms/serializer/src/JMS/Serializer/Handler/StdClassHandler.php new file mode 100644 index 0000000000..2e1ad5bab5 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Handler/StdClassHandler.php @@ -0,0 +1,60 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Handler; + +use JMS\Serializer\Context; +use JMS\Serializer\GraphNavigator; +use JMS\Serializer\Metadata\StaticPropertyMetadata; +use JMS\Serializer\VisitorInterface; + +/** + * @author Asmir Mustafic + */ +class StdClassHandler implements SubscribingHandlerInterface +{ + public static function getSubscribingMethods() + { + $methods = array(); + $formats = array('json', 'xml', 'yml'); + + foreach ($formats as $format) { + $methods[] = array( + 'direction' => GraphNavigator::DIRECTION_SERIALIZATION, + 'type' => 'stdClass', + 'format' => $format, + 'method' => 'serializeStdClass', + ); + } + + return $methods; + } + + public function serializeStdClass(VisitorInterface $visitor, \stdClass $stdClass, array $type, Context $context) + { + $classMetadata = $context->getMetadataFactory()->getMetadataForClass('stdClass'); + $visitor->startVisitingObject($classMetadata, $stdClass, array('name' => 'stdClass'), $context); + + foreach ((array)$stdClass as $name => $value) { + $metadata = new StaticPropertyMetadata('stdClass', $name, $value); + $visitor->visitProperty($metadata, $value, $context); + } + + return $visitor->endVisitingObject($classMetadata, $stdClass, array('name' => 'stdClass'), $context); + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Handler/SubscribingHandlerInterface.php b/vendor/jms/serializer/src/JMS/Serializer/Handler/SubscribingHandlerInterface.php new file mode 100644 index 0000000000..5fd67e21c3 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Handler/SubscribingHandlerInterface.php @@ -0,0 +1,40 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Handler; + +interface SubscribingHandlerInterface +{ + /** + * Return format: + * + * array( + * array( + * 'direction' => GraphNavigator::DIRECTION_SERIALIZATION, + * 'format' => 'json', + * 'type' => 'DateTime', + * 'method' => 'serializeDateTimeToJson', + * ), + * ) + * + * The direction and method keys can be omitted. + * + * @return array + */ + public static function getSubscribingMethods(); +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/JsonDeserializationVisitor.php b/vendor/jms/serializer/src/JMS/Serializer/JsonDeserializationVisitor.php new file mode 100644 index 0000000000..be763aeaa3 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/JsonDeserializationVisitor.php @@ -0,0 +1,52 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer; + +use JMS\Serializer\Exception\RuntimeException; + +class JsonDeserializationVisitor extends GenericDeserializationVisitor +{ + protected function decode($str) + { + $decoded = json_decode($str, true); + + switch (json_last_error()) { + case JSON_ERROR_NONE: + return $decoded; + + case JSON_ERROR_DEPTH: + throw new RuntimeException('Could not decode JSON, maximum stack depth exceeded.'); + + case JSON_ERROR_STATE_MISMATCH: + throw new RuntimeException('Could not decode JSON, underflow or the nodes mismatch.'); + + case JSON_ERROR_CTRL_CHAR: + throw new RuntimeException('Could not decode JSON, unexpected control character found.'); + + case JSON_ERROR_SYNTAX: + throw new RuntimeException('Could not decode JSON, syntax error - malformed JSON.'); + + case JSON_ERROR_UTF8: + throw new RuntimeException('Could not decode JSON, malformed UTF-8 characters (incorrectly encoded?)'); + + default: + throw new RuntimeException('Could not decode JSON.'); + } + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/JsonSerializationVisitor.php b/vendor/jms/serializer/src/JMS/Serializer/JsonSerializationVisitor.php new file mode 100644 index 0000000000..3b4dd2d331 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/JsonSerializationVisitor.php @@ -0,0 +1,256 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer; + +use JMS\Serializer\Metadata\ClassMetadata; +use JMS\Serializer\Exception\InvalidArgumentException; +use JMS\Serializer\Metadata\PropertyMetadata; + +class JsonSerializationVisitor extends GenericSerializationVisitor +{ + private $options = 0; + + private $navigator; + private $root; + private $dataStack; + private $data; + + public function setNavigator(GraphNavigator $navigator) + { + $this->navigator = $navigator; + $this->root = null; + $this->dataStack = new \SplStack; + } + + /** + * @return GraphNavigator + */ + public function getNavigator() + { + return $this->navigator; + } + + public function visitNull($data, array $type, Context $context) + { + return null; + } + + public function visitString($data, array $type, Context $context) + { + if (null === $this->root) { + $this->root = $data; + } + + return (string) $data; + } + + public function visitBoolean($data, array $type, Context $context) + { + if (null === $this->root) { + $this->root = $data; + } + + return (boolean) $data; + } + + public function visitInteger($data, array $type, Context $context) + { + if (null === $this->root) { + $this->root = $data; + } + + return (int) $data; + } + + public function visitDouble($data, array $type, Context $context) + { + if (null === $this->root) { + $this->root = $data; + } + + return (float) $data; + } + + /** + * @param array $data + * @param array $type + * @param Context $context + * @return mixed + */ + public function visitArray($data, array $type, Context $context) + { + $this->dataStack->push($data); + + $isHash = isset($type['params'][1]); + + if (null === $this->root) { + $this->root = $isHash ? new \ArrayObject() : array(); + $rs = &$this->root; + } else { + $rs = $isHash ? new \ArrayObject() : array(); + } + + $isList = isset($type['params'][0]) && ! isset($type['params'][1]); + + foreach ($data as $k => $v) { + $v = $this->navigator->accept($v, $this->getElementType($type), $context); + + if (null === $v && $context->shouldSerializeNull() !== true) { + continue; + } + + if ($isList) { + $rs[] = $v; + } else { + $rs[$k] = $v; + } + } + + $this->dataStack->pop(); + return $rs; + } + + public function startVisitingObject(ClassMetadata $metadata, $data, array $type, Context $context) + { + if (null === $this->root) { + $this->root = new \stdClass; + } + + $this->dataStack->push($this->data); + $this->data = array(); + } + + public function endVisitingObject(ClassMetadata $metadata, $data, array $type, Context $context) + { + $rs = $this->data; + $this->data = $this->dataStack->pop(); + + // Force JSON output to "{}" instead of "[]" if it contains either no properties or all properties are null. + if (empty($rs)) { + $rs = new \ArrayObject(); + } + + if ($this->root instanceof \stdClass && 0 === $this->dataStack->count()) { + $this->root = $rs; + } + + return $rs; + } + + public function visitProperty(PropertyMetadata $metadata, $data, Context $context) + { + $v = $this->accessor->getValue($data, $metadata); + + $v = $this->navigator->accept($v, $metadata->type, $context); + if ((null === $v && $context->shouldSerializeNull() !== true) + || (true === $metadata->skipWhenEmpty && ($v instanceof \ArrayObject || is_array($v)) && 0 === count($v)) + ) { + return; + } + + $k = $this->namingStrategy->translateName($metadata); + + if ($metadata->inline) { + if (is_array($v)) { + $this->data = array_merge($this->data, $v); + } + } else { + $this->data[$k] = $v; + } + } + + /** + * Allows you to add additional data to the current object/root element. + * @deprecated use setData instead + * @param string $key + * @param integer|float|boolean|string|array|null $value This value must either be a regular scalar, or an array. + * It must not contain any objects anymore. + */ + public function addData($key, $value) + { + if (isset($this->data[$key])) { + throw new InvalidArgumentException(sprintf('There is already data for "%s".', $key)); + } + + $this->data[$key] = $value; + } + + /** + * Checks if some data key exists. + * + * @param string $key + * @return boolean + */ + public function hasData($key) + { + return isset($this->data[$key]); + } + + /** + * Allows you to replace existing data on the current object/root element. + * + * @param string $key + * @param integer|float|boolean|string|array|null $value This value must either be a regular scalar, or an array. + * It must not contain any objects anymore. + */ + public function setData($key, $value) + { + $this->data[$key] = $value; + } + + public function getRoot() + { + return $this->root; + } + + /** + * @param array|\ArrayObject $data the passed data must be understood by whatever encoding function is applied later. + */ + public function setRoot($data) + { + $this->root = $data; + } + + + public function getResult() + { + $result = @json_encode($this->getRoot(), $this->options); + + switch (json_last_error()) { + case JSON_ERROR_NONE: + return $result; + + case JSON_ERROR_UTF8: + throw new \RuntimeException('Your data could not be encoded because it contains invalid UTF8 characters.'); + + default: + throw new \RuntimeException(sprintf('An error occurred while encoding your data (error code %d).', json_last_error())); + } + } + + public function getOptions() + { + return $this->options; + } + + public function setOptions($options) + { + $this->options = (integer) $options; + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Metadata/ClassMetadata.php b/vendor/jms/serializer/src/JMS/Serializer/Metadata/ClassMetadata.php new file mode 100644 index 0000000000..8fe096ff25 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Metadata/ClassMetadata.php @@ -0,0 +1,346 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Metadata; + +use JMS\Serializer\Exception\InvalidArgumentException; +use Metadata\MergeableInterface; +use Metadata\MethodMetadata; +use Metadata\MergeableClassMetadata; +use Metadata\PropertyMetadata as BasePropertyMetadata; + +/** + * Class Metadata used to customize the serialization process. + * + * @author Johannes M. Schmitt + */ +class ClassMetadata extends MergeableClassMetadata +{ + const ACCESSOR_ORDER_UNDEFINED = 'undefined'; + const ACCESSOR_ORDER_ALPHABETICAL = 'alphabetical'; + const ACCESSOR_ORDER_CUSTOM = 'custom'; + + /** @var \ReflectionMethod[] */ + public $preSerializeMethods = array(); + + /** @var \ReflectionMethod[] */ + public $postSerializeMethods = array(); + + /** @var \ReflectionMethod[] */ + public $postDeserializeMethods = array(); + + public $xmlRootName; + public $xmlRootNamespace; + public $xmlNamespaces = array(); + public $accessorOrder; + public $customOrder; + public $usingExpression = false; + public $handlerCallbacks = array(); + + public $discriminatorDisabled = false; + public $discriminatorBaseClass; + public $discriminatorFieldName; + public $discriminatorValue; + public $discriminatorMap = array(); + public $discriminatorGroups = array(); + + public $xmlDiscriminatorAttribute = false; + public $xmlDiscriminatorCData = true; + public $xmlDiscriminatorNamespace; + + public function setDiscriminator($fieldName, array $map, array $groups = array()) + { + if (empty($fieldName)) { + throw new \InvalidArgumentException('The $fieldName cannot be empty.'); + } + + if (empty($map)) { + throw new \InvalidArgumentException('The discriminator map cannot be empty.'); + } + + $this->discriminatorBaseClass = $this->name; + $this->discriminatorFieldName = $fieldName; + $this->discriminatorMap = $map; + $this->discriminatorGroups = $groups; + } + + /** + * Sets the order of properties in the class. + * + * @param string $order + * @param array $customOrder + * + * @throws InvalidArgumentException When the accessor order is not valid + * @throws InvalidArgumentException When the custom order is not valid + */ + public function setAccessorOrder($order, array $customOrder = array()) + { + if ( ! in_array($order, array(self::ACCESSOR_ORDER_UNDEFINED, self::ACCESSOR_ORDER_ALPHABETICAL, self::ACCESSOR_ORDER_CUSTOM), true)) { + throw new InvalidArgumentException(sprintf('The accessor order "%s" is invalid.', $order)); + } + + foreach ($customOrder as $name) { + if ( ! is_string($name)) { + throw new InvalidArgumentException(sprintf('$customOrder is expected to be a list of strings, but got element of value %s.', json_encode($name))); + } + } + + $this->accessorOrder = $order; + $this->customOrder = array_flip($customOrder); + $this->sortProperties(); + } + + public function addPropertyMetadata(BasePropertyMetadata $metadata) + { + parent::addPropertyMetadata($metadata); + $this->sortProperties(); + if ($metadata instanceof PropertyMetadata && $metadata->excludeIf) { + $this->usingExpression = true; + } + } + + public function addPreSerializeMethod(MethodMetadata $method) + { + $this->preSerializeMethods[] = $method; + } + + public function addPostSerializeMethod(MethodMetadata $method) + { + $this->postSerializeMethods[] = $method; + } + + public function addPostDeserializeMethod(MethodMetadata $method) + { + $this->postDeserializeMethods[] = $method; + } + + /** + * @param integer $direction + * @param string|integer $format + * @param string $methodName + */ + public function addHandlerCallback($direction, $format, $methodName) + { + $this->handlerCallbacks[$direction][$format] = $methodName; + } + + public function merge(MergeableInterface $object) + { + if ( ! $object instanceof ClassMetadata) { + throw new InvalidArgumentException('$object must be an instance of ClassMetadata.'); + } + parent::merge($object); + + $this->preSerializeMethods = array_merge($this->preSerializeMethods, $object->preSerializeMethods); + $this->postSerializeMethods = array_merge($this->postSerializeMethods, $object->postSerializeMethods); + $this->postDeserializeMethods = array_merge($this->postDeserializeMethods, $object->postDeserializeMethods); + $this->xmlRootName = $object->xmlRootName; + $this->xmlRootNamespace = $object->xmlRootNamespace; + $this->xmlNamespaces = array_merge($this->xmlNamespaces, $object->xmlNamespaces); + + // Handler methods are taken from the outer class completely. + $this->handlerCallbacks = $object->handlerCallbacks; + + if ($object->accessorOrder) { + $this->accessorOrder = $object->accessorOrder; + $this->customOrder = $object->customOrder; + } + + if ($object->discriminatorFieldName && $this->discriminatorFieldName) { + throw new \LogicException(sprintf( + 'The discriminator of class "%s" would overwrite the discriminator of the parent class "%s". Please define all possible sub-classes in the discriminator of %s.', + $object->name, + $this->discriminatorBaseClass, + $this->discriminatorBaseClass + )); + } elseif ( ! $this->discriminatorFieldName && $object->discriminatorFieldName) { + $this->discriminatorFieldName = $object->discriminatorFieldName; + $this->discriminatorMap = $object->discriminatorMap; + } + + if ($object->discriminatorDisabled !== null) { + $this->discriminatorDisabled = $object->discriminatorDisabled; + } + + if ($object->discriminatorMap) { + $this->discriminatorFieldName = $object->discriminatorFieldName; + $this->discriminatorMap = $object->discriminatorMap; + $this->discriminatorBaseClass = $object->discriminatorBaseClass; + } + + if ($this->discriminatorMap && ! $this->reflection->isAbstract()) { + if (false === $typeValue = array_search($this->name, $this->discriminatorMap, true)) { + throw new \LogicException(sprintf( + 'The sub-class "%s" is not listed in the discriminator of the base class "%s".', + $this->name, + $this->discriminatorBaseClass + )); + } + + $this->discriminatorValue = $typeValue; + + if (isset($this->propertyMetadata[$this->discriminatorFieldName]) + && ! $this->propertyMetadata[$this->discriminatorFieldName] instanceof StaticPropertyMetadata) { + throw new \LogicException(sprintf( + 'The discriminator field name "%s" of the base-class "%s" conflicts with a regular property of the sub-class "%s".', + $this->discriminatorFieldName, + $this->discriminatorBaseClass, + $this->name + )); + } + + $discriminatorProperty = new StaticPropertyMetadata( + $this->name, + $this->discriminatorFieldName, + $typeValue, + $this->discriminatorGroups + ); + $discriminatorProperty->serializedName = $this->discriminatorFieldName; + $discriminatorProperty->xmlAttribute = $this->xmlDiscriminatorAttribute; + $discriminatorProperty->xmlElementCData = $this->xmlDiscriminatorCData; + $discriminatorProperty->xmlNamespace = $this->xmlDiscriminatorNamespace; + $this->propertyMetadata[$this->discriminatorFieldName] = $discriminatorProperty; + } + + $this->sortProperties(); + } + + public function registerNamespace($uri, $prefix = null) + { + if ( ! is_string($uri)) { + throw new InvalidArgumentException(sprintf('$uri is expected to be a strings, but got value %s.', json_encode($uri))); + } + + if ($prefix !== null) { + if ( ! is_string($prefix)) { + throw new InvalidArgumentException(sprintf('$prefix is expected to be a strings, but got value %s.', json_encode($prefix))); + } + } else { + $prefix = ""; + } + + $this->xmlNamespaces[$prefix] = $uri; + + } + + public function serialize() + { + $this->sortProperties(); + + return serialize(array( + $this->preSerializeMethods, + $this->postSerializeMethods, + $this->postDeserializeMethods, + $this->xmlRootName, + $this->xmlRootNamespace, + $this->xmlNamespaces, + $this->accessorOrder, + $this->customOrder, + $this->handlerCallbacks, + $this->discriminatorDisabled, + $this->discriminatorBaseClass, + $this->discriminatorFieldName, + $this->discriminatorValue, + $this->discriminatorMap, + $this->discriminatorGroups, + parent::serialize(), + 'discriminatorGroups' => $this->discriminatorGroups, + 'xmlDiscriminatorAttribute' => $this->xmlDiscriminatorAttribute, + 'xmlDiscriminatorCData' => $this->xmlDiscriminatorCData, + 'usingExpression' => $this->usingExpression, + 'xmlDiscriminatorNamespace' => $this->xmlDiscriminatorNamespace, + )); + } + + public function unserialize($str) + { + $unserialized = unserialize($str); + + list( + $this->preSerializeMethods, + $this->postSerializeMethods, + $this->postDeserializeMethods, + $this->xmlRootName, + $this->xmlRootNamespace, + $this->xmlNamespaces, + $this->accessorOrder, + $this->customOrder, + $this->handlerCallbacks, + $this->discriminatorDisabled, + $this->discriminatorBaseClass, + $this->discriminatorFieldName, + $this->discriminatorValue, + $this->discriminatorMap, + $this->discriminatorGroups, + $parentStr + ) = $unserialized; + + if (isset($unserialized['discriminatorGroups'])) { + $this->discriminatorGroups = $unserialized['discriminatorGroups']; + } + if (isset($unserialized['usingExpression'])) { + $this->usingExpression = $unserialized['usingExpression']; + } + + if (isset($deserializedData['xmlDiscriminatorAttribute'])) { + $this->xmlDiscriminatorAttribute = $deserializedData['xmlDiscriminatorAttribute']; + } + + if (isset($deserializedData['xmlDiscriminatorNamespace'])) { + $this->xmlDiscriminatorNamespace = $deserializedData['xmlDiscriminatorNamespace']; + } + + if (isset($deserializedData['xmlDiscriminatorCData'])) { + $this->xmlDiscriminatorCData = $deserializedData['xmlDiscriminatorCData']; + } + + parent::unserialize($parentStr); + } + + private function sortProperties() + { + switch ($this->accessorOrder) { + case self::ACCESSOR_ORDER_ALPHABETICAL: + ksort($this->propertyMetadata); + break; + + case self::ACCESSOR_ORDER_CUSTOM: + $order = $this->customOrder; + $currentSorting = $this->propertyMetadata ? array_combine(array_keys($this->propertyMetadata), range(1, count($this->propertyMetadata))) : []; + uksort($this->propertyMetadata, function($a, $b) use ($order, $currentSorting) { + $existsA = isset($order[$a]); + $existsB = isset($order[$b]); + + if ( ! $existsA && ! $existsB) { + return $currentSorting[$a] - $currentSorting[$b]; + } + + if ( ! $existsA) { + return 1; + } + + if ( ! $existsB) { + return -1; + } + + return $order[$a] < $order[$b] ? -1 : 1; + }); + break; + } + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Metadata/Driver/AbstractDoctrineTypeDriver.php b/vendor/jms/serializer/src/JMS/Serializer/Metadata/Driver/AbstractDoctrineTypeDriver.php new file mode 100644 index 0000000000..990003d6a0 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Metadata/Driver/AbstractDoctrineTypeDriver.php @@ -0,0 +1,173 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Metadata\Driver; + +use Doctrine\Common\Persistence\ManagerRegistry; +use JMS\Serializer\Metadata\ClassMetadata; +use Doctrine\Common\Persistence\Mapping\ClassMetadata as DoctrineClassMetadata; +use JMS\Serializer\Metadata\PropertyMetadata; +use JMS\Serializer\Metadata\ExpressionPropertyMetadata; +use JMS\Serializer\Metadata\StaticPropertyMetadata; +use JMS\Serializer\Metadata\VirtualPropertyMetadata; +use Metadata\Driver\DriverInterface; + +/** + * This class decorates any other driver. If the inner driver does not provide a + * a property type, the decorator will guess based on Doctrine 2 metadata. + */ +abstract class AbstractDoctrineTypeDriver implements DriverInterface +{ + /** + * Map of doctrine 2 field types to JMS\Serializer types + * @var array + */ + protected $fieldMapping = array( + 'string' => 'string', + 'text' => 'string', + 'blob' => 'string', + + 'integer' => 'integer', + 'smallint' => 'integer', + 'bigint' => 'integer', + + 'datetime' => 'DateTime', + 'datetimetz' => 'DateTime', + 'time' => 'DateTime', + 'date' => 'DateTime', + + 'float' => 'float', + 'decimal' => 'float', + + 'boolean' => 'boolean', + + 'array' => 'array', + 'json_array' => 'array', + 'simple_array' => 'array', + ); + + /** + * @var DriverInterface + */ + protected $delegate; + + /** + * @var ManagerRegistry + */ + protected $registry; + + public function __construct(DriverInterface $delegate, ManagerRegistry $registry) + { + $this->delegate = $delegate; + $this->registry = $registry; + } + + public function loadMetadataForClass(\ReflectionClass $class) + { + /** @var $classMetadata ClassMetadata */ + $classMetadata = $this->delegate->loadMetadataForClass($class); + + // Abort if the given class is not a mapped entity + if ( ! $doctrineMetadata = $this->tryLoadingDoctrineMetadata($class->name)) { + return $classMetadata; + } + + $this->setDiscriminator($doctrineMetadata, $classMetadata); + + // We base our scan on the internal driver's property list so that we + // respect any internal white/blacklisting like in the AnnotationDriver + foreach ($classMetadata->propertyMetadata as $key => $propertyMetadata) { + /** @var $propertyMetadata PropertyMetadata */ + + // If the inner driver provides a type, don't guess anymore. + if ($propertyMetadata->type || $this->isVirtualProperty($propertyMetadata)) { + continue; + } + + if ($this->hideProperty($doctrineMetadata, $propertyMetadata)) { + unset($classMetadata->propertyMetadata[$key]); + } + + $this->setPropertyType($doctrineMetadata, $propertyMetadata); + } + + return $classMetadata; + } + + private function isVirtualProperty(PropertyMetadata $propertyMetadata) + { + return $propertyMetadata instanceof VirtualPropertyMetadata + || $propertyMetadata instanceof StaticPropertyMetadata + || $propertyMetadata instanceof ExpressionPropertyMetadata; + } + + /** + * @param DoctrineClassMetadata $doctrineMetadata + * @param ClassMetadata $classMetadata + */ + protected function setDiscriminator(DoctrineClassMetadata $doctrineMetadata, ClassMetadata $classMetadata) + { + } + + /** + * @param DoctrineClassMetadata $doctrineMetadata + * @param PropertyMetadata $propertyMetadata + */ + protected function hideProperty(DoctrineClassMetadata $doctrineMetadata, PropertyMetadata $propertyMetadata) + { + return false; + } + + /** + * @param DoctrineClassMetadata $doctrineMetadata + * @param PropertyMetadata $propertyMetadata + */ + protected function setPropertyType(DoctrineClassMetadata $doctrineMetadata, PropertyMetadata $propertyMetadata) + { + } + + /** + * @param string $className + * + * @return null|DoctrineClassMetadata + */ + protected function tryLoadingDoctrineMetadata($className) + { + if ( ! $manager = $this->registry->getManagerForClass($className)) { + return null; + } + + if ($manager->getMetadataFactory()->isTransient($className)) { + return null; + } + + return $manager->getClassMetadata($className); + } + + /** + * @param string $type + */ + protected function normalizeFieldType($type) + { + if ( ! isset($this->fieldMapping[$type])) { + return; + } + + return $this->fieldMapping[$type]; + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Metadata/Driver/AnnotationDriver.php b/vendor/jms/serializer/src/JMS/Serializer/Metadata/Driver/AnnotationDriver.php new file mode 100644 index 0000000000..175bc81156 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Metadata/Driver/AnnotationDriver.php @@ -0,0 +1,250 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Metadata\Driver; + +use JMS\Serializer\Annotation\Discriminator; +use JMS\Serializer\Annotation\ExcludeIf; +use JMS\Serializer\Annotation\SkipWhenEmpty; +use JMS\Serializer\Annotation\XmlDiscriminator; +use JMS\Serializer\GraphNavigator; +use JMS\Serializer\Annotation\HandlerCallback; +use JMS\Serializer\Annotation\AccessorOrder; +use JMS\Serializer\Annotation\Accessor; +use JMS\Serializer\Annotation\AccessType; +use JMS\Serializer\Annotation\XmlMap; +use JMS\Serializer\Annotation\XmlRoot; +use JMS\Serializer\Annotation\XmlNamespace; +use JMS\Serializer\Annotation\XmlAttribute; +use JMS\Serializer\Annotation\XmlList; +use JMS\Serializer\Annotation\XmlValue; +use JMS\Serializer\Annotation\XmlKeyValuePairs; +use JMS\Serializer\Annotation\XmlElement; +use JMS\Serializer\Annotation\PostSerialize; +use JMS\Serializer\Annotation\PostDeserialize; +use JMS\Serializer\Annotation\PreSerialize; +use JMS\Serializer\Annotation\VirtualProperty; +use JMS\Serializer\Metadata\ExpressionPropertyMetadata; +use Metadata\MethodMetadata; +use Doctrine\Common\Annotations\Reader; +use JMS\Serializer\Annotation\Type; +use JMS\Serializer\Annotation\Exclude; +use JMS\Serializer\Annotation\Groups; +use JMS\Serializer\Annotation\Expose; +use JMS\Serializer\Annotation\SerializedName; +use JMS\Serializer\Annotation\Until; +use JMS\Serializer\Annotation\Since; +use JMS\Serializer\Annotation\ExclusionPolicy; +use JMS\Serializer\Annotation\Inline; +use JMS\Serializer\Annotation\ReadOnly; +use JMS\Serializer\Metadata\ClassMetadata; +use JMS\Serializer\Metadata\PropertyMetadata; +use JMS\Serializer\Metadata\VirtualPropertyMetadata; +use JMS\Serializer\Exception\InvalidArgumentException; +use JMS\Serializer\Annotation\XmlAttributeMap; +use Metadata\Driver\DriverInterface; +use JMS\Serializer\Annotation\MaxDepth; + +class AnnotationDriver implements DriverInterface +{ + private $reader; + + public function __construct(Reader $reader) + { + $this->reader = $reader; + } + + public function loadMetadataForClass(\ReflectionClass $class) + { + $classMetadata = new ClassMetadata($name = $class->name); + $classMetadata->fileResources[] = $class->getFilename(); + + $propertiesMetadata = array(); + $propertiesAnnotations = array(); + + $exclusionPolicy = 'NONE'; + $excludeAll = false; + $classAccessType = PropertyMetadata::ACCESS_TYPE_PROPERTY; + $readOnlyClass = false; + foreach ($this->reader->getClassAnnotations($class) as $annot) { + if ($annot instanceof ExclusionPolicy) { + $exclusionPolicy = $annot->policy; + } elseif ($annot instanceof XmlRoot) { + $classMetadata->xmlRootName = $annot->name; + $classMetadata->xmlRootNamespace = $annot->namespace; + } elseif ($annot instanceof XmlNamespace) { + $classMetadata->registerNamespace($annot->uri, $annot->prefix); + } elseif ($annot instanceof Exclude) { + $excludeAll = true; + } elseif ($annot instanceof AccessType) { + $classAccessType = $annot->type; + } elseif ($annot instanceof ReadOnly) { + $readOnlyClass = true; + } elseif ($annot instanceof AccessorOrder) { + $classMetadata->setAccessorOrder($annot->order, $annot->custom); + } elseif ($annot instanceof Discriminator) { + if ($annot->disabled) { + $classMetadata->discriminatorDisabled = true; + } else { + $classMetadata->setDiscriminator($annot->field, $annot->map, $annot->groups); + } + } elseif ($annot instanceof XmlDiscriminator) { + $classMetadata->xmlDiscriminatorAttribute = (bool) $annot->attribute; + $classMetadata->xmlDiscriminatorCData = (bool) $annot->cdata; + $classMetadata->xmlDiscriminatorNamespace = $annot->namespace ? (string) $annot->namespace : null; + } elseif ($annot instanceof VirtualProperty) { + $virtualPropertyMetadata = new ExpressionPropertyMetadata($name, $annot->name, $annot->exp); + $propertiesMetadata[] = $virtualPropertyMetadata; + $propertiesAnnotations[] = $annot->options; + } + } + + foreach ($class->getMethods() as $method) { + if ($method->class !== $name) { + continue; + } + + $methodAnnotations = $this->reader->getMethodAnnotations($method); + + foreach ($methodAnnotations as $annot) { + if ($annot instanceof PreSerialize) { + $classMetadata->addPreSerializeMethod(new MethodMetadata($name, $method->name)); + continue 2; + } elseif ($annot instanceof PostDeserialize) { + $classMetadata->addPostDeserializeMethod(new MethodMetadata($name, $method->name)); + continue 2; + } elseif ($annot instanceof PostSerialize) { + $classMetadata->addPostSerializeMethod(new MethodMetadata($name, $method->name)); + continue 2; + } elseif ($annot instanceof VirtualProperty) { + $virtualPropertyMetadata = new VirtualPropertyMetadata($name, $method->name); + $propertiesMetadata[] = $virtualPropertyMetadata; + $propertiesAnnotations[] = $methodAnnotations; + continue 2; + } elseif ($annot instanceof HandlerCallback) { + $classMetadata->addHandlerCallback(GraphNavigator::parseDirection($annot->direction), $annot->format, $method->name); + continue 2; + } + } + } + + if ( ! $excludeAll) { + foreach ($class->getProperties() as $property) { + if ($property->class !== $name || (isset($property->info) && $property->info['class'] !== $name)) { + continue; + } + $propertiesMetadata[] = new PropertyMetadata($name, $property->getName()); + $propertiesAnnotations[] = $this->reader->getPropertyAnnotations($property); + } + + foreach ($propertiesMetadata as $propertyKey => $propertyMetadata) { + $isExclude = false; + $isExpose = $propertyMetadata instanceof VirtualPropertyMetadata + || $propertyMetadata instanceof ExpressionPropertyMetadata; + $propertyMetadata->readOnly = $propertyMetadata->readOnly || $readOnlyClass; + $accessType = $classAccessType; + $accessor = array(null, null); + + $propertyAnnotations = $propertiesAnnotations[$propertyKey]; + + foreach ($propertyAnnotations as $annot) { + if ($annot instanceof Since) { + $propertyMetadata->sinceVersion = $annot->version; + } elseif ($annot instanceof Until) { + $propertyMetadata->untilVersion = $annot->version; + } elseif ($annot instanceof SerializedName) { + $propertyMetadata->serializedName = $annot->name; + } elseif ($annot instanceof SkipWhenEmpty) { + $propertyMetadata->skipWhenEmpty = true; + } elseif ($annot instanceof Expose) { + $isExpose = true; + if (null !== $annot->if) { + $propertyMetadata->excludeIf = "!(" . $annot->if . ")"; + } + } elseif ($annot instanceof Exclude) { + if (null !== $annot->if) { + $propertyMetadata->excludeIf = $annot->if; + } else { + $isExclude = true; + } + } elseif ($annot instanceof Type) { + $propertyMetadata->setType($annot->name); + } elseif ($annot instanceof XmlElement) { + $propertyMetadata->xmlAttribute = false; + $propertyMetadata->xmlElementCData = $annot->cdata; + $propertyMetadata->xmlNamespace = $annot->namespace; + } elseif ($annot instanceof XmlList) { + $propertyMetadata->xmlCollection = true; + $propertyMetadata->xmlCollectionInline = $annot->inline; + $propertyMetadata->xmlEntryName = $annot->entry; + $propertyMetadata->xmlEntryNamespace = $annot->namespace; + $propertyMetadata->xmlCollectionSkipWhenEmpty = $annot->skipWhenEmpty; + } elseif ($annot instanceof XmlMap) { + $propertyMetadata->xmlCollection = true; + $propertyMetadata->xmlCollectionInline = $annot->inline; + $propertyMetadata->xmlEntryName = $annot->entry; + $propertyMetadata->xmlEntryNamespace = $annot->namespace; + $propertyMetadata->xmlKeyAttribute = $annot->keyAttribute; + } elseif ($annot instanceof XmlKeyValuePairs) { + $propertyMetadata->xmlKeyValuePairs = true; + } elseif ($annot instanceof XmlAttribute) { + $propertyMetadata->xmlAttribute = true; + $propertyMetadata->xmlNamespace = $annot->namespace; + } elseif ($annot instanceof XmlValue) { + $propertyMetadata->xmlValue = true; + $propertyMetadata->xmlElementCData = $annot->cdata; + } elseif ($annot instanceof XmlElement) { + $propertyMetadata->xmlElementCData = $annot->cdata; + } elseif ($annot instanceof AccessType) { + $accessType = $annot->type; + } elseif ($annot instanceof ReadOnly) { + $propertyMetadata->readOnly = $annot->readOnly; + } elseif ($annot instanceof Accessor) { + $accessor = array($annot->getter, $annot->setter); + } elseif ($annot instanceof Groups) { + $propertyMetadata->groups = $annot->groups; + foreach ((array) $propertyMetadata->groups as $groupName) { + if (false !== strpos($groupName, ',')) { + throw new InvalidArgumentException(sprintf( + 'Invalid group name "%s" on "%s", did you mean to create multiple groups?', + implode(', ', $propertyMetadata->groups), + $propertyMetadata->class.'->'.$propertyMetadata->name + )); + } + } + } elseif ($annot instanceof Inline) { + $propertyMetadata->inline = true; + } elseif ($annot instanceof XmlAttributeMap) { + $propertyMetadata->xmlAttributeMap = true; + } elseif ($annot instanceof MaxDepth) { + $propertyMetadata->maxDepth = $annot->depth; + } + } + + + if ((ExclusionPolicy::NONE === $exclusionPolicy && ! $isExclude) + || (ExclusionPolicy::ALL === $exclusionPolicy && $isExpose)) { + $propertyMetadata->setAccessor($accessType, $accessor[0], $accessor[1]); + $classMetadata->addPropertyMetadata($propertyMetadata); + } + } + } + + return $classMetadata; + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Metadata/Driver/DoctrinePHPCRTypeDriver.php b/vendor/jms/serializer/src/JMS/Serializer/Metadata/Driver/DoctrinePHPCRTypeDriver.php new file mode 100644 index 0000000000..d9353c47ad --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Metadata/Driver/DoctrinePHPCRTypeDriver.php @@ -0,0 +1,69 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Metadata\Driver; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata as DoctrineClassMetadata; +use JMS\Serializer\Metadata\PropertyMetadata; + +/** + * This class decorates any other driver. If the inner driver does not provide a + * a property type, the decorator will guess based on Doctrine 2 metadata. + */ +class DoctrinePHPCRTypeDriver extends AbstractDoctrineTypeDriver +{ + /** + * @param DoctrineClassMetadata $doctrineMetadata + * @param PropertyMetadata $propertyMetadata + */ + protected function hideProperty(DoctrineClassMetadata $doctrineMetadata, PropertyMetadata $propertyMetadata) + { + return 'lazyPropertiesDefaults' === $propertyMetadata->name + || $doctrineMetadata->parentMapping === $propertyMetadata->name + || $doctrineMetadata->node === $propertyMetadata->name; + } + + protected function setPropertyType(DoctrineClassMetadata $doctrineMetadata, PropertyMetadata $propertyMetadata) + { + $propertyName = $propertyMetadata->name; + if ($doctrineMetadata->hasField($propertyName) && $fieldType = $this->normalizeFieldType($doctrineMetadata->getTypeOfField($propertyName))) { + $field = $doctrineMetadata->getFieldMapping($propertyName); + if ( ! empty($field['multivalue'])) { + $fieldType = 'array'; + } + + $propertyMetadata->setType($fieldType); + } elseif ($doctrineMetadata->hasAssociation($propertyName)) { + try { + $targetEntity = $doctrineMetadata->getAssociationTargetClass($propertyName); + } catch (\Exception $e) { + return; + } + + if (null === $this->tryLoadingDoctrineMetadata($targetEntity)) { + return; + } + + if ( ! $doctrineMetadata->isSingleValuedAssociation($propertyName)) { + $targetEntity = "ArrayCollection<{$targetEntity}>"; + } + + $propertyMetadata->setType($targetEntity); + } + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Metadata/Driver/DoctrineTypeDriver.php b/vendor/jms/serializer/src/JMS/Serializer/Metadata/Driver/DoctrineTypeDriver.php new file mode 100644 index 0000000000..9587c58e94 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Metadata/Driver/DoctrineTypeDriver.php @@ -0,0 +1,69 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Metadata\Driver; + +use JMS\Serializer\Metadata\ClassMetadata; +use Doctrine\Common\Persistence\Mapping\ClassMetadata as DoctrineClassMetadata; +use JMS\Serializer\Metadata\PropertyMetadata; + +/** + * This class decorates any other driver. If the inner driver does not provide a + * a property type, the decorator will guess based on Doctrine 2 metadata. + */ +class DoctrineTypeDriver extends AbstractDoctrineTypeDriver +{ + protected function setDiscriminator(DoctrineClassMetadata $doctrineMetadata, ClassMetadata $classMetadata) + { + if (empty($classMetadata->discriminatorMap) && ! $classMetadata->discriminatorDisabled + && ! empty($doctrineMetadata->discriminatorMap) && $doctrineMetadata->isRootEntity() + ) { + $classMetadata->setDiscriminator( + $doctrineMetadata->discriminatorColumn['name'], + $doctrineMetadata->discriminatorMap + ); + } + } + + protected function setPropertyType(DoctrineClassMetadata $doctrineMetadata, PropertyMetadata $propertyMetadata) + { + $propertyName = $propertyMetadata->name; + if ($doctrineMetadata->hasField($propertyName) && $fieldType = $this->normalizeFieldType($doctrineMetadata->getTypeOfField($propertyName))) { + $propertyMetadata->setType($fieldType); + } elseif ($doctrineMetadata->hasAssociation($propertyName)) { + $targetEntity = $doctrineMetadata->getAssociationTargetClass($propertyName); + + if (null === $targetMetadata = $this->tryLoadingDoctrineMetadata($targetEntity)) { + return; + } + + // For inheritance schemes, we cannot add any type as we would only add the super-type of the hierarchy. + // On serialization, this would lead to only the supertype being serialized, and properties of subtypes + // being ignored. + if ($targetMetadata instanceof DoctrineClassMetadata && ! $targetMetadata->isInheritanceTypeNone()) { + return; + } + + if ( ! $doctrineMetadata->isSingleValuedAssociation($propertyName)) { + $targetEntity = "ArrayCollection<{$targetEntity}>"; + } + + $propertyMetadata->setType($targetEntity); + } + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Metadata/Driver/PhpDriver.php b/vendor/jms/serializer/src/JMS/Serializer/Metadata/Driver/PhpDriver.php new file mode 100644 index 0000000000..05975896cf --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Metadata/Driver/PhpDriver.php @@ -0,0 +1,45 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Metadata\Driver; + +use JMS\Serializer\Exception\RuntimeException; +use JMS\Serializer\Metadata\ClassMetadata; +use Metadata\Driver\AbstractFileDriver; + +class PhpDriver extends AbstractFileDriver +{ + protected function loadMetadataFromFile(\ReflectionClass $class, $file) + { + $metadata = require $file; + + if ( ! $metadata instanceof ClassMetadata) { + throw new RuntimeException(sprintf('The file %s was expected to return an instance of ClassMetadata, but returned %s.', $file, json_encode($metadata))); + } + if ($metadata->name !== $class->name) { + throw new RuntimeException(sprintf('The file %s was expected to return metadata for class %s, but instead returned metadata for class %s.', $class->name, $metadata->name)); + } + + return $metadata; + } + + protected function getExtension() + { + return 'php'; + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Metadata/Driver/XmlDriver.php b/vendor/jms/serializer/src/JMS/Serializer/Metadata/Driver/XmlDriver.php new file mode 100644 index 0000000000..47e5e8ed36 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Metadata/Driver/XmlDriver.php @@ -0,0 +1,354 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Metadata\Driver; + +use JMS\Serializer\GraphNavigator; +use JMS\Serializer\Exception\RuntimeException; +use JMS\Serializer\Exception\XmlErrorException; +use JMS\Serializer\Annotation\ExclusionPolicy; +use JMS\Serializer\Metadata\ExpressionPropertyMetadata; +use JMS\Serializer\Metadata\PropertyMetadata; +use JMS\Serializer\Metadata\VirtualPropertyMetadata; +use Metadata\MethodMetadata; +use JMS\Serializer\Metadata\ClassMetadata; +use Metadata\Driver\AbstractFileDriver; + +class XmlDriver extends AbstractFileDriver +{ + protected function loadMetadataFromFile(\ReflectionClass $class, $path) + { + $previous = libxml_use_internal_errors(true); + libxml_clear_errors(); + + $elem = simplexml_load_file($path); + libxml_use_internal_errors($previous); + + if (false === $elem) { + throw new XmlErrorException(libxml_get_last_error()); + } + + $metadata = new ClassMetadata($name = $class->name); + if ( ! $elems = $elem->xpath("./class[@name = '".$name."']")) { + throw new RuntimeException(sprintf('Could not find class %s inside XML element.', $name)); + } + $elem = reset($elems); + + $metadata->fileResources[] = $path; + $metadata->fileResources[] = $class->getFileName(); + $exclusionPolicy = strtoupper($elem->attributes()->{'exclusion-policy'}) ?: 'NONE'; + $excludeAll = null !== ($exclude = $elem->attributes()->exclude) ? 'true' === strtolower($exclude) : false; + $classAccessType = (string) ($elem->attributes()->{'access-type'} ?: PropertyMetadata::ACCESS_TYPE_PROPERTY); + + $propertiesMetadata = array(); + $propertiesNodes = array(); + + if (null !== $accessorOrder = $elem->attributes()->{'accessor-order'}) { + $metadata->setAccessorOrder((string) $accessorOrder, preg_split('/\s*,\s*/', (string) $elem->attributes()->{'custom-accessor-order'})); + } + + if (null !== $xmlRootName = $elem->attributes()->{'xml-root-name'}) { + $metadata->xmlRootName = (string) $xmlRootName; + } + + if (null !== $xmlRootNamespace = $elem->attributes()->{'xml-root-namespace'}) { + $metadata->xmlRootNamespace = (string) $xmlRootNamespace; + } + + $readOnlyClass = 'true' === strtolower($elem->attributes()->{'read-only'}); + + $discriminatorFieldName = (string) $elem->attributes()->{'discriminator-field-name'}; + $discriminatorMap = array(); + foreach ($elem->xpath('./discriminator-class') as $entry) { + if ( ! isset($entry->attributes()->value)) { + throw new RuntimeException('Each discriminator-class element must have a "value" attribute.'); + } + + $discriminatorMap[(string) $entry->attributes()->value] = (string) $entry; + } + + if ('true' === (string) $elem->attributes()->{'discriminator-disabled'}) { + $metadata->discriminatorDisabled = true; + } elseif ( ! empty($discriminatorFieldName) || ! empty($discriminatorMap)) { + + $discriminatorGroups = array(); + foreach ($elem->xpath('./discriminator-groups/group') as $entry) { + $discriminatorGroups[] = (string) $entry; + } + $metadata->setDiscriminator($discriminatorFieldName, $discriminatorMap, $discriminatorGroups); + } + + foreach ($elem->xpath('./xml-namespace') as $xmlNamespace) { + if ( ! isset($xmlNamespace->attributes()->uri)) { + throw new RuntimeException('The prefix attribute must be set for all xml-namespace elements.'); + } + + if (isset($xmlNamespace->attributes()->prefix)) { + $prefix = (string) $xmlNamespace->attributes()->prefix; + } else { + $prefix = null; + } + + $metadata->registerNamespace((string) $xmlNamespace->attributes()->uri, $prefix); + } + + foreach ($elem->xpath('./xml-discriminator') as $xmlDiscriminator) { + if (isset($xmlDiscriminator->attributes()->attribute)) { + $metadata->xmlDiscriminatorAttribute = (string) $xmlDiscriminator->attributes()->attribute === 'true'; + } + if (isset($xmlDiscriminator->attributes()->cdata)) { + $metadata->xmlDiscriminatorCData = (string) $xmlDiscriminator->attributes()->cdata === 'true'; + } + if (isset($xmlDiscriminator->attributes()->namespace)) { + $metadata->xmlDiscriminatorNamespace = (string) $xmlDiscriminator->attributes()->namespace; + } + } + + foreach ($elem->xpath('./virtual-property') as $method) { + + if (isset($method->attributes()->expression)) { + $virtualPropertyMetadata = new ExpressionPropertyMetadata($name, (string)$method->attributes()->name, (string)$method->attributes()->expression); + } else { + if ( ! isset($method->attributes()->method)) { + throw new RuntimeException('The method attribute must be set for all virtual-property elements.'); + } + $virtualPropertyMetadata = new VirtualPropertyMetadata($name, (string) $method->attributes()->method); + } + + $propertiesMetadata[] = $virtualPropertyMetadata; + $propertiesNodes[] = $method; + } + + if ( ! $excludeAll) { + + foreach ($class->getProperties() as $property) { + if ($property->class !== $name || (isset($property->info) && $property->info['class'] !== $name)) { + continue; + } + + $propertiesMetadata[] = new PropertyMetadata($name, $pName = $property->getName()); + $pElems = $elem->xpath("./property[@name = '".$pName."']"); + + $propertiesNodes[] = $pElems ? reset($pElems) : null; + } + + foreach ($propertiesMetadata as $propertyKey => $pMetadata) { + + $isExclude = false; + $isExpose = $pMetadata instanceof VirtualPropertyMetadata + || $pMetadata instanceof ExpressionPropertyMetadata; + + $pElem = $propertiesNodes[$propertyKey]; + if ( ! empty($pElem)) { + + if (null !== $exclude = $pElem->attributes()->exclude) { + $isExclude = 'true' === strtolower($exclude); + } + + if (null !== $expose = $pElem->attributes()->expose) { + $isExpose = 'true' === strtolower($expose); + } + + if (null !== $excludeIf = $pElem->attributes()->{'exclude-if'}) { + $pMetadata->excludeIf =$excludeIf; + } + + if (null !== $skip = $pElem->attributes()->{'skip-when-empty'}) { + $pMetadata->skipWhenEmpty = 'true' === strtolower($skip); + } + + if (null !== $excludeIf = $pElem->attributes()->{'expose-if'}) { + $pMetadata->excludeIf = "!(" . $excludeIf .")"; + $isExpose = true; + } + + if (null !== $version = $pElem->attributes()->{'since-version'}) { + $pMetadata->sinceVersion = (string) $version; + } + + if (null !== $version = $pElem->attributes()->{'until-version'}) { + $pMetadata->untilVersion = (string) $version; + } + + if (null !== $serializedName = $pElem->attributes()->{'serialized-name'}) { + $pMetadata->serializedName = (string) $serializedName; + } + + if (null !== $type = $pElem->attributes()->type) { + $pMetadata->setType((string) $type); + } elseif (isset($pElem->type)) { + $pMetadata->setType((string) $pElem->type); + } + + if (null !== $groups = $pElem->attributes()->groups) { + $pMetadata->groups = preg_split('/\s*,\s*/', (string) $groups); + } + + if (isset($pElem->{'xml-list'})) { + + $pMetadata->xmlCollection = true; + + $colConfig = $pElem->{'xml-list'}; + if (isset($colConfig->attributes()->inline)) { + $pMetadata->xmlCollectionInline = 'true' === (string) $colConfig->attributes()->inline; + } + + if (isset($colConfig->attributes()->{'entry-name'})) { + $pMetadata->xmlEntryName = (string) $colConfig->attributes()->{'entry-name'}; + } + + if (isset($colConfig->attributes()->{'skip-when-empty'})) { + $pMetadata->xmlCollectionSkipWhenEmpty = 'true' === (string) $colConfig->attributes()->{'skip-when-empty'}; + } else { + $pMetadata->xmlCollectionSkipWhenEmpty = true; + } + + if (isset($colConfig->attributes()->namespace)) { + $pMetadata->xmlEntryNamespace = (string) $colConfig->attributes()->namespace; + } + } + + if (isset($pElem->{'xml-map'})) { + $pMetadata->xmlCollection = true; + + $colConfig = $pElem->{'xml-map'}; + if (isset($colConfig->attributes()->inline)) { + $pMetadata->xmlCollectionInline = 'true' === (string) $colConfig->attributes()->inline; + } + + if (isset($colConfig->attributes()->{'entry-name'})) { + $pMetadata->xmlEntryName = (string) $colConfig->attributes()->{'entry-name'}; + } + + if (isset($colConfig->attributes()->namespace)) { + $pMetadata->xmlEntryNamespace = (string) $colConfig->attributes()->namespace; + } + + if (isset($colConfig->attributes()->{'key-attribute-name'})) { + $pMetadata->xmlKeyAttribute = (string) $colConfig->attributes()->{'key-attribute-name'}; + } + } + + if (isset($pElem->{'xml-element'})) { + $colConfig = $pElem->{'xml-element'}; + if (isset($colConfig->attributes()->cdata)) { + $pMetadata->xmlElementCData = 'true' === (string) $colConfig->attributes()->cdata; + } + + if (isset($colConfig->attributes()->namespace)) { + $pMetadata->xmlNamespace = (string) $colConfig->attributes()->namespace; + } + } + + if (isset($pElem->attributes()->{'xml-attribute'})) { + $pMetadata->xmlAttribute = 'true' === (string) $pElem->attributes()->{'xml-attribute'}; + } + + if (isset($pElem->attributes()->{'xml-attribute-map'})) { + $pMetadata->xmlAttributeMap = 'true' === (string) $pElem->attributes()->{'xml-attribute-map'}; + } + + if (isset($pElem->attributes()->{'xml-value'})) { + $pMetadata->xmlValue = 'true' === (string) $pElem->attributes()->{'xml-value'}; + } + + if (isset($pElem->attributes()->{'xml-key-value-pairs'})) { + $pMetadata->xmlKeyValuePairs = 'true' === (string) $pElem->attributes()->{'xml-key-value-pairs'}; + } + + if (isset($pElem->attributes()->{'max-depth'})) { + $pMetadata->maxDepth = (int) $pElem->attributes()->{'max-depth'}; + } + + //we need read-only before setter and getter set, because that method depends on flag being set + if (null !== $readOnly = $pElem->attributes()->{'read-only'}) { + $pMetadata->readOnly = 'true' === strtolower($readOnly); + } else { + $pMetadata->readOnly = $pMetadata->readOnly || $readOnlyClass; + } + + $getter = $pElem->attributes()->{'accessor-getter'}; + $setter = $pElem->attributes()->{'accessor-setter'}; + $pMetadata->setAccessor( + (string) ($pElem->attributes()->{'access-type'} ?: $classAccessType), + $getter ? (string) $getter : null, + $setter ? (string) $setter : null + ); + + if (null !== $inline = $pElem->attributes()->inline) { + $pMetadata->inline = 'true' === strtolower($inline); + } + + } + + if ((ExclusionPolicy::NONE === (string) $exclusionPolicy && ! $isExclude) + || (ExclusionPolicy::ALL === (string) $exclusionPolicy && $isExpose)) { + + $metadata->addPropertyMetadata($pMetadata); + } + } + } + + foreach ($elem->xpath('./callback-method') as $method) { + if ( ! isset($method->attributes()->type)) { + throw new RuntimeException('The type attribute must be set for all callback-method elements.'); + } + if ( ! isset($method->attributes()->name)) { + throw new RuntimeException('The name attribute must be set for all callback-method elements.'); + } + + switch ((string) $method->attributes()->type) { + case 'pre-serialize': + $metadata->addPreSerializeMethod(new MethodMetadata($name, (string) $method->attributes()->name)); + break; + + case 'post-serialize': + $metadata->addPostSerializeMethod(new MethodMetadata($name, (string) $method->attributes()->name)); + break; + + case 'post-deserialize': + $metadata->addPostDeserializeMethod(new MethodMetadata($name, (string) $method->attributes()->name)); + break; + + case 'handler': + if ( ! isset($method->attributes()->format)) { + throw new RuntimeException('The format attribute must be set for "handler" callback methods.'); + } + if ( ! isset($method->attributes()->direction)) { + throw new RuntimeException('The direction attribute must be set for "handler" callback methods.'); + } + + $direction = GraphNavigator::parseDirection((string) $method->attributes()->direction); + $format = (string) $method->attributes()->format; + $metadata->addHandlerCallback($direction, $format, (string) $method->attributes()->name); + + break; + + default: + throw new RuntimeException(sprintf('The type "%s" is not supported.', $method->attributes()->name)); + } + } + + return $metadata; + } + + protected function getExtension() + { + return 'xml'; + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Metadata/Driver/YamlDriver.php b/vendor/jms/serializer/src/JMS/Serializer/Metadata/Driver/YamlDriver.php new file mode 100644 index 0000000000..0c75cb96d4 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Metadata/Driver/YamlDriver.php @@ -0,0 +1,336 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Metadata\Driver; + +use JMS\Serializer\GraphNavigator; +use JMS\Serializer\Exception\RuntimeException; +use JMS\Serializer\Annotation\ExclusionPolicy; +use JMS\Serializer\Metadata\ExpressionPropertyMetadata; +use Metadata\MethodMetadata; +use JMS\Serializer\Metadata\PropertyMetadata; +use JMS\Serializer\Metadata\VirtualPropertyMetadata; +use JMS\Serializer\Metadata\ClassMetadata; +use Symfony\Component\Yaml\Yaml; +use Metadata\Driver\AbstractFileDriver; + +class YamlDriver extends AbstractFileDriver +{ + protected function loadMetadataFromFile(\ReflectionClass $class, $file) + { + $config = Yaml::parse(file_get_contents($file)); + + if ( ! isset($config[$name = $class->name])) { + throw new RuntimeException(sprintf('Expected metadata for class %s to be defined in %s.', $class->name, $file)); + } + + $config = $config[$name]; + $metadata = new ClassMetadata($name); + $metadata->fileResources[] = $file; + $metadata->fileResources[] = $class->getFileName(); + $exclusionPolicy = isset($config['exclusion_policy']) ? strtoupper($config['exclusion_policy']) : 'NONE'; + $excludeAll = isset($config['exclude']) ? (Boolean) $config['exclude'] : false; + $classAccessType = isset($config['access_type']) ? $config['access_type'] : PropertyMetadata::ACCESS_TYPE_PROPERTY; + $readOnlyClass = isset($config['read_only']) ? (Boolean) $config['read_only'] : false; + $this->addClassProperties($metadata, $config); + + $propertiesMetadata = array(); + if (array_key_exists('virtual_properties', $config)) { + foreach ($config['virtual_properties'] as $methodName => $propertySettings) { + if (isset($propertySettings['exp'])) { + $virtualPropertyMetadata = new ExpressionPropertyMetadata( $name, $methodName, $propertySettings['exp']); + unset($propertySettings['exp']); + + } else { + + if ( ! $class->hasMethod($methodName)) { + throw new RuntimeException('The method '.$methodName.' not found in class '.$class->name); + } + $virtualPropertyMetadata = new VirtualPropertyMetadata($name, $methodName); + } + $propertiesMetadata[$methodName] = $virtualPropertyMetadata; + $config['properties'][$methodName] = $propertySettings; + } + } + + if ( ! $excludeAll) { + foreach ($class->getProperties() as $property) { + if ($property->class !== $name || (isset($property->info) && $property->info['class'] !== $name)) { + continue; + } + + $pName = $property->getName(); + $propertiesMetadata[$pName] = new PropertyMetadata($name, $pName); + } + + foreach ($propertiesMetadata as $pName => $pMetadata) { + $isExclude = false; + $isExpose = $pMetadata instanceof VirtualPropertyMetadata + || $pMetadata instanceof ExpressionPropertyMetadata + || (isset($config['properties']) && array_key_exists($pName, $config['properties'])); + + if (isset($config['properties'][$pName])) { + $pConfig = $config['properties'][$pName]; + + if (isset($pConfig['exclude'])) { + $isExclude = (Boolean) $pConfig['exclude']; + } + + if (isset($pConfig['expose'])) { + $isExpose = (Boolean) $pConfig['expose']; + } + + if (isset($pConfig['skip_when_empty'])) { + $pMetadata->skipWhenEmpty = (Boolean) $pConfig['skip_when_empty']; + } + + if (isset($pConfig['since_version'])) { + $pMetadata->sinceVersion = (string) $pConfig['since_version']; + } + + if (isset($pConfig['until_version'])) { + $pMetadata->untilVersion = (string) $pConfig['until_version']; + } + + if (isset($pConfig['exclude_if'])) { + $pMetadata->excludeIf = (string) $pConfig['exclude_if']; + } + + if (isset($pConfig['expose_if'])) { + $pMetadata->excludeIf = "!(" . $pConfig['expose_if'].")"; + } + + if (isset($pConfig['serialized_name'])) { + $pMetadata->serializedName = (string) $pConfig['serialized_name']; + } + + if (isset($pConfig['type'])) { + $pMetadata->setType((string) $pConfig['type']); + } + + if (isset($pConfig['groups'])) { + $pMetadata->groups = $pConfig['groups']; + } + + if (isset($pConfig['xml_list'])) { + $pMetadata->xmlCollection = true; + + $colConfig = $pConfig['xml_list']; + if (isset($colConfig['inline'])) { + $pMetadata->xmlCollectionInline = (Boolean)$colConfig['inline']; + } + + if (isset($colConfig['entry_name'])) { + $pMetadata->xmlEntryName = (string)$colConfig['entry_name']; + } + + if (isset($colConfig['skip_when_empty'])) { + $pMetadata->xmlCollectionSkipWhenEmpty = (Boolean)$colConfig['skip_when_empty']; + } else { + $pMetadata->xmlCollectionSkipWhenEmpty = true; + } + + if (isset($colConfig['namespace'])) { + $pMetadata->xmlEntryNamespace = (string) $colConfig['namespace']; + } + } + + if (isset($pConfig['xml_map'])) { + $pMetadata->xmlCollection = true; + + $colConfig = $pConfig['xml_map']; + if (isset($colConfig['inline'])) { + $pMetadata->xmlCollectionInline = (Boolean) $colConfig['inline']; + } + + if (isset($colConfig['entry_name'])) { + $pMetadata->xmlEntryName = (string) $colConfig['entry_name']; + } + + if (isset($colConfig['namespace'])) { + $pMetadata->xmlEntryNamespace = (string) $colConfig['namespace']; + } + + if (isset($colConfig['key_attribute_name'])) { + $pMetadata->xmlKeyAttribute = $colConfig['key_attribute_name']; + } + + } + + if (isset($pConfig['xml_element'])) { + $colConfig = $pConfig['xml_element']; + if (isset($colConfig['cdata'])) { + $pMetadata->xmlElementCData = (Boolean) $colConfig['cdata']; + } + + if (isset($colConfig['namespace'])) { + $pMetadata->xmlNamespace = (string) $colConfig['namespace']; + } + } + + if (isset($pConfig['xml_attribute'])) { + $pMetadata->xmlAttribute = (Boolean) $pConfig['xml_attribute']; + } + + if (isset($pConfig['xml_attribute_map'])) { + $pMetadata->xmlAttributeMap = (Boolean) $pConfig['xml_attribute_map']; + } + + if (isset($pConfig['xml_value'])) { + $pMetadata->xmlValue = (Boolean) $pConfig['xml_value']; + } + + if (isset($pConfig['xml_key_value_pairs'])) { + $pMetadata->xmlKeyValuePairs = (Boolean) $pConfig['xml_key_value_pairs']; + } + + //we need read_only before setter and getter set, because that method depends on flag being set + if (isset($pConfig['read_only'])) { + $pMetadata->readOnly = (Boolean) $pConfig['read_only']; + } else { + $pMetadata->readOnly = $pMetadata->readOnly || $readOnlyClass; + } + + $pMetadata->setAccessor( + isset($pConfig['access_type']) ? $pConfig['access_type'] : $classAccessType, + isset($pConfig['accessor']['getter']) ? $pConfig['accessor']['getter'] : null, + isset($pConfig['accessor']['setter']) ? $pConfig['accessor']['setter'] : null + ); + + if (isset($pConfig['inline'])) { + $pMetadata->inline = (Boolean) $pConfig['inline']; + } + + if (isset($pConfig['max_depth'])) { + $pMetadata->maxDepth = (int) $pConfig['max_depth']; + } + } + if ((ExclusionPolicy::NONE === $exclusionPolicy && ! $isExclude) + || (ExclusionPolicy::ALL === $exclusionPolicy && $isExpose)) { + $metadata->addPropertyMetadata($pMetadata); + } + } + } + + if (isset($config['handler_callbacks'])) { + foreach ($config['handler_callbacks'] as $directionName => $formats) { + $direction = GraphNavigator::parseDirection($directionName); + foreach ($formats as $format => $methodName) { + $metadata->addHandlerCallback($direction, $format, $methodName); + } + } + } + + if (isset($config['callback_methods'])) { + $cConfig = $config['callback_methods']; + + if (isset($cConfig['pre_serialize'])) { + $metadata->preSerializeMethods = $this->getCallbackMetadata($class, $cConfig['pre_serialize']); + } + if (isset($cConfig['post_serialize'])) { + $metadata->postSerializeMethods = $this->getCallbackMetadata($class, $cConfig['post_serialize']); + } + if (isset($cConfig['post_deserialize'])) { + $metadata->postDeserializeMethods = $this->getCallbackMetadata($class, $cConfig['post_deserialize']); + } + } + + return $metadata; + } + + protected function getExtension() + { + return 'yml'; + } + + private function addClassProperties(ClassMetadata $metadata, array $config) + { + if (isset($config['custom_accessor_order']) && ! isset($config['accessor_order'])) { + $config['accessor_order'] = 'custom'; + } + + if (isset($config['accessor_order'])) { + $metadata->setAccessorOrder($config['accessor_order'], isset($config['custom_accessor_order']) ? $config['custom_accessor_order'] : array()); + } + + if (isset($config['xml_root_name'])) { + $metadata->xmlRootName = (string) $config['xml_root_name']; + } + + if (isset($config['xml_root_namespace'])) { + $metadata->xmlRootNamespace = (string) $config['xml_root_namespace']; + } + + if (array_key_exists('xml_namespaces', $config)) { + + foreach ($config['xml_namespaces'] as $prefix => $uri) { + $metadata->registerNamespace($uri, $prefix); + } + + } + + if (isset($config['discriminator'])) { + if (isset($config['discriminator']['disabled']) && true === $config['discriminator']['disabled']) { + $metadata->discriminatorDisabled = true; + } else { + if ( ! isset($config['discriminator']['field_name'])) { + throw new RuntimeException('The "field_name" attribute must be set for discriminators.'); + } + + if ( ! isset($config['discriminator']['map']) || ! is_array($config['discriminator']['map'])) { + throw new RuntimeException('The "map" attribute must be set, and be an array for discriminators.'); + } + $groups = isset($config['discriminator']['groups']) ? $config['discriminator']['groups'] : array(); + $metadata->setDiscriminator($config['discriminator']['field_name'], $config['discriminator']['map'], $groups); + + if (isset($config['discriminator']['xml_attribute'])) { + $metadata->xmlDiscriminatorAttribute = (bool) $config['discriminator']['xml_attribute']; + } + if (isset($config['discriminator']['xml_element'])) { + if (isset($config['discriminator']['xml_element']['cdata'])) { + $metadata->xmlDiscriminatorCData = (bool) $config['discriminator']['xml_element']['cdata']; + } + if (isset($config['discriminator']['xml_element']['namespace'])) { + $metadata->xmlDiscriminatorNamespace = (string) $config['discriminator']['xml_element']['namespace']; + } + } + + } + } + } + + private function getCallbackMetadata(\ReflectionClass $class, $config) + { + if (is_string($config)) { + $config = array($config); + } elseif ( ! is_array($config)) { + throw new RuntimeException(sprintf('callback methods expects a string, or an array of strings that represent method names, but got %s.', json_encode($config['pre_serialize']))); + } + + $methods = array(); + foreach ($config as $name) { + if ( ! $class->hasMethod($name)) { + throw new RuntimeException(sprintf('The method %s does not exist in class %s.', $name, $class->name)); + } + + $methods[] = new MethodMetadata($class->name, $name); + } + + return $methods; + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Metadata/ExpressionPropertyMetadata.php b/vendor/jms/serializer/src/JMS/Serializer/Metadata/ExpressionPropertyMetadata.php new file mode 100644 index 0000000000..47eee7eef9 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Metadata/ExpressionPropertyMetadata.php @@ -0,0 +1,127 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Metadata; + +use JMS\Serializer\Exception\ExpressionLanguageRequiredException; + +/** + * @Annotation + * @Target("METHOD") + * + * @author Asmir Mustafic + */ +class ExpressionPropertyMetadata extends PropertyMetadata +{ + /** + * @var string + */ + public $expression; + + public function __construct($class, $fieldName, $expression) + { + $this->class = $class; + $this->name = $fieldName; + $this->expression = $expression; + $this->readOnly = true; + } + + public function setAccessor($type, $getter = null, $setter = null) + { + } + + /** + * @param object $object + * @return mixed + */ + public function getValue($object) + { + throw new ExpressionLanguageRequiredException(sprintf('The property %s on %s requires the expression accessor strategy to be enabled.', $this->name, $this->class)); + } + + public function setValue($obj, $value) + { + throw new \LogicException('ExpressionPropertyMetadata is immutable.'); + } + + public function serialize() + { + return serialize(array( + $this->sinceVersion, + $this->untilVersion, + $this->groups, + $this->serializedName, + $this->type, + $this->xmlCollection, + $this->xmlCollectionInline, + $this->xmlEntryName, + $this->xmlKeyAttribute, + $this->xmlAttribute, + $this->xmlValue, + $this->xmlNamespace, + $this->xmlKeyValuePairs, + $this->xmlElementCData, + $this->xmlAttributeMap, + $this->maxDepth, + $this->getter, + $this->setter, + $this->inline, + $this->readOnly, + $this->class, + $this->name, + 'excludeIf' => $this->excludeIf, + 'expression' => $this->expression, + )); + } + + public function unserialize($str) + { + $unserialized = unserialize($str); + list( + $this->sinceVersion, + $this->untilVersion, + $this->groups, + $this->serializedName, + $this->type, + $this->xmlCollection, + $this->xmlCollectionInline, + $this->xmlEntryName, + $this->xmlKeyAttribute, + $this->xmlAttribute, + $this->xmlValue, + $this->xmlNamespace, + $this->xmlKeyValuePairs, + $this->xmlElementCData, + $this->xmlAttributeMap, + $this->maxDepth, + $this->getter, + $this->setter, + $this->inline, + $this->readOnly, + $this->class, + $this->name + ) = $unserialized; + + if (isset($unserialized['excludeIf'])){ + $this->excludeIf = $unserialized['excludeIf']; + } + if (isset($unserialized['expression'])){ + $this->expression = $unserialized['expression']; + } + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Metadata/PropertyMetadata.php b/vendor/jms/serializer/src/JMS/Serializer/Metadata/PropertyMetadata.php new file mode 100644 index 0000000000..e57b28bebb --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Metadata/PropertyMetadata.php @@ -0,0 +1,188 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Metadata; + +use JMS\Serializer\TypeParser; +use Metadata\PropertyMetadata as BasePropertyMetadata; +use JMS\Serializer\Exception\RuntimeException; + +class PropertyMetadata extends BasePropertyMetadata +{ + const ACCESS_TYPE_PROPERTY = 'property'; + const ACCESS_TYPE_PUBLIC_METHOD = 'public_method'; + + public $sinceVersion; + public $untilVersion; + public $groups; + public $serializedName; + public $type; + public $xmlCollection = false; + public $xmlCollectionInline = false; + public $xmlCollectionSkipWhenEmpty = true; + public $xmlEntryName; + public $xmlEntryNamespace; + public $xmlKeyAttribute; + public $xmlAttribute = false; + public $xmlValue = false; + public $xmlNamespace; + public $xmlKeyValuePairs = false; + public $xmlElementCData = true; + public $getter; + public $setter; + public $inline = false; + public $skipWhenEmpty = false; + public $readOnly = false; + public $xmlAttributeMap = false; + public $maxDepth = null; + public $excludeIf = null; + + private static $typeParser; + + public function setAccessor($type, $getter = null, $setter = null) + { + if (self::ACCESS_TYPE_PUBLIC_METHOD === $type) { + $class = $this->reflection->getDeclaringClass(); + + if (empty($getter)) { + if ($class->hasMethod('get'.$this->name) && $class->getMethod('get'.$this->name)->isPublic()) { + $getter = 'get'.$this->name; + } elseif ($class->hasMethod('is'.$this->name) && $class->getMethod('is'.$this->name)->isPublic()) { + $getter = 'is'.$this->name; + } elseif ($class->hasMethod('has'.$this->name) && $class->getMethod('has'.$this->name)->isPublic()) { + $getter = 'has'.$this->name; + } else { + throw new RuntimeException(sprintf('There is neither a public %s method, nor a public %s method, nor a public %s method in class %s. Please specify which public method should be used for retrieving the value of the property %s.', 'get'.ucfirst($this->name), 'is'.ucfirst($this->name), 'has'.ucfirst($this->name), $this->class, $this->name)); + } + } + + if (empty($setter) && ! $this->readOnly) { + if ($class->hasMethod('set'.$this->name) && $class->getMethod('set'.$this->name)->isPublic()) { + $setter = 'set'.$this->name; + } else { + throw new RuntimeException(sprintf('There is no public %s method in class %s. Please specify which public method should be used for setting the value of the property %s.', 'set'.ucfirst($this->name), $this->class, $this->name)); + } + } + } + + $this->getter = $getter; + $this->setter = $setter; + } + + public function getValue($obj) + { + if (null === $this->getter) { + return parent::getValue($obj); + } + + return $obj->{$this->getter}(); + } + + public function setValue($obj, $value) + { + if (null === $this->setter) { + parent::setValue($obj, $value); + return; + } + + $obj->{$this->setter}($value); + } + + public function setType($type) + { + if (null === self::$typeParser) { + self::$typeParser = new TypeParser(); + } + + $this->type = self::$typeParser->parse($type); + } + + public function serialize() + { + return serialize(array( + $this->sinceVersion, + $this->untilVersion, + $this->groups, + $this->serializedName, + $this->type, + $this->xmlCollection, + $this->xmlCollectionInline, + $this->xmlEntryName, + $this->xmlKeyAttribute, + $this->xmlAttribute, + $this->xmlValue, + $this->xmlNamespace, + $this->xmlKeyValuePairs, + $this->xmlElementCData, + $this->getter, + $this->setter, + $this->inline, + $this->readOnly, + $this->xmlAttributeMap, + $this->maxDepth, + parent::serialize(), + 'xmlEntryNamespace' => $this->xmlEntryNamespace, + 'xmlCollectionSkipWhenEmpty' => $this->xmlCollectionSkipWhenEmpty, + 'excludeIf' => $this->excludeIf, + 'skipWhenEmpty' => $this->skipWhenEmpty, + )); + } + + public function unserialize($str) + { + $unserialized = unserialize($str); + list( + $this->sinceVersion, + $this->untilVersion, + $this->groups, + $this->serializedName, + $this->type, + $this->xmlCollection, + $this->xmlCollectionInline, + $this->xmlEntryName, + $this->xmlKeyAttribute, + $this->xmlAttribute, + $this->xmlValue, + $this->xmlNamespace, + $this->xmlKeyValuePairs, + $this->xmlElementCData, + $this->getter, + $this->setter, + $this->inline, + $this->readOnly, + $this->xmlAttributeMap, + $this->maxDepth, + $parentStr + ) = $unserialized; + + if (isset($unserialized['xmlEntryNamespace'])){ + $this->xmlEntryNamespace = $unserialized['xmlEntryNamespace']; + } + if (isset($unserialized['xmlCollectionSkipWhenEmpty'])){ + $this->xmlCollectionSkipWhenEmpty = $unserialized['xmlCollectionSkipWhenEmpty']; + } + if (isset($unserialized['excludeIf'])){ + $this->excludeIf = $unserialized['excludeIf']; + } + if (isset($unserialized['skipWhenEmpty'])){ + $this->skipWhenEmpty = $unserialized['skipWhenEmpty']; + } + + parent::unserialize($parentStr); + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Metadata/StaticPropertyMetadata.php b/vendor/jms/serializer/src/JMS/Serializer/Metadata/StaticPropertyMetadata.php new file mode 100644 index 0000000000..160e6c7367 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Metadata/StaticPropertyMetadata.php @@ -0,0 +1,101 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Metadata; + +class StaticPropertyMetadata extends PropertyMetadata +{ + private $value; + + public function __construct($className, $fieldName, $fieldValue, array $groups = array()) + { + $this->class = $className; + $this->name = $fieldName; + $this->value = $fieldValue; + $this->readOnly = true; + $this->groups = $groups; + } + + public function getValue($obj) + { + return $this->value; + } + + public function setValue($obj, $value) + { + throw new \LogicException('StaticPropertyMetadata is immutable.'); + } + + public function setAccessor($type, $getter = null, $setter = null) + { + } + + public function serialize() + { + return serialize(array( + $this->sinceVersion, + $this->untilVersion, + $this->groups, + $this->serializedName, + $this->type, + $this->xmlCollection, + $this->xmlCollectionInline, + $this->xmlEntryName, + $this->xmlKeyAttribute, + $this->xmlAttribute, + $this->xmlValue, + $this->xmlNamespace, + $this->xmlKeyValuePairs, + $this->xmlElementCData, + $this->getter, + $this->setter, + $this->inline, + $this->readOnly, + $this->class, + $this->name, + $this->value + )); + } + + public function unserialize($str) + { + list( + $this->sinceVersion, + $this->untilVersion, + $this->groups, + $this->serializedName, + $this->type, + $this->xmlCollection, + $this->xmlCollectionInline, + $this->xmlEntryName, + $this->xmlKeyAttribute, + $this->xmlAttribute, + $this->xmlValue, + $this->xmlNamespace, + $this->xmlKeyValuePairs, + $this->xmlElementCData, + $this->getter, + $this->setter, + $this->inline, + $this->readOnly, + $this->class, + $this->name, + $this->value + ) = unserialize($str); + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Metadata/VirtualPropertyMetadata.php b/vendor/jms/serializer/src/JMS/Serializer/Metadata/VirtualPropertyMetadata.php new file mode 100644 index 0000000000..e0bec4060e --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Metadata/VirtualPropertyMetadata.php @@ -0,0 +1,107 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Metadata; + +class VirtualPropertyMetadata extends PropertyMetadata +{ + public function __construct($class, $methodName) + { + if (0 === strpos($methodName, 'get')) { + $fieldName = lcfirst(substr($methodName, 3)); + } else { + $fieldName = $methodName; + } + + $this->class = $class; + $this->name = $fieldName; + $this->getter = $methodName; + $this->readOnly = true; + } + + public function setValue($obj, $value) + { + throw new \LogicException('VirtualPropertyMetadata is immutable.'); + } + + public function setAccessor($type, $getter = null, $setter = null) + { + } + + public function serialize() + { + return serialize(array( + $this->sinceVersion, + $this->untilVersion, + $this->groups, + $this->serializedName, + $this->type, + $this->xmlCollection, + $this->xmlCollectionInline, + $this->xmlEntryName, + $this->xmlKeyAttribute, + $this->xmlAttribute, + $this->xmlValue, + $this->xmlNamespace, + $this->xmlKeyValuePairs, + $this->xmlElementCData, + $this->xmlAttributeMap, + $this->maxDepth, + $this->getter, + $this->setter, + $this->inline, + $this->readOnly, + $this->class, + $this->name, + 'excludeIf' => $this->excludeIf, + )); + } + + public function unserialize($str) + { + $unserialized = unserialize($str); + list( + $this->sinceVersion, + $this->untilVersion, + $this->groups, + $this->serializedName, + $this->type, + $this->xmlCollection, + $this->xmlCollectionInline, + $this->xmlEntryName, + $this->xmlKeyAttribute, + $this->xmlAttribute, + $this->xmlValue, + $this->xmlNamespace, + $this->xmlKeyValuePairs, + $this->xmlElementCData, + $this->xmlAttributeMap, + $this->maxDepth, + $this->getter, + $this->setter, + $this->inline, + $this->readOnly, + $this->class, + $this->name + ) = $unserialized; + + if (isset($unserialized['excludeIf'])){ + $this->excludeIf = $unserialized['excludeIf']; + } + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Naming/CacheNamingStrategy.php b/vendor/jms/serializer/src/JMS/Serializer/Naming/CacheNamingStrategy.php new file mode 100644 index 0000000000..cb3d31bded --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Naming/CacheNamingStrategy.php @@ -0,0 +1,42 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Naming; + +use JMS\Serializer\Metadata\PropertyMetadata; + +class CacheNamingStrategy implements PropertyNamingStrategyInterface +{ + private $delegate; + private $cache; + + public function __construct(PropertyNamingStrategyInterface $delegate) + { + $this->delegate = $delegate; + $this->cache = new \SplObjectStorage(); + } + + public function translateName(PropertyMetadata $property) + { + if (isset($this->cache[$property])) { + return $this->cache[$property]; + } + + return $this->cache[$property] = $this->delegate->translateName($property); + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Naming/CamelCaseNamingStrategy.php b/vendor/jms/serializer/src/JMS/Serializer/Naming/CamelCaseNamingStrategy.php new file mode 100644 index 0000000000..7ad1c50dce --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Naming/CamelCaseNamingStrategy.php @@ -0,0 +1,52 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Naming; + +use JMS\Serializer\Metadata\PropertyMetadata; + +/** + * Generic naming strategy which translates a camel-cased property name. + * + * @author Johannes M. Schmitt + */ +class CamelCaseNamingStrategy implements PropertyNamingStrategyInterface +{ + private $separator; + private $lowerCase; + + public function __construct($separator = '_', $lowerCase = true) + { + $this->separator = $separator; + $this->lowerCase = $lowerCase; + } + + /** + * {@inheritDoc} + */ + public function translateName(PropertyMetadata $property) + { + $name = preg_replace('/[A-Z]/', $this->separator.'\\0', $property->name); + + if ($this->lowerCase) { + return strtolower($name); + } + + return ucfirst($name); + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Naming/IdenticalPropertyNamingStrategy.php b/vendor/jms/serializer/src/JMS/Serializer/Naming/IdenticalPropertyNamingStrategy.php new file mode 100644 index 0000000000..555ed36205 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Naming/IdenticalPropertyNamingStrategy.php @@ -0,0 +1,30 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Naming; + +use JMS\Serializer\Naming\PropertyNamingStrategyInterface; +use JMS\Serializer\Metadata\PropertyMetadata; + +class IdenticalPropertyNamingStrategy implements PropertyNamingStrategyInterface +{ + public function translateName(PropertyMetadata $property) + { + return $property->name; + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Naming/PropertyNamingStrategyInterface.php b/vendor/jms/serializer/src/JMS/Serializer/Naming/PropertyNamingStrategyInterface.php new file mode 100644 index 0000000000..6d764cb60a --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Naming/PropertyNamingStrategyInterface.php @@ -0,0 +1,41 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Naming; + +use JMS\Serializer\Metadata\PropertyMetadata; + +/** + * Interface for property naming strategies. + * + * Implementations translate the property name to a serialized name that is + * displayed. + * + * @author Johannes M. Schmitt + */ +interface PropertyNamingStrategyInterface +{ + /** + * Translates the name of the property to the serialized version. + * + * @param PropertyMetadata $property + * + * @return string + */ + public function translateName(PropertyMetadata $property); +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Naming/SerializedNameAnnotationStrategy.php b/vendor/jms/serializer/src/JMS/Serializer/Naming/SerializedNameAnnotationStrategy.php new file mode 100644 index 0000000000..e30060ce5b --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Naming/SerializedNameAnnotationStrategy.php @@ -0,0 +1,48 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Naming; + +use JMS\Serializer\Metadata\PropertyMetadata; + +/** + * Naming strategy which uses an annotation to translate the property name. + * + * @author Johannes M. Schmitt + */ +class SerializedNameAnnotationStrategy implements PropertyNamingStrategyInterface +{ + private $delegate; + + public function __construct(PropertyNamingStrategyInterface $namingStrategy) + { + $this->delegate = $namingStrategy; + } + + /** + * {@inheritDoc} + */ + public function translateName(PropertyMetadata $property) + { + if (null !== $name = $property->serializedName) { + return $name; + } + + return $this->delegate->translateName($property); + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/SerializationContext.php b/vendor/jms/serializer/src/JMS/Serializer/SerializationContext.php new file mode 100644 index 0000000000..28823bceee --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/SerializationContext.php @@ -0,0 +1,144 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer; + +use JMS\Serializer\Exception\LogicException; +use JMS\Serializer\Exception\RuntimeException; +use Metadata\MetadataFactoryInterface; + +class SerializationContext extends Context +{ + /** @var \SplObjectStorage */ + private $visitingSet; + + /** @var \SplStack */ + private $visitingStack; + + /** + * @var string + */ + private $initialType; + + public static function create() + { + return new self(); + } + + /** + * @param string $format + */ + public function initialize($format, VisitorInterface $visitor, GraphNavigator $navigator, MetadataFactoryInterface $factory) + { + parent::initialize($format, $visitor, $navigator, $factory); + + $this->visitingSet = new \SplObjectStorage(); + $this->visitingStack = new \SplStack(); + } + + public function startVisiting($object) + { + if ( ! is_object($object)) { + return; + } + $this->visitingSet->attach($object); + $this->visitingStack->push($object); + } + + public function stopVisiting($object) + { + if ( ! is_object($object)) { + return; + } + $this->visitingSet->detach($object); + $poppedObject = $this->visitingStack->pop(); + + if ($object !== $poppedObject) { + throw new RuntimeException('Context visitingStack not working well'); + } + } + + public function isVisiting($object) + { + if ( ! is_object($object)) { + return false; + } + + return $this->visitingSet->contains($object); + } + + public function getPath() + { + $path = array(); + foreach ($this->visitingStack as $obj) { + $path[] = get_class($obj); + } + + if ( ! $path) { + return null; + } + + return implode(' -> ', $path); + } + + public function getDirection() + { + return GraphNavigator::DIRECTION_SERIALIZATION; + } + + public function getDepth() + { + return $this->visitingStack->count(); + } + + public function getObject() + { + return ! $this->visitingStack->isEmpty() ? $this->visitingStack->top() : null; + } + + public function getVisitingStack() + { + return $this->visitingStack; + } + + public function getVisitingSet() + { + return $this->visitingSet; + } + + /** + * @param string $type + * @return $this + */ + public function setInitialType($type) + { + $this->initialType = $type; + $this->attributes->set('initial_type', $type); + return $this; + } + + /** + * @return string|null + */ + public function getInitialType() + { + return $this->initialType + ? $this->initialType + : $this->attributes->containsKey('initial_type') ? $this->attributes->get('initial_type')->get() : null; + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Serializer.php b/vendor/jms/serializer/src/JMS/Serializer/Serializer.php new file mode 100644 index 0000000000..ae15510928 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Serializer.php @@ -0,0 +1,255 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer; + +use JMS\Serializer\Construction\ObjectConstructorInterface; +use JMS\Serializer\Exception\RuntimeException; +use JMS\Serializer\Handler\HandlerRegistryInterface; +use JMS\Serializer\EventDispatcher\EventDispatcherInterface; +use JMS\Serializer\Exception\UnsupportedFormatException; +use JMS\Serializer\ContextFactory\SerializationContextFactoryInterface; +use JMS\Serializer\ContextFactory\DeserializationContextFactoryInterface; +use JMS\Serializer\ContextFactory\DefaultSerializationContextFactory; +use JMS\Serializer\ContextFactory\DefaultDeserializationContextFactory; +use Metadata\MetadataFactoryInterface; +use PhpCollection\MapInterface; +use JMS\Serializer\Expression\ExpressionEvaluatorInterface; + +/** + * Serializer Implementation. + * + * @author Johannes M. Schmitt + */ +class Serializer implements SerializerInterface, ArrayTransformerInterface +{ + private $factory; + private $handlerRegistry; + private $objectConstructor; + private $dispatcher; + private $typeParser; + + /** @var \PhpCollection\MapInterface */ + private $serializationVisitors; + + /** @var \PhpCollection\MapInterface */ + private $deserializationVisitors; + + private $navigator; + + /** + * @var SerializationContextFactoryInterface + */ + private $serializationContextFactory; + + /** + * @var DeserializationContextFactoryInterface + */ + private $deserializationContextFactory; + + /** + * Constructor. + * + * @param \Metadata\MetadataFactoryInterface $factory + * @param Handler\HandlerRegistryInterface $handlerRegistry + * @param Construction\ObjectConstructorInterface $objectConstructor + * @param \PhpCollection\MapInterface $serializationVisitors of VisitorInterface + * @param \PhpCollection\MapInterface $deserializationVisitors of VisitorInterface + * @param EventDispatcher\EventDispatcherInterface $dispatcher + * @param TypeParser $typeParser + * @param ExpressionEvaluatorInterface|null $expressionEvaluator + */ + public function __construct( + MetadataFactoryInterface $factory, + HandlerRegistryInterface $handlerRegistry, + ObjectConstructorInterface $objectConstructor, + MapInterface $serializationVisitors, + MapInterface $deserializationVisitors, + EventDispatcherInterface $dispatcher = null, + TypeParser $typeParser = null, + ExpressionEvaluatorInterface $expressionEvaluator = null + ) + { + $this->factory = $factory; + $this->handlerRegistry = $handlerRegistry; + $this->objectConstructor = $objectConstructor; + $this->dispatcher = $dispatcher; + $this->typeParser = $typeParser ?: new TypeParser(); + $this->serializationVisitors = $serializationVisitors; + $this->deserializationVisitors = $deserializationVisitors; + + $this->navigator = new GraphNavigator($this->factory, $this->handlerRegistry, $this->objectConstructor, $this->dispatcher, $expressionEvaluator); + + $this->serializationContextFactory = new DefaultSerializationContextFactory(); + $this->deserializationContextFactory = new DefaultDeserializationContextFactory(); + } + + public function serialize($data, $format, SerializationContext $context = null) + { + if (null === $context) { + $context = $this->serializationContextFactory->createSerializationContext(); + } + + return $this->serializationVisitors->get($format) + ->map(function(VisitorInterface $visitor) use ($context, $data, $format) { + $type = $context->getInitialType() !== null ? $this->typeParser->parse($context->getInitialType()) : null; + + $this->visit($visitor, $context, $visitor->prepare($data), $format, $type); + + return $visitor->getResult(); + }) + ->getOrThrow(new UnsupportedFormatException(sprintf('The format "%s" is not supported for serialization.', $format))) + ; + } + + public function deserialize($data, $type, $format, DeserializationContext $context = null) + { + if (null === $context) { + $context = $this->deserializationContextFactory->createDeserializationContext(); + } + + return $this->deserializationVisitors->get($format) + ->map(function(VisitorInterface $visitor) use ($context, $data, $format, $type) { + $preparedData = $visitor->prepare($data); + $navigatorResult = $this->visit($visitor, $context, $preparedData, $format, $this->typeParser->parse($type)); + + return $this->handleDeserializeResult($visitor->getResult(), $navigatorResult); + }) + ->getOrThrow(new UnsupportedFormatException(sprintf('The format "%s" is not supported for deserialization.', $format))) + ; + } + + /** + * {@InheritDoc} + */ + public function toArray($data, SerializationContext $context = null) + { + if (null === $context) { + $context = $this->serializationContextFactory->createSerializationContext(); + } + + return $this->serializationVisitors->get('json') + ->map(function(JsonSerializationVisitor $visitor) use ($context, $data) { + $type = $context->getInitialType() !== null ? $this->typeParser->parse($context->getInitialType()) : null; + + $this->visit($visitor, $context, $data, 'json', $type); + $result = $this->convertArrayObjects($visitor->getRoot()); + + if ( ! is_array($result)) { + throw new RuntimeException(sprintf( + 'The input data of type "%s" did not convert to an array, but got a result of type "%s".', + is_object($data) ? get_class($data) : gettype($data), + is_object($result) ? get_class($result) : gettype($result) + )); + } + + return $result; + }) + ->get() + ; + } + + /** + * {@InheritDoc} + */ + public function fromArray(array $data, $type, DeserializationContext $context = null) + { + if (null === $context) { + $context = $this->deserializationContextFactory->createDeserializationContext(); + } + + return $this->deserializationVisitors->get('json') + ->map(function(JsonDeserializationVisitor $visitor) use ($data, $type, $context) { + $navigatorResult = $this->visit($visitor, $context, $data, 'json', $this->typeParser->parse($type)); + + return $this->handleDeserializeResult($visitor->getResult(), $navigatorResult); + }) + ->get() + ; + } + + private function visit(VisitorInterface $visitor, Context $context, $data, $format, array $type = null) + { + $context->initialize( + $format, + $visitor, + $this->navigator, + $this->factory + ); + + $visitor->setNavigator($this->navigator); + + return $this->navigator->accept($data, $type, $context); + } + + private function handleDeserializeResult($visitorResult, $navigatorResult) + { + // This is a special case if the root is handled by a callback on the object itself. + if (null === $visitorResult && null !== $navigatorResult) { + return $navigatorResult; + } + + return $visitorResult; + } + + private function convertArrayObjects($data) + { + if ($data instanceof \ArrayObject || $data instanceof \stdClass) { + $data = (array) $data; + } + if (is_array($data)) { + foreach ($data as $k => $v) { + $data[$k] = $this->convertArrayObjects($v); + } + } + + return $data; + } + + /** + * @return MetadataFactoryInterface + */ + public function getMetadataFactory() + { + return $this->factory; + } + + /** + * @param SerializationContextFactoryInterface $serializationContextFactory + * + * @return self + */ + public function setSerializationContextFactory(SerializationContextFactoryInterface $serializationContextFactory) + { + $this->serializationContextFactory = $serializationContextFactory; + + return $this; + } + + /** + * @param DeserializationContextFactoryInterface $deserializationContextFactory + * + * @return self + */ + public function setDeserializationContextFactory(DeserializationContextFactoryInterface $deserializationContextFactory) + { + $this->deserializationContextFactory = $deserializationContextFactory; + + return $this; + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/SerializerBuilder.php b/vendor/jms/serializer/src/JMS/Serializer/SerializerBuilder.php new file mode 100644 index 0000000000..2f4f301592 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/SerializerBuilder.php @@ -0,0 +1,500 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer; + +use Doctrine\Common\Annotations\CachedReader; +use Doctrine\Common\Cache\FilesystemCache; +use JMS\Serializer\Accessor\AccessorStrategyInterface; +use JMS\Serializer\Accessor\DefaultAccessorStrategy; +use JMS\Serializer\Accessor\ExpressionAccessorStrategy; +use JMS\Serializer\Builder\DefaultDriverFactory; +use JMS\Serializer\Builder\DriverFactoryInterface; +use JMS\Serializer\Handler\PhpCollectionHandler; +use JMS\Serializer\Handler\PropelCollectionHandler; +use JMS\Serializer\Exception\RuntimeException; +use JMS\Serializer\Handler\StdClassHandler; +use Metadata\Driver\DriverInterface; +use Metadata\MetadataFactory; +use JMS\Serializer\Metadata\Driver\AnnotationDriver; +use JMS\Serializer\Handler\HandlerRegistry; +use JMS\Serializer\Construction\UnserializeObjectConstructor; +use PhpCollection\Map; +use JMS\Serializer\EventDispatcher\EventDispatcher; +use Metadata\Driver\DriverChain; +use JMS\Serializer\Metadata\Driver\YamlDriver; +use JMS\Serializer\Metadata\Driver\XmlDriver; +use Metadata\Driver\FileLocator; +use JMS\Serializer\Handler\DateHandler; +use JMS\Serializer\Handler\ArrayCollectionHandler; +use JMS\Serializer\Construction\ObjectConstructorInterface; +use JMS\Serializer\EventDispatcher\Subscriber\DoctrineProxySubscriber; +use JMS\Serializer\Naming\CamelCaseNamingStrategy; +use JMS\Serializer\Naming\PropertyNamingStrategyInterface; +use JMS\Serializer\ContextFactory\SerializationContextFactoryInterface; +use JMS\Serializer\ContextFactory\DeserializationContextFactoryInterface; +use JMS\Serializer\ContextFactory\CallableSerializationContextFactory; +use JMS\Serializer\ContextFactory\CallableDeserializationContextFactory; +use Doctrine\Common\Annotations\Reader; +use Doctrine\Common\Annotations\AnnotationReader; +use Metadata\Cache\FileCache; +use JMS\Serializer\Naming\SerializedNameAnnotationStrategy; +use JMS\Serializer\Exception\InvalidArgumentException; +use JMS\Serializer\Expression\ExpressionEvaluatorInterface; + +/** + * Builder for serializer instances. + * + * This object makes serializer construction a breeze for projects that do not use + * any special dependency injection container. + * + * @author Johannes M. Schmitt + */ +class SerializerBuilder +{ + private $metadataDirs = array(); + private $handlerRegistry; + private $handlersConfigured = false; + private $eventDispatcher; + private $listenersConfigured = false; + private $objectConstructor; + private $serializationVisitors; + private $deserializationVisitors; + private $visitorsAdded = false; + private $propertyNamingStrategy; + private $debug = false; + private $cacheDir; + private $annotationReader; + private $includeInterfaceMetadata = false; + private $driverFactory; + private $serializationContextFactory; + private $deserializationContextFactory; + + /** + * @var ExpressionEvaluatorInterface + */ + private $expressionEvaluator; + + /** + * @var AccessorStrategyInterface + */ + private $accessorStrategy; + + public static function create() + { + return new static(); + } + + public function __construct() + { + $this->handlerRegistry = new HandlerRegistry(); + $this->eventDispatcher = new EventDispatcher(); + $this->driverFactory = new DefaultDriverFactory(); + $this->serializationVisitors = new Map(); + $this->deserializationVisitors = new Map(); + } + + public function setAccessorStrategy(AccessorStrategyInterface $accessorStrategy) + { + $this->accessorStrategy = $accessorStrategy; + } + + protected function getAccessorStrategy() + { + if (!$this->accessorStrategy) { + $this->accessorStrategy = new DefaultAccessorStrategy(); + + if ($this->expressionEvaluator) { + $this->accessorStrategy = new ExpressionAccessorStrategy($this->expressionEvaluator, $this->accessorStrategy); + } + } + return $this->accessorStrategy; + } + + public function setExpressionEvaluator(ExpressionEvaluatorInterface $expressionEvaluator) + { + $this->expressionEvaluator = $expressionEvaluator; + + return $this; + } + + public function setAnnotationReader(Reader $reader) + { + $this->annotationReader = $reader; + + return $this; + } + + public function setDebug($bool) + { + $this->debug = (boolean) $bool; + + return $this; + } + + public function setCacheDir($dir) + { + if ( ! is_dir($dir)) { + $this->createDir($dir); + } + if ( ! is_writable($dir)) { + throw new InvalidArgumentException(sprintf('The cache directory "%s" is not writable.', $dir)); + } + + $this->cacheDir = $dir; + + return $this; + } + + public function addDefaultHandlers() + { + $this->handlersConfigured = true; + $this->handlerRegistry->registerSubscribingHandler(new DateHandler()); + $this->handlerRegistry->registerSubscribingHandler(new StdClassHandler()); + $this->handlerRegistry->registerSubscribingHandler(new PhpCollectionHandler()); + $this->handlerRegistry->registerSubscribingHandler(new ArrayCollectionHandler()); + $this->handlerRegistry->registerSubscribingHandler(new PropelCollectionHandler()); + + return $this; + } + + public function configureHandlers(\Closure $closure) + { + $this->handlersConfigured = true; + $closure($this->handlerRegistry); + + return $this; + } + + public function addDefaultListeners() + { + $this->listenersConfigured = true; + $this->eventDispatcher->addSubscriber(new DoctrineProxySubscriber()); + + return $this; + } + + public function configureListeners(\Closure $closure) + { + $this->listenersConfigured = true; + $closure($this->eventDispatcher); + + return $this; + } + + public function setObjectConstructor(ObjectConstructorInterface $constructor) + { + $this->objectConstructor = $constructor; + + return $this; + } + + public function setPropertyNamingStrategy(PropertyNamingStrategyInterface $propertyNamingStrategy) + { + $this->propertyNamingStrategy = $propertyNamingStrategy; + + return $this; + } + + public function setSerializationVisitor($format, VisitorInterface $visitor) + { + $this->visitorsAdded = true; + $this->serializationVisitors->set($format, $visitor); + + return $this; + } + + public function setDeserializationVisitor($format, VisitorInterface $visitor) + { + $this->visitorsAdded = true; + $this->deserializationVisitors->set($format, $visitor); + + return $this; + } + + public function addDefaultSerializationVisitors() + { + $this->initializePropertyNamingStrategy(); + + $this->visitorsAdded = true; + $this->serializationVisitors->setAll(array( + 'xml' => new XmlSerializationVisitor($this->propertyNamingStrategy, $this->getAccessorStrategy()), + 'yml' => new YamlSerializationVisitor($this->propertyNamingStrategy, $this->getAccessorStrategy()), + 'json' => new JsonSerializationVisitor($this->propertyNamingStrategy, $this->getAccessorStrategy()), + )); + + return $this; + } + + public function addDefaultDeserializationVisitors() + { + $this->initializePropertyNamingStrategy(); + + $this->visitorsAdded = true; + $this->deserializationVisitors->setAll(array( + 'xml' => new XmlDeserializationVisitor($this->propertyNamingStrategy), + 'json' => new JsonDeserializationVisitor($this->propertyNamingStrategy), + )); + + return $this; + } + + /** + * @param Boolean $include Whether to include the metadata from the interfaces + * + * @return SerializerBuilder + */ + public function includeInterfaceMetadata($include) + { + $this->includeInterfaceMetadata = (Boolean) $include; + + return $this; + } + + /** + * Sets a map of namespace prefixes to directories. + * + * This method overrides any previously defined directories. + * + * @param array $namespacePrefixToDirMap + * + * @return SerializerBuilder + * + * @throws InvalidArgumentException When a directory does not exist + */ + public function setMetadataDirs(array $namespacePrefixToDirMap) + { + foreach ($namespacePrefixToDirMap as $dir) { + if ( ! is_dir($dir)) { + throw new InvalidArgumentException(sprintf('The directory "%s" does not exist.', $dir)); + } + } + + $this->metadataDirs = $namespacePrefixToDirMap; + + return $this; + } + + /** + * Adds a directory where the serializer will look for class metadata. + * + * The namespace prefix will make the names of the actual metadata files a bit shorter. For example, let's assume + * that you have a directory where you only store metadata files for the ``MyApplication\Entity`` namespace. + * + * If you use an empty prefix, your metadata files would need to look like: + * + * ``my-dir/MyApplication.Entity.SomeObject.yml`` + * ``my-dir/MyApplication.Entity.OtherObject.xml`` + * + * If you use ``MyApplication\Entity`` as prefix, your metadata files would need to look like: + * + * ``my-dir/SomeObject.yml`` + * ``my-dir/OtherObject.yml`` + * + * Please keep in mind that you currently may only have one directory per namespace prefix. + * + * @param string $dir The directory where metadata files are located. + * @param string $namespacePrefix An optional prefix if you only store metadata for specific namespaces in this directory. + * + * @return SerializerBuilder + * + * @throws InvalidArgumentException When a directory does not exist + * @throws InvalidArgumentException When a directory has already been registered + */ + public function addMetadataDir($dir, $namespacePrefix = '') + { + if ( ! is_dir($dir)) { + throw new InvalidArgumentException(sprintf('The directory "%s" does not exist.', $dir)); + } + + if (isset($this->metadataDirs[$namespacePrefix])) { + throw new InvalidArgumentException(sprintf('There is already a directory configured for the namespace prefix "%s". Please use replaceMetadataDir() to override directories.', $namespacePrefix)); + } + + $this->metadataDirs[$namespacePrefix] = $dir; + + return $this; + } + + /** + * Adds a map of namespace prefixes to directories. + * + * @param array $namespacePrefixToDirMap + * + * @return SerializerBuilder + */ + public function addMetadataDirs(array $namespacePrefixToDirMap) + { + foreach ($namespacePrefixToDirMap as $prefix => $dir) { + $this->addMetadataDir($dir, $prefix); + } + + return $this; + } + + /** + * Similar to addMetadataDir(), but overrides an existing entry. + * + * @param string $dir + * @param string $namespacePrefix + * + * @return SerializerBuilder + * + * @throws InvalidArgumentException When a directory does not exist + * @throws InvalidArgumentException When no directory is configured for the ns prefix + */ + public function replaceMetadataDir($dir, $namespacePrefix = '') + { + if ( ! is_dir($dir)) { + throw new InvalidArgumentException(sprintf('The directory "%s" does not exist.', $dir)); + } + + if ( ! isset($this->metadataDirs[$namespacePrefix])) { + throw new InvalidArgumentException(sprintf('There is no directory configured for namespace prefix "%s". Please use addMetadataDir() for adding new directories.', $namespacePrefix)); + } + + $this->metadataDirs[$namespacePrefix] = $dir; + + return $this; + } + + public function setMetadataDriverFactory(DriverFactoryInterface $driverFactory) + { + $this->driverFactory = $driverFactory; + + return $this; + } + + /** + * @param SerializationContextFactoryInterface|callable $serializationContextFactory + * + * @return self + */ + public function setSerializationContextFactory($serializationContextFactory) + { + if ($serializationContextFactory instanceof SerializationContextFactoryInterface) { + $this->serializationContextFactory = $serializationContextFactory; + } elseif (is_callable($serializationContextFactory)) { + $this->serializationContextFactory = new CallableSerializationContextFactory( + $serializationContextFactory + ); + } else { + throw new InvalidArgumentException('expected SerializationContextFactoryInterface or callable.'); + } + + return $this; + } + + /** + * @param DeserializationContextFactoryInterface|callable $deserializationContextFactory + * + * @return self + */ + public function setDeserializationContextFactory($deserializationContextFactory) + { + if ($deserializationContextFactory instanceof DeserializationContextFactoryInterface) { + $this->deserializationContextFactory = $deserializationContextFactory; + } elseif (is_callable($deserializationContextFactory)) { + $this->deserializationContextFactory = new CallableDeserializationContextFactory( + $deserializationContextFactory + ); + } else { + throw new InvalidArgumentException('expected DeserializationContextFactoryInterface or callable.'); + } + + return $this; + } + + public function build() + { + $annotationReader = $this->annotationReader; + if (null === $annotationReader) { + $annotationReader = new AnnotationReader(); + + if (null !== $this->cacheDir) { + $this->createDir($this->cacheDir.'/annotations'); + $annotationsCache = new FilesystemCache($this->cacheDir.'/annotations'); + $annotationReader = new CachedReader($annotationReader, $annotationsCache, $this->debug); + } + } + + $metadataDriver = $this->driverFactory->createDriver($this->metadataDirs, $annotationReader); + $metadataFactory = new MetadataFactory($metadataDriver, null, $this->debug); + + $metadataFactory->setIncludeInterfaces($this->includeInterfaceMetadata); + + if (null !== $this->cacheDir) { + $this->createDir($this->cacheDir.'/metadata'); + $metadataFactory->setCache(new FileCache($this->cacheDir.'/metadata')); + } + + if ( ! $this->handlersConfigured) { + $this->addDefaultHandlers(); + } + + if ( ! $this->listenersConfigured) { + $this->addDefaultListeners(); + } + + if ( ! $this->visitorsAdded) { + $this->addDefaultSerializationVisitors(); + $this->addDefaultDeserializationVisitors(); + } + + $serializer = new Serializer( + $metadataFactory, + $this->handlerRegistry, + $this->objectConstructor ?: new UnserializeObjectConstructor(), + $this->serializationVisitors, + $this->deserializationVisitors, + $this->eventDispatcher, + null, + $this->expressionEvaluator + ); + + if (null !== $this->serializationContextFactory) { + $serializer->setSerializationContextFactory($this->serializationContextFactory); + } + + if (null !== $this->deserializationContextFactory) { + $serializer->setDeserializationContextFactory($this->deserializationContextFactory); + } + + return $serializer; + } + + private function initializePropertyNamingStrategy() + { + if (null !== $this->propertyNamingStrategy) { + return; + } + + $this->propertyNamingStrategy = new SerializedNameAnnotationStrategy(new CamelCaseNamingStrategy()); + } + + private function createDir($dir) + { + if (is_dir($dir)) { + return; + } + + if (false === @mkdir($dir, 0777, true) && false === is_dir($dir)) { + throw new RuntimeException(sprintf('Could not create directory "%s".', $dir)); + } + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/SerializerInterface.php b/vendor/jms/serializer/src/JMS/Serializer/SerializerInterface.php new file mode 100644 index 0000000000..2eb320d8fd --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/SerializerInterface.php @@ -0,0 +1,50 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer; + +/** + * Serializer Interface. + * + * @author Johannes M. Schmitt + */ +interface SerializerInterface +{ + /** + * Serializes the given data to the specified output format. + * + * @param object|array|scalar $data + * @param string $format + * @param Context $context + * + * @return string + */ + public function serialize($data, $format, SerializationContext $context = null); + + /** + * Deserializes the given data to the specified type. + * + * @param string $data + * @param string $type + * @param string $format + * @param Context $context + * + * @return object|array|scalar + */ + public function deserialize($data, $type, $format, DeserializationContext $context = null); +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Twig/SerializerExtension.php b/vendor/jms/serializer/src/JMS/Serializer/Twig/SerializerExtension.php new file mode 100644 index 0000000000..fda6a51b85 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Twig/SerializerExtension.php @@ -0,0 +1,66 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Twig; + +use JMS\Serializer\SerializerInterface; +use JMS\Serializer\SerializationContext; + +/** + * Serializer helper twig extension + * + * Basically provides access to JMSSerializer from Twig + */ +class SerializerExtension extends \Twig_Extension +{ + protected $serializer; + + public function getName() + { + return 'jms_serializer'; + } + + public function __construct(SerializerInterface $serializer) + { + $this->serializer = $serializer; + } + + public function getFilters() + { + return array( + new \Twig_SimpleFilter('serialize', array($this, 'serialize')), + ); + } + + public function getFunctions() + { + return array( + new \Twig_SimpleFunction('serialization_context', '\JMS\Serializer\SerializationContext::create'), + ); + } + + /** + * @param object $object + * @param string $type + * @param SerializationContext $context + */ + public function serialize($object, $type = 'json', SerializationContext $context = null) + { + return $this->serializer->serialize($object, $type, $context); + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Twig/SerializerRuntimeExtension.php b/vendor/jms/serializer/src/JMS/Serializer/Twig/SerializerRuntimeExtension.php new file mode 100644 index 0000000000..12a214aaaf --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Twig/SerializerRuntimeExtension.php @@ -0,0 +1,45 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Twig; + +/** + * @author Asmir Mustafic + */ +final class SerializerRuntimeExtension extends \Twig_Extension +{ + + public function getName() + { + return 'jms_serializer'; + } + + public function getFilters() + { + return array( + new \Twig_SimpleFilter('serialize', array(SerializerRuntimeHelper::class, 'serialize')), + ); + } + + public function getFunctions() + { + return array( + new \Twig_SimpleFunction('serialization_context', '\JMS\Serializer\SerializationContext::create'), + ); + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Twig/SerializerRuntimeHelper.php b/vendor/jms/serializer/src/JMS/Serializer/Twig/SerializerRuntimeHelper.php new file mode 100644 index 0000000000..39286b70d2 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Twig/SerializerRuntimeHelper.php @@ -0,0 +1,46 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Twig; + +use JMS\Serializer\SerializationContext; +use JMS\Serializer\SerializerInterface; + +/** + * @author Asmir Mustafic + */ +final class SerializerRuntimeHelper +{ + protected $serializer; + + public function __construct(SerializerInterface $serializer) + { + $this->serializer = $serializer; + } + + /** + * @param $object + * @param string $type + * @param SerializationContext|null $context + * @return string + */ + public function serialize($object, $type = 'json', SerializationContext $context = null) + { + return $this->serializer->serialize($object, $type, $context); + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/TypeParser.php b/vendor/jms/serializer/src/JMS/Serializer/TypeParser.php new file mode 100644 index 0000000000..7a63ed77b1 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/TypeParser.php @@ -0,0 +1,105 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer; + +/** + * Parses a serializer type. + * + * @author Johannes M. Schmitt + */ +final class TypeParser extends \JMS\Parser\AbstractParser +{ + const T_NAME = 1; + const T_STRING = 2; + const T_OPEN_BRACKET = 3; + const T_CLOSE_BRACKET = 4; + const T_COMMA = 5; + const T_NONE = 6; + + public function __construct() + { + parent::__construct(new \JMS\Parser\SimpleLexer( + '/ + # PHP Class Names + ((?:[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*\\\\)*[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*) + + # Strings + |("(?:[^"]|"")*"|\'(?:[^\']|\'\')*\') + + # Ignore whitespace + |\s* + + # Terminals + |(.) + /x', + array(self::T_NAME => 'T_NAME', self::T_STRING => 'T_STRING', self::T_OPEN_BRACKET => 'T_OPEN_BRACKET', + self::T_CLOSE_BRACKET => 'T_CLOSE_BRACKET', self::T_COMMA => 'T_COMMA', self::T_NONE => 'T_NONE'), + function($value) { + switch ($value[0]) { + case '"': + case "'": + return array(TypeParser::T_STRING, substr($value, 1, -1)); + + case '<': + return array(TypeParser::T_OPEN_BRACKET, '<'); + + case '>': + return array(TypeParser::T_CLOSE_BRACKET, '>'); + + case ',': + return array(TypeParser::T_COMMA, ','); + + default: + if (preg_match('/^(?:[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*\\\\)*[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/', $value)) { + return array(TypeParser::T_NAME, $value); + } + + return array(TypeParser::T_NONE, $value); + } + } + )); + } + + /** + * @return array of the format ["name" => string, "params" => array] + */ + protected function parseInternal() + { + $typeName = $this->match(self::T_NAME); + if ( ! $this->lexer->isNext(self::T_OPEN_BRACKET)) { + return array('name' => $typeName, 'params' => array()); + } + + $this->match(self::T_OPEN_BRACKET); + $params = array(); + do { + if ($this->lexer->isNext(self::T_NAME)) { + $params[] = $this->parseInternal(); + } else if ($this->lexer->isNext(self::T_STRING)) { + $params[] = $this->match(self::T_STRING); + } else { + $this->matchAny(array(self::T_NAME, self::T_STRING)); // Will throw an exception. + } + } while ($this->lexer->isNext(self::T_COMMA) && $this->lexer->moveNext()); + + $this->match(self::T_CLOSE_BRACKET); + + return array('name' => $typeName, 'params' => $params); + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/Util/Writer.php b/vendor/jms/serializer/src/JMS/Serializer/Util/Writer.php new file mode 100644 index 0000000000..d5de1eda5f --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/Util/Writer.php @@ -0,0 +1,137 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Util; + +use JMS\Serializer\Exception\RuntimeException; + +/** + * A writer implementation. + * + * This may be used to simplify writing well-formatted code. + * + * @author Johannes M. Schmitt + */ +class Writer +{ + public $indentationSpaces = 4; + public $indentationLevel = 0; + public $content = ''; + public $changeCount = 0; + + private $changes = array(); + + public function indent() + { + $this->indentationLevel += 1; + + return $this; + } + + public function outdent() + { + $this->indentationLevel -= 1; + + if ($this->indentationLevel < 0) { + throw new RuntimeException('The identation level cannot be less than zero.'); + } + + return $this; + } + + /** + * @param string $content + * + * @return Writer + */ + public function writeln($content) + { + $this->write($content."\n"); + + return $this; + } + + public function revert() + { + $change = array_pop($this->changes); + $this->changeCount -= 1; + $this->content = substr($this->content, 0, -1 * strlen($change)); + } + + /** + * @param string $content + * + * @return Writer + */ + public function write($content) + { + $addition = ''; + + $lines = explode("\n", $content); + for ($i=0,$c=count($lines); $i<$c; $i++) { + if ($this->indentationLevel > 0 + && !empty($lines[$i]) + && ((empty($addition) && "\n" === substr($this->content, -1)) || "\n" === substr($addition, -1))) { + $addition .= str_repeat(' ', $this->indentationLevel * $this->indentationSpaces); + } + + $addition .= $lines[$i]; + + if ($i+1 < $c) { + $addition .= "\n"; + } + } + + $this->content .= $addition; + $this->changes[] = $addition; + $this->changeCount += 1; + + return $this; + } + + public function rtrim($preserveNewLines = true) + { + if ( ! $preserveNewLines) { + $this->content = rtrim($this->content); + + return $this; + } + + $addNl = "\n" === substr($this->content, -1); + $this->content = rtrim($this->content); + + if ($addNl) { + $this->content .= "\n"; + } + + return $this; + } + + public function reset() + { + $this->content = ''; + $this->indentationLevel = 0; + + return $this; + } + + public function getContent() + { + return $this->content; + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/VisitorInterface.php b/vendor/jms/serializer/src/JMS/Serializer/VisitorInterface.php new file mode 100644 index 0000000000..7b84800474 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/VisitorInterface.php @@ -0,0 +1,141 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer; + +use JMS\Serializer\Metadata\ClassMetadata; +use JMS\Serializer\Metadata\PropertyMetadata; + +/** + * Interface for visitors. + * + * This contains the minimal set of values that must be supported for any + * output format. + * + * @author Johannes M. Schmitt + */ +interface VisitorInterface +{ + /** + * Allows visitors to convert the input data to a different representation + * before the actual serialization/deserialization process starts. + * + * @param mixed $data + * + * @return mixed + */ + public function prepare($data); + + /** + * @param mixed $data + * @param array $type + * + * @return mixed + */ + public function visitNull($data, array $type, Context $context); + + /** + * @param mixed $data + * @param array $type + * + * @return mixed + */ + public function visitString($data, array $type, Context $context); + + /** + * @param mixed $data + * @param array $type + * + * @return mixed + */ + public function visitBoolean($data, array $type, Context $context); + + /** + * @param mixed $data + * @param array $type + * + * @return mixed + */ + public function visitDouble($data, array $type, Context $context); + + /** + * @param mixed $data + * @param array $type + * + * @return mixed + */ + public function visitInteger($data, array $type, Context $context); + + /** + * @param mixed $data + * @param array $type + * + * @return mixed + */ + public function visitArray($data, array $type, Context $context); + + /** + * Called before the properties of the object are being visited. + * + * @param ClassMetadata $metadata + * @param mixed $data + * @param array $type + * + * @return void + */ + public function startVisitingObject(ClassMetadata $metadata, $data, array $type, Context $context); + + /** + * @param PropertyMetadata $metadata + * @param mixed $data + * + * @return void + */ + public function visitProperty(PropertyMetadata $metadata, $data, Context $context); + + /** + * Called after all properties of the object have been visited. + * + * @param ClassMetadata $metadata + * @param mixed $data + * @param array $type + * + * @return mixed + */ + public function endVisitingObject(ClassMetadata $metadata, $data, array $type, Context $context); + + /** + * Called before serialization/deserialization starts. + * + * @param GraphNavigator $navigator + * + * @return void + */ + public function setNavigator(GraphNavigator $navigator); + + /** + * @deprecated use Context::getNavigator/Context::accept instead + * @return GraphNavigator + */ + public function getNavigator(); + + /** + * @return object|array|scalar + */ + public function getResult(); +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/XmlDeserializationVisitor.php b/vendor/jms/serializer/src/JMS/Serializer/XmlDeserializationVisitor.php new file mode 100644 index 0000000000..daab5905b2 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/XmlDeserializationVisitor.php @@ -0,0 +1,390 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer; + +use JMS\Serializer\Exception\XmlErrorException; +use JMS\Serializer\Exception\LogicException; +use JMS\Serializer\Exception\InvalidArgumentException; +use JMS\Serializer\Exception\RuntimeException; +use JMS\Serializer\Metadata\PropertyMetadata; +use JMS\Serializer\Metadata\ClassMetadata; + +class XmlDeserializationVisitor extends AbstractVisitor +{ + private $objectStack; + private $metadataStack; + private $objectMetadataStack; + private $currentObject; + private $currentMetadata; + private $result; + private $navigator; + private $disableExternalEntities = true; + private $doctypeWhitelist = array(); + + public function enableExternalEntities() + { + $this->disableExternalEntities = false; + } + + public function setNavigator(GraphNavigator $navigator) + { + $this->navigator = $navigator; + $this->objectStack = new \SplStack; + $this->metadataStack = new \SplStack; + $this->objectMetadataStack = new \SplStack; + $this->result = null; + } + + public function getNavigator() + { + return $this->navigator; + } + + public function prepare($data) + { + $data = $this->emptyStringToSpaceCharacter($data); + + $previous = libxml_use_internal_errors(true); + libxml_clear_errors(); + + $previousEntityLoaderState = libxml_disable_entity_loader($this->disableExternalEntities); + + if (false !== stripos($data, 'getDomDocumentTypeEntitySubset($data); + if (!in_array($internalSubset, $this->doctypeWhitelist, true)) { + throw new InvalidArgumentException(sprintf( + 'The document type "%s" is not allowed. If it is safe, you may add it to the whitelist configuration.', + $internalSubset + )); + } + } + + $doc = simplexml_load_string($data); + + libxml_use_internal_errors($previous); + libxml_disable_entity_loader($previousEntityLoaderState); + + if (false === $doc) { + throw new XmlErrorException(libxml_get_last_error()); + } + + return $doc; + } + + private function emptyStringToSpaceCharacter($data) + { + return $data === '' ? ' ' : (string) $data; + } + + public function visitNull($data, array $type, Context $context) + { + return null; + } + + public function visitString($data, array $type, Context $context) + { + $data = (string) $data; + + if (null === $this->result) { + $this->result = $data; + } + + return $data; + } + + public function visitBoolean($data, array $type, Context $context) + { + $data = (string) $data; + + if ('true' === $data || '1' === $data) { + $data = true; + } elseif ('false' === $data || '0' === $data) { + $data = false; + } else { + throw new RuntimeException(sprintf('Could not convert data to boolean. Expected "true", "false", "1" or "0", but got %s.', json_encode($data))); + } + + if (null === $this->result) { + $this->result = $data; + } + + return $data; + } + + public function visitInteger($data, array $type, Context $context) + { + $data = (integer) $data; + + if (null === $this->result) { + $this->result = $data; + } + + return $data; + } + + public function visitDouble($data, array $type, Context $context) + { + $data = (double) $data; + + if (null === $this->result) { + $this->result = $data; + } + + return $data; + } + + public function visitArray($data, array $type, Context $context) + { + $entryName = null !== $this->currentMetadata && $this->currentMetadata->xmlEntryName ? $this->currentMetadata->xmlEntryName : 'entry'; + $namespace = null !== $this->currentMetadata && $this->currentMetadata->xmlEntryNamespace ? $this->currentMetadata->xmlEntryNamespace : null; + + if ($namespace === null && $this->objectMetadataStack->count()) { + $classMetadata = $this->objectMetadataStack->top(); + $namespace = isset($classMetadata->xmlNamespaces[''])?$classMetadata->xmlNamespaces['']:$namespace; + } + + if (null !== $namespace) { + $prefix = uniqid('ns-'); + $data->registerXPathNamespace($prefix, $namespace); + $nodes = $data->xpath("$prefix:$entryName"); + } else { + $nodes = $data->xpath($entryName); + } + + if (!count($nodes)) { + if (null === $this->result) { + return $this->result = array(); + } + + return array(); + } + + switch (count($type['params'])) { + case 0: + throw new RuntimeException(sprintf('The array type must be specified either as "array", or "array".')); + + case 1: + $result = array(); + + if (null === $this->result) { + $this->result = &$result; + } + + foreach ($nodes as $v) { + $result[] = $this->navigator->accept($v, $type['params'][0], $context); + } + + return $result; + + case 2: + if (null === $this->currentMetadata) { + throw new RuntimeException('Maps are not supported on top-level without metadata.'); + } + + list($keyType, $entryType) = $type['params']; + $result = array(); + if (null === $this->result) { + $this->result = &$result; + } + + $nodes = $data->children($namespace)->$entryName; + foreach ($nodes as $v) { + $attrs = $v->attributes(); + if ( ! isset($attrs[$this->currentMetadata->xmlKeyAttribute])) { + throw new RuntimeException(sprintf('The key attribute "%s" must be set for each entry of the map.', $this->currentMetadata->xmlKeyAttribute)); + } + + $k = $this->navigator->accept($attrs[$this->currentMetadata->xmlKeyAttribute], $keyType, $context); + $result[$k] = $this->navigator->accept($v, $entryType, $context); + } + + return $result; + + default: + throw new LogicException(sprintf('The array type does not support more than 2 parameters, but got %s.', json_encode($type['params']))); + } + } + + public function startVisitingObject(ClassMetadata $metadata, $object, array $type, Context $context) + { + $this->setCurrentObject($object); + $this->objectMetadataStack->push($metadata); + if (null === $this->result) { + $this->result = $this->currentObject; + } + } + + public function visitProperty(PropertyMetadata $metadata, $data, Context $context) + { + $name = $this->namingStrategy->translateName($metadata); + + if ( ! $metadata->type) { + throw new RuntimeException(sprintf('You must define a type for %s::$%s.', $metadata->reflection->class, $metadata->name)); + } + + if ($metadata->xmlAttribute) { + + $attributes = $data->attributes($metadata->xmlNamespace); + if (isset($attributes[$name])) { + $v = $this->navigator->accept($attributes[$name], $metadata->type, $context); + $this->accessor->setValue($this->currentObject, $v, $metadata); + } + + return; + } + + if ($metadata->xmlValue) { + $v = $this->navigator->accept($data, $metadata->type, $context); + $this->accessor->setValue($this->currentObject, $v, $metadata); + + return; + } + + if ($metadata->xmlCollection) { + $enclosingElem = $data; + if (!$metadata->xmlCollectionInline) { + $enclosingElem = $data->children($metadata->xmlNamespace)->$name; + } + + $this->setCurrentMetadata($metadata); + $v = $this->navigator->accept($enclosingElem, $metadata->type, $context); + $this->revertCurrentMetadata(); + $this->accessor->setValue($this->currentObject, $v, $metadata); + + return; + } + + if ($metadata->xmlNamespace) { + $node = $data->children($metadata->xmlNamespace)->$name; + if (!$node->count()) { + return; + } + } else { + + $namespaces = $data->getDocNamespaces(); + + if (isset($namespaces[''])) { + $prefix = uniqid('ns-'); + $data->registerXPathNamespace($prefix, $namespaces['']); + $nodes = $data->xpath('./'.$prefix. ':'.$name ); + } else { + $nodes = $data->xpath('./'. $name ); + } + if (empty($nodes)) { + return; + } + $node = reset($nodes); + } + + $v = $this->navigator->accept($node, $metadata->type, $context); + + $this->accessor->setValue($this->currentObject, $v, $metadata); + } + + public function endVisitingObject(ClassMetadata $metadata, $data, array $type, Context $context) + { + $rs = $this->currentObject; + $this->objectMetadataStack->pop(); + $this->revertCurrentObject(); + + return $rs; + } + + public function setCurrentObject($object) + { + $this->objectStack->push($this->currentObject); + $this->currentObject = $object; + } + + public function getCurrentObject() + { + return $this->currentObject; + } + + public function revertCurrentObject() + { + return $this->currentObject = $this->objectStack->pop(); + } + + public function setCurrentMetadata(PropertyMetadata $metadata) + { + $this->metadataStack->push($this->currentMetadata); + $this->currentMetadata = $metadata; + } + + public function getCurrentMetadata() + { + return $this->currentMetadata; + } + + public function revertCurrentMetadata() + { + return $this->currentMetadata = $this->metadataStack->pop(); + } + + public function getResult() + { + return $this->result; + } + + /** + * @param array $doctypeWhitelist + */ + public function setDoctypeWhitelist(array $doctypeWhitelist) + { + $this->doctypeWhitelist = $doctypeWhitelist; + } + + /** + * @return array + */ + public function getDoctypeWhitelist() + { + return $this->doctypeWhitelist; + } + + /** + * Retrieves internalSubset even in bugfixed php versions + * + * @param \DOMDocumentType $child + * @param string $data + * @return string + */ + private function getDomDocumentTypeEntitySubset($data) + { + $startPos = $endPos = stripos($data, '') { + --$braces; + } + } while ($braces > 0); + + $internalSubset = substr($data, $startPos, $endPos - $startPos); + $internalSubset = str_replace(array("\n", "\r"), '', $internalSubset); + $internalSubset = preg_replace('/\s{2,}/', ' ', $internalSubset); + $internalSubset = str_replace(array("[ ]>"), array('[]>'), $internalSubset); + + return $internalSubset; + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/XmlSerializationVisitor.php b/vendor/jms/serializer/src/JMS/Serializer/XmlSerializationVisitor.php new file mode 100644 index 0000000000..5cbf93eaa4 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/XmlSerializationVisitor.php @@ -0,0 +1,523 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer; + +use JMS\Serializer\Accessor\AccessorStrategyInterface; +use JMS\Serializer\Exception\RuntimeException; +use JMS\Serializer\Metadata\ClassMetadata; +use JMS\Serializer\Metadata\PropertyMetadata; +use JMS\Serializer\Naming\PropertyNamingStrategyInterface; + +/** + * XmlSerializationVisitor. + * + * @author Johannes M. Schmitt + */ +class XmlSerializationVisitor extends AbstractVisitor +{ + public $document; + + private $navigator; + private $defaultRootName = 'result'; + private $defaultRootNamespace; + private $defaultVersion = '1.0'; + private $defaultEncoding = 'UTF-8'; + private $stack; + private $metadataStack; + private $currentNode; + private $currentMetadata; + private $hasValue; + private $nullWasVisited; + private $objectMetadataStack; + + /** @var boolean */ + private $formatOutput; + + public function __construct(PropertyNamingStrategyInterface $namingStrategy, AccessorStrategyInterface $accessorStrategy = null) + { + parent::__construct($namingStrategy, $accessorStrategy); + $this->objectMetadataStack = new \SplStack; + $this->formatOutput = true; + } + + public function setDefaultRootName($name, $namespace = null) + { + $this->defaultRootName = $name; + $this->defaultRootNamespace = $namespace; + } + + /** + * @return boolean + */ + public function hasDefaultRootName() + { + return 'result' === $this->defaultRootName; + } + + public function setDefaultVersion($version) + { + $this->defaultVersion = $version; + } + + public function setDefaultEncoding($encoding) + { + $this->defaultEncoding = $encoding; + } + + public function setNavigator(GraphNavigator $navigator) + { + $this->navigator = $navigator; + $this->document = null; + $this->stack = new \SplStack; + $this->metadataStack = new \SplStack; + } + + public function getNavigator() + { + return $this->navigator; + } + + public function visitNull($data, array $type, Context $context) + { + if (null === $this->document) { + $this->document = $this->createDocument(null, null, true); + $node = $this->document->createAttribute('xsi:nil'); + $node->value = 'true'; + $this->currentNode->appendChild($node); + + $this->attachNullNamespace(); + + return; + } + + $node = $this->document->createAttribute('xsi:nil'); + $node->value = 'true'; + $this->attachNullNamespace(); + + return $node; + } + + public function visitString($data, array $type, Context $context) + { + + if (null !== $this->currentMetadata) { + $doCData = $this->currentMetadata->xmlElementCData; + } else { + $doCData = true; + } + + if (null === $this->document) { + $this->document = $this->createDocument(null, null, true); + $this->currentNode->appendChild($doCData ? $this->document->createCDATASection($data) : $this->document->createTextNode((string) $data)); + + return; + } + + return $doCData ? $this->document->createCDATASection($data) : $this->document->createTextNode((string) $data); + } + + public function visitSimpleString($data, array $type, Context $context) + { + if (null === $this->document) { + $this->document = $this->createDocument(null, null, true); + $this->currentNode->appendChild($this->document->createTextNode((string) $data)); + + return; + } + + return $this->document->createTextNode((string) $data); + } + + public function visitBoolean($data, array $type, Context $context) + { + if (null === $this->document) { + $this->document = $this->createDocument(null, null, true); + $this->currentNode->appendChild($this->document->createTextNode($data ? 'true' : 'false')); + + return; + } + + return $this->document->createTextNode($data ? 'true' : 'false'); + } + + public function visitInteger($data, array $type, Context $context) + { + return $this->visitNumeric($data, $type); + } + + public function visitDouble($data, array $type, Context $context) + { + return $this->visitNumeric($data, $type); + } + + public function visitArray($data, array $type, Context $context) + { + if (null === $this->document) { + $this->document = $this->createDocument(null, null, true); + } + + $entryName = (null !== $this->currentMetadata && null !== $this->currentMetadata->xmlEntryName) ? $this->currentMetadata->xmlEntryName : 'entry'; + $keyAttributeName = (null !== $this->currentMetadata && null !== $this->currentMetadata->xmlKeyAttribute) ? $this->currentMetadata->xmlKeyAttribute : null; + $namespace = (null !== $this->currentMetadata && null !== $this->currentMetadata->xmlEntryNamespace) ? $this->currentMetadata->xmlEntryNamespace : null; + + foreach ($data as $k => $v) { + + if (null === $v && $context->shouldSerializeNull() !== true) { + continue; + } + + $tagName = (null !== $this->currentMetadata && $this->currentMetadata->xmlKeyValuePairs && $this->isElementNameValid($k)) ? $k : $entryName; + + $entryNode = $this->createElement($tagName, $namespace); + $this->currentNode->appendChild($entryNode); + $this->setCurrentNode($entryNode); + + if (null !== $keyAttributeName) { + $entryNode->setAttribute($keyAttributeName, (string) $k); + } + + if (null !== $node = $this->navigator->accept($v, $this->getElementType($type), $context)) { + $this->currentNode->appendChild($node); + } + + $this->revertCurrentNode(); + } + } + + public function startVisitingObject(ClassMetadata $metadata, $data, array $type, Context $context) + { + $this->objectMetadataStack->push($metadata); + + if (null === $this->document) { + $this->document = $this->createDocument(null, null, false); + if ($metadata->xmlRootName) { + $rootName = $metadata->xmlRootName; + $rootNamespace = $metadata->xmlRootNamespace?:$this->getClassDefaultNamespace($metadata); + } else { + $rootName = $this->defaultRootName; + $rootNamespace = $this->defaultRootNamespace; + } + + if ($rootNamespace) { + $this->currentNode = $this->document->createElementNS($rootNamespace, $rootName); + } else { + $this->currentNode = $this->document->createElement($rootName); + } + + $this->document->appendChild($this->currentNode); + } + + $this->addNamespaceAttributes($metadata, $this->currentNode); + + $this->hasValue = false; + } + + public function visitProperty(PropertyMetadata $metadata, $object, Context $context) + { + $v = $this->accessor->getValue($object, $metadata); + + if (null === $v && $context->shouldSerializeNull() !== true) { + return; + } + + if ($metadata->xmlAttribute) { + $this->setCurrentMetadata($metadata); + $node = $this->navigator->accept($v, $metadata->type, $context); + $this->revertCurrentMetadata(); + + if ( ! $node instanceof \DOMCharacterData) { + throw new RuntimeException(sprintf('Unsupported value for XML attribute for %s. Expected character data, but got %s.', $metadata->name, json_encode($v))); + } + $attributeName = $this->namingStrategy->translateName($metadata); + $this->setAttributeOnNode($this->currentNode, $attributeName, $node->nodeValue, $metadata->xmlNamespace); + + return; + } + + if (($metadata->xmlValue && $this->currentNode->childNodes->length > 0) + || ( ! $metadata->xmlValue && $this->hasValue)) { + throw new RuntimeException(sprintf('If you make use of @XmlValue, all other properties in the class must have the @XmlAttribute annotation. Invalid usage detected in class %s.', $metadata->class)); + } + + if ($metadata->xmlValue) { + $this->hasValue = true; + + $this->setCurrentMetadata($metadata); + $node = $this->navigator->accept($v, $metadata->type, $context); + $this->revertCurrentMetadata(); + + if ( ! $node instanceof \DOMCharacterData) { + throw new RuntimeException(sprintf('Unsupported value for property %s::$%s. Expected character data, but got %s.', $metadata->reflection->class, $metadata->reflection->name, is_object($node) ? get_class($node) : gettype($node))); + } + + $this->currentNode->appendChild($node); + + return; + } + + if ($metadata->xmlAttributeMap) { + if ( ! is_array($v)) { + throw new RuntimeException(sprintf('Unsupported value type for XML attribute map. Expected array but got %s.', gettype($v))); + } + + foreach ($v as $key => $value) { + $this->setCurrentMetadata($metadata); + $node = $this->navigator->accept($value, null, $context); + $this->revertCurrentMetadata(); + + if ( ! $node instanceof \DOMCharacterData) { + throw new RuntimeException(sprintf('Unsupported value for a XML attribute map value. Expected character data, but got %s.', json_encode($v))); + } + + $this->setAttributeOnNode($this->currentNode, $key, $node->nodeValue, $metadata->xmlNamespace); + } + + return; + } + + if ($addEnclosingElement = !$this->isInLineCollection($metadata) && ! $metadata->inline) { + $elementName = $this->namingStrategy->translateName($metadata); + + $namespace = null !== $metadata->xmlNamespace + ? $metadata->xmlNamespace + : $this->getClassDefaultNamespace($this->objectMetadataStack->top()); + + $element = $this->createElement($elementName, $namespace); + $this->currentNode->appendChild($element); + $this->setCurrentNode($element); + } + + $this->setCurrentMetadata($metadata); + + if (null !== $node = $this->navigator->accept($v, $metadata->type, $context)) { + $this->currentNode->appendChild($node); + } + + $this->revertCurrentMetadata(); + + if ($addEnclosingElement) { + $this->revertCurrentNode(); + + if ($this->isElementEmpty($element) && ($v === null || $this->isSkippableCollection($metadata) || $this->isSkippableEmptyObject($node, $metadata) || $this->isCircularRef($context, $v))) { + $this->currentNode->removeChild($element); + } + } + + $this->hasValue = false; + } + + private function isInLineCollection(PropertyMetadata $metadata) + { + return $metadata->xmlCollection && $metadata->xmlCollectionInline; + } + + private function isCircularRef(SerializationContext $context, $v) + { + return $context->isVisiting($v); + } + + private function isSkippableEmptyObject($node, PropertyMetadata $metadata) + { + return $node === null && !$metadata->xmlCollection && $metadata->skipWhenEmpty; + } + + private function isSkippableCollection(PropertyMetadata $metadata) + { + return $metadata->xmlCollection && $metadata->xmlCollectionSkipWhenEmpty; + } + + private function isElementEmpty(\DOMElement $element) + { + return !$element->hasChildNodes() && !$element->hasAttributes(); + } + + public function endVisitingObject(ClassMetadata $metadata, $data, array $type, Context $context) + { + $this->objectMetadataStack->pop(); + } + + public function getResult() + { + return $this->document->saveXML(); + } + + public function getCurrentNode() + { + return $this->currentNode; + } + + public function getCurrentMetadata() + { + return $this->currentMetadata; + } + + public function getDocument() + { + return $this->document; + } + + public function setCurrentMetadata(PropertyMetadata $metadata) + { + $this->metadataStack->push($this->currentMetadata); + $this->currentMetadata = $metadata; + } + + public function setCurrentNode(\DOMNode $node) + { + $this->stack->push($this->currentNode); + $this->currentNode = $node; + } + + public function revertCurrentNode() + { + return $this->currentNode = $this->stack->pop(); + } + + public function revertCurrentMetadata() + { + return $this->currentMetadata = $this->metadataStack->pop(); + } + + public function createDocument($version = null, $encoding = null, $addRoot = true) + { + $doc = new \DOMDocument($version ?: $this->defaultVersion, $encoding ?: $this->defaultEncoding); + $doc->formatOutput = $this->isFormatOutput(); + + if ($addRoot) { + if ($this->defaultRootNamespace) { + $rootNode = $doc->createElementNS($this->defaultRootNamespace, $this->defaultRootName); + } else { + $rootNode = $doc->createElement($this->defaultRootName); + } + $this->setCurrentNode($rootNode); + $doc->appendChild($rootNode); + } + + return $doc; + } + + public function prepare($data) + { + $this->nullWasVisited = false; + + return $data; + } + + private function visitNumeric($data, array $type) + { + if (null === $this->document) { + $this->document = $this->createDocument(null, null, true); + $this->currentNode->appendChild($textNode = $this->document->createTextNode((string) $data)); + + return $textNode; + } + + return $this->document->createTextNode((string) $data); + } + + /** + * Checks that the name is a valid XML element name. + * + * @param string $name + * + * @return boolean + */ + private function isElementNameValid($name) + { + return $name && false === strpos($name, ' ') && preg_match('#^[\pL_][\pL0-9._-]*$#ui', $name); + } + + private function attachNullNamespace() + { + if ( ! $this->nullWasVisited) { + $this->document->documentElement->setAttributeNS( + 'http://www.w3.org/2000/xmlns/', + 'xmlns:xsi', + 'http://www.w3.org/2001/XMLSchema-instance' + ); + $this->nullWasVisited = true; + } + } + + /** + * Adds namespace attributes to the XML root element + * + * @param \JMS\Serializer\Metadata\ClassMetadata $metadata + * @param \DOMElement $element + */ + private function addNamespaceAttributes(ClassMetadata $metadata, \DOMElement $element) + { + foreach ($metadata->xmlNamespaces as $prefix => $uri) { + $attribute = 'xmlns'; + if ($prefix !== '') { + $attribute .= ':'.$prefix; + } elseif ($element->namespaceURI === $uri) { + continue; + } + $element->setAttributeNS('http://www.w3.org/2000/xmlns/', $attribute, $uri); + } + } + + private function createElement($tagName, $namespace = null) + { + if (null === $namespace) { + return $this->document->createElement($tagName); + } + if ($this->currentNode->isDefaultNamespace($namespace)) { + return $this->document->createElementNS($namespace, $tagName); + } + if (!($prefix = $this->currentNode->lookupPrefix($namespace)) && !($prefix = $this->document->lookupPrefix($namespace))) { + $prefix = 'ns-'. substr(sha1($namespace), 0, 8); + } + return $this->document->createElementNS($namespace, $prefix . ':' . $tagName); + } + + private function setAttributeOnNode(\DOMElement $node, $name, $value, $namespace = null) + { + if (null !== $namespace) { + if (!$prefix = $node->lookupPrefix($namespace)) { + $prefix = 'ns-'. substr(sha1($namespace), 0, 8); + } + $node->setAttributeNS($namespace, $prefix.':'.$name, $value); + } else { + $node->setAttribute($name, $value); + } + } + + private function getClassDefaultNamespace(ClassMetadata $metadata) + { + return (isset($metadata->xmlNamespaces[''])?$metadata->xmlNamespaces['']:null); + } + + /** + * @return bool + */ + public function isFormatOutput() + { + return $this->formatOutput; + } + + /** + * @param bool $formatOutput + */ + public function setFormatOutput($formatOutput) + { + $this->formatOutput = (boolean) $formatOutput; + } +} diff --git a/vendor/jms/serializer/src/JMS/Serializer/YamlSerializationVisitor.php b/vendor/jms/serializer/src/JMS/Serializer/YamlSerializationVisitor.php new file mode 100644 index 0000000000..b3bc77b879 --- /dev/null +++ b/vendor/jms/serializer/src/JMS/Serializer/YamlSerializationVisitor.php @@ -0,0 +1,222 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer; + +use JMS\Serializer\Accessor\AccessorStrategyInterface; +use Symfony\Component\Yaml\Inline; +use JMS\Serializer\Metadata\PropertyMetadata; +use JMS\Serializer\Naming\PropertyNamingStrategyInterface; +use JMS\Serializer\Metadata\ClassMetadata; +use JMS\Serializer\Util\Writer; + +/** + * Serialization Visitor for the YAML format. + * + * @see http://www.yaml.org/spec/ + * @author Johannes M. Schmitt + */ +class YamlSerializationVisitor extends AbstractVisitor +{ + public $writer; + + private $navigator; + private $stack; + private $metadataStack; + private $currentMetadata; + + public function __construct(PropertyNamingStrategyInterface $namingStrategy, AccessorStrategyInterface $accessorStrategy = null) + { + parent::__construct($namingStrategy, $accessorStrategy); + + $this->writer = new Writer(); + } + + public function setNavigator(GraphNavigator $navigator) + { + $this->navigator = $navigator; + $this->writer->reset(); + $this->stack = new \SplStack; + $this->metadataStack = new \SplStack; + } + + public function visitNull($data, array $type, Context $context) + { + if ('' === $this->writer->content) { + $this->writer->writeln('null'); + } + + return 'null'; + } + + public function visitString($data, array $type, Context $context) + { + $v = Inline::dump($data); + + if ('' === $this->writer->content) { + $this->writer->writeln($v); + } + + return $v; + } + + /** + * @param array $data + * @param array $type + */ + public function visitArray($data, array $type, Context $context) + { + $isHash = isset($type['params'][1]); + + $count = $this->writer->changeCount; + $isList = (isset($type['params'][0]) && ! isset($type['params'][1])) + || array_keys($data) === range(0, count($data) - 1); + + foreach ($data as $k => $v) { + if (null === $v && $context->shouldSerializeNull() !== true) { + continue; + } + + if ($isList && !$isHash) { + $this->writer->writeln('-'); + } else { + $this->writer->writeln(Inline::dump($k).':'); + } + + $this->writer->indent(); + + if (null !== $v = $this->navigator->accept($v, $this->getElementType($type), $context)) { + $this->writer + ->rtrim(false) + ->writeln(' '.$v) + ; + } + + $this->writer->outdent(); + } + + if ($count === $this->writer->changeCount && isset($type['params'][1])) { + $this->writer + ->rtrim(false) + ->writeln(' {}') + ; + } elseif (empty($data)) { + $this->writer + ->rtrim(false) + ->writeln(' []') + ; + } + } + + public function visitBoolean($data, array $type, Context $context) + { + $v = $data ? 'true' : 'false'; + + if ('' === $this->writer->content) { + $this->writer->writeln($v); + } + + return $v; + } + + public function visitDouble($data, array $type, Context $context) + { + $v = (string) $data; + + if ('' === $this->writer->content) { + $this->writer->writeln($v); + } + + return $v; + } + + public function visitInteger($data, array $type, Context $context) + { + $v = (string) $data; + + if ('' === $this->writer->content) { + $this->writer->writeln($v); + } + + return $v; + } + + public function startVisitingObject(ClassMetadata $metadata, $data, array $type, Context $context) + { + } + + public function visitProperty(PropertyMetadata $metadata, $data, Context $context) + { + $v = $this->accessor->getValue($data, $metadata); + + if (null === $v && $context->shouldSerializeNull() !== true) { + return; + } + + $name = $this->namingStrategy->translateName($metadata); + + if ( ! $metadata->inline) { + $this->writer + ->writeln(Inline::dump($name).':') + ->indent(); + } + + $this->setCurrentMetadata($metadata); + + $count = $this->writer->changeCount; + + if (null !== $v = $this->navigator->accept($v, $metadata->type, $context)) { + $this->writer + ->rtrim(false) + ->writeln(' '.$v) + ; + } elseif ($count === $this->writer->changeCount && ! $metadata->inline) { + $this->writer->revert(); + } + + if ( ! $metadata->inline) { + $this->writer->outdent(); + } + $this->revertCurrentMetadata(); + } + + public function endVisitingObject(ClassMetadata $metadata, $data, array $type, Context $context) + { + } + + public function setCurrentMetadata(PropertyMetadata $metadata) + { + $this->metadataStack->push($this->currentMetadata); + $this->currentMetadata = $metadata; + } + + public function revertCurrentMetadata() + { + return $this->currentMetadata = $this->metadataStack->pop(); + } + + public function getNavigator() + { + return $this->navigator; + } + + public function getResult() + { + return $this->writer->getContent(); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Exclusion/DisjunctExclusionStrategyTest.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Exclusion/DisjunctExclusionStrategyTest.php new file mode 100644 index 0000000000..36374c6a50 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Exclusion/DisjunctExclusionStrategyTest.php @@ -0,0 +1,161 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Exclusion; + +use JMS\Serializer\Exclusion\DisjunctExclusionStrategy; +use JMS\Serializer\Metadata\ClassMetadata; +use JMS\Serializer\Metadata\StaticPropertyMetadata; +use JMS\Serializer\SerializationContext; + +class DisjunctExclusionStrategyTest extends \PHPUnit_Framework_TestCase +{ + public function testShouldSkipClassShortCircuiting() + { + $metadata = new ClassMetadata('stdClass'); + $context = SerializationContext::create(); + + $strat = new DisjunctExclusionStrategy(array( + $first = $this->getMock('JMS\Serializer\Exclusion\ExclusionStrategyInterface'), + $last = $this->getMock('JMS\Serializer\Exclusion\ExclusionStrategyInterface'), + )); + + $first->expects($this->once()) + ->method('shouldSkipClass') + ->with($metadata, $context) + ->will($this->returnValue(true)); + + $last->expects($this->never()) + ->method('shouldSkipClass'); + + $this->assertTrue($strat->shouldSkipClass($metadata, $context)); + } + + public function testShouldSkipClassDisjunctBehavior() + { + $metadata = new ClassMetadata('stdClass'); + $context = SerializationContext::create(); + + $strat = new DisjunctExclusionStrategy(array( + $first = $this->getMock('JMS\Serializer\Exclusion\ExclusionStrategyInterface'), + $last = $this->getMock('JMS\Serializer\Exclusion\ExclusionStrategyInterface'), + )); + + $first->expects($this->once()) + ->method('shouldSkipClass') + ->with($metadata, $context) + ->will($this->returnValue(false)); + + $last->expects($this->once()) + ->method('shouldSkipClass') + ->with($metadata, $context) + ->will($this->returnValue(true)); + + $this->assertTrue($strat->shouldSkipClass($metadata, $context)); + } + + public function testShouldSkipClassReturnsFalseIfNoPredicateMatched() + { + $metadata = new ClassMetadata('stdClass'); + $context = SerializationContext::create(); + + $strat = new DisjunctExclusionStrategy(array( + $first = $this->getMock('JMS\Serializer\Exclusion\ExclusionStrategyInterface'), + $last = $this->getMock('JMS\Serializer\Exclusion\ExclusionStrategyInterface'), + )); + + $first->expects($this->once()) + ->method('shouldSkipClass') + ->with($metadata, $context) + ->will($this->returnValue(false)); + + $last->expects($this->once()) + ->method('shouldSkipClass') + ->with($metadata, $context) + ->will($this->returnValue(false)); + + $this->assertFalse($strat->shouldSkipClass($metadata, $context)); + } + + public function testShouldSkipPropertyShortCircuiting() + { + $metadata = new StaticPropertyMetadata('stdClass', 'foo', 'bar'); + $context = SerializationContext::create(); + + $strat = new DisjunctExclusionStrategy(array( + $first = $this->getMock('JMS\Serializer\Exclusion\ExclusionStrategyInterface'), + $last = $this->getMock('JMS\Serializer\Exclusion\ExclusionStrategyInterface'), + )); + + $first->expects($this->once()) + ->method('shouldSkipProperty') + ->with($metadata, $context) + ->will($this->returnValue(true)); + + $last->expects($this->never()) + ->method('shouldSkipProperty'); + + $this->assertTrue($strat->shouldSkipProperty($metadata, $context)); + } + + public function testShouldSkipPropertyDisjunct() + { + $metadata = new StaticPropertyMetadata('stdClass', 'foo', 'bar'); + $context = SerializationContext::create(); + + $strat = new DisjunctExclusionStrategy(array( + $first = $this->getMock('JMS\Serializer\Exclusion\ExclusionStrategyInterface'), + $last = $this->getMock('JMS\Serializer\Exclusion\ExclusionStrategyInterface'), + )); + + $first->expects($this->once()) + ->method('shouldSkipProperty') + ->with($metadata, $context) + ->will($this->returnValue(false)); + + $last->expects($this->once()) + ->method('shouldSkipProperty') + ->with($metadata, $context) + ->will($this->returnValue(true)); + + $this->assertTrue($strat->shouldSkipProperty($metadata, $context)); + } + + public function testShouldSkipPropertyReturnsFalseIfNoPredicateMatches() + { + $metadata = new StaticPropertyMetadata('stdClass', 'foo', 'bar'); + $context = SerializationContext::create(); + + $strat = new DisjunctExclusionStrategy(array( + $first = $this->getMock('JMS\Serializer\Exclusion\ExclusionStrategyInterface'), + $last = $this->getMock('JMS\Serializer\Exclusion\ExclusionStrategyInterface'), + )); + + $first->expects($this->once()) + ->method('shouldSkipProperty') + ->with($metadata, $context) + ->will($this->returnValue(false)); + + $last->expects($this->once()) + ->method('shouldSkipProperty') + ->with($metadata, $context) + ->will($this->returnValue(false)); + + $this->assertFalse($strat->shouldSkipProperty($metadata, $context)); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Exclusion/GroupsExclusionStrategyTest.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Exclusion/GroupsExclusionStrategyTest.php new file mode 100644 index 0000000000..f073b11818 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Exclusion/GroupsExclusionStrategyTest.php @@ -0,0 +1,68 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Exclusion; + +use JMS\Serializer\Exclusion\GroupsExclusionStrategy; +use JMS\Serializer\Metadata\StaticPropertyMetadata; +use JMS\Serializer\SerializationContext; + +class GroupsExclusionStrategyTest extends \PHPUnit_Framework_TestCase +{ + /** + * @dataProvider getExclusionRules + * @param array $propertyGroups + * @param array $groups + * @param $exclude + */ + public function testUninitializedContextIsWorking(array $propertyGroups, array $groups, $exclude) + { + $metadata = new StaticPropertyMetadata('stdClass', 'prop', 'propVal'); + $metadata->groups = $propertyGroups; + + $strat = new GroupsExclusionStrategy($groups); + $this->assertEquals($strat->shouldSkipProperty($metadata, SerializationContext::create()), $exclude); + } + + public function getExclusionRules() + { + return [ + [['foo'], ['foo'], false], + [['foo'], [], true], + [[], ['foo'], true], + [['foo'], ['bar'], true], + [['bar'], ['foo'], true], + + [['foo', GroupsExclusionStrategy::DEFAULT_GROUP], [], false], + [['foo', 'bar'], [], true], + [['foo', 'bar'], [GroupsExclusionStrategy::DEFAULT_GROUP], true], + [['foo', 'bar'], ['foo'], false], + + [['foo', GroupsExclusionStrategy::DEFAULT_GROUP], ['test'], true], + [['foo', GroupsExclusionStrategy::DEFAULT_GROUP, 'test'], ['test'], false], + + [['foo'], [GroupsExclusionStrategy::DEFAULT_GROUP], true], + [[GroupsExclusionStrategy::DEFAULT_GROUP], [], false], + [[], [GroupsExclusionStrategy::DEFAULT_GROUP], false], + [[GroupsExclusionStrategy::DEFAULT_GROUP], [GroupsExclusionStrategy::DEFAULT_GROUP], false], + [[GroupsExclusionStrategy::DEFAULT_GROUP, 'foo'], [GroupsExclusionStrategy::DEFAULT_GROUP], false], + [[GroupsExclusionStrategy::DEFAULT_GROUP], [GroupsExclusionStrategy::DEFAULT_GROUP, 'foo'], false], + [['foo'], [GroupsExclusionStrategy::DEFAULT_GROUP, 'foo'], false], + ]; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/AccessorOrderChild.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/AccessorOrderChild.php new file mode 100644 index 0000000000..273b8b9daa --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/AccessorOrderChild.php @@ -0,0 +1,27 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation as Serializer; + +/** @Serializer\AccessorOrder("custom", custom = {"c", "d", "a", "b"}) */ +class AccessorOrderChild extends AccessorOrderParent +{ + private $c = 'c', $d = 'd'; +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/AccessorOrderMethod.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/AccessorOrderMethod.php new file mode 100644 index 0000000000..2277ff972f --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/AccessorOrderMethod.php @@ -0,0 +1,38 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation as Serializer; + +/** @Serializer\AccessorOrder("custom", custom = {"method", "b", "a"}) */ +class AccessorOrderMethod +{ + private $b = 'b', $a = 'a'; + + /** + * @Serializer\VirtualProperty + * @Serializer\SerializedName("foo") + * + * @return string + */ + public function getMethod() + { + return 'c'; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/AccessorOrderParent.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/AccessorOrderParent.php new file mode 100644 index 0000000000..7b2d850284 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/AccessorOrderParent.php @@ -0,0 +1,27 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation as Serializer; + +/** @Serializer\AccessorOrder("alphabetical") */ +class AccessorOrderParent +{ + private $b = 'b', $a = 'a'; +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/AccessorSetter.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/AccessorSetter.php new file mode 100644 index 0000000000..95d452919a --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/AccessorSetter.php @@ -0,0 +1,108 @@ +") + * @Serializer\Accessor(setter="setCollectionDifferent") + * @Serializer\XmlList(inline=false) + */ + protected $collection; + + /** + * @return \stdClass + */ + public function getElement() + { + return $this->element; + } + + /** + * @param AccessorSetterElement $element + */ + public function setElementDifferent(AccessorSetterElement $element) + { + $this->element = new \stdClass(); + $this->element->element = $element; + } + + /** + * @return array + */ + public function getCollection() + { + return $this->collection; + } + + /** + * @param array $collection + */ + public function setCollectionDifferent($collection) + { + $this->collection = array_combine($collection, $collection); + } +} + +class AccessorSetterElement +{ + /** + * @var string + * @Serializer\Type("string") + * @Serializer\Accessor(setter="setAttributeDifferent") + * @Serializer\XmlAttribute + */ + protected $attribute; + + /** + * @var string + * @Serializer\Type("string") + * @Serializer\Accessor(setter="setElementDifferent") + * @Serializer\XmlValue + */ + protected $element; + + /** + * @return string + */ + public function getAttribute() + { + return $this->attribute; + } + + /** + * @param string $attribute + */ + public function setAttributeDifferent($attribute) + { + $this->attribute = $attribute . "-different"; + } + + + /** + * @param string $element + */ + public function setElementDifferent($element) + { + $this->element = $element . "-different"; + } + + /** + * @return string + */ + public function getElement() + { + return $this->element; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/AllExcludedObject.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/AllExcludedObject.php new file mode 100644 index 0000000000..41c0ead275 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/AllExcludedObject.php @@ -0,0 +1,37 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\Expose; +use JMS\Serializer\Annotation\ExclusionPolicy; + +/** + * @ExclusionPolicy("all") + * + * @author Johannes M. Schmitt + */ +class AllExcludedObject +{ + private $foo = 'foo'; + + /** + * @Expose + */ + private $bar = 'bar'; +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Article.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Article.php new file mode 100644 index 0000000000..af13d7f1ab --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Article.php @@ -0,0 +1,70 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Context; +use JMS\Serializer\JsonDeserializationVisitor; +use JMS\Serializer\XmlDeserializationVisitor; +use Symfony\Component\Yaml\Inline; +use JMS\Serializer\YamlSerializationVisitor; +use JMS\Serializer\JsonSerializationVisitor; +use JMS\Serializer\XmlSerializationVisitor; +use JMS\Serializer\Annotation\HandlerCallback; + +class Article +{ + public $element; + public $value; + + /** @HandlerCallback("xml", direction = "serialization") */ + public function serializeToXml(XmlSerializationVisitor $visitor, $data, Context $context) + { + if (null === $visitor->document) { + $visitor->document = $visitor->createDocument(null, null, false); + } + + $visitor->document->appendChild($visitor->document->createElement($this->element, $this->value)); + } + + /** @HandlerCallback("json", direction = "serialization") */ + public function serializeToJson(JsonSerializationVisitor $visitor) + { + $visitor->setRoot(array($this->element => $this->value)); + } + + /** @HandlerCallback("yml", direction = "serialization") */ + public function serializeToYml(YamlSerializationVisitor $visitor) + { + $visitor->writer->writeln(Inline::dump($this->element).': '.Inline::dump($this->value)); + } + + /** @HandlerCallback("xml", direction = "deserialization") */ + public function deserializeFromXml(XmlDeserializationVisitor $visitor, \SimpleXMLElement $data) + { + $this->element = $data->getName(); + $this->value = (string) $data; + } + + /** @HandlerCallback("json", direction = "deserialization") */ + public function deserializeFromJson(JsonDeserializationVisitor $visitor, array $data) + { + $this->element = key($data); + $this->value = reset($data); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Author.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Author.php new file mode 100644 index 0000000000..4171761969 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Author.php @@ -0,0 +1,41 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\SerializedName; +use JMS\Serializer\Annotation\Type; + +class Author +{ + /** + * @Type("string") + * @SerializedName("full_name") + */ + private $name; + + public function __construct($name) + { + $this->name = $name; + } + + public function getName() + { + return $this->name; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/AuthorExpressionAccess.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/AuthorExpressionAccess.php new file mode 100644 index 0000000000..4969023b7c --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/AuthorExpressionAccess.php @@ -0,0 +1,59 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation as Serializer; + +/** + * @Serializer\VirtualProperty("firstName", exp="object.getFirstName()", options={@Serializer\SerializedName("my_first_name")}) + */ +class AuthorExpressionAccess +{ + private $id; + /** + * @Serializer\Exclude() + */ + private $firstName; + + /** + * @Serializer\Exclude() + */ + private $lastName; + + public function __construct($id, $firstName, $lastName) + { + $this->id = $id; + $this->firstName = $firstName; + $this->lastName = $lastName; + } + + public function getFirstName() + { + return $this->firstName; + } + + /** + * @Serializer\VirtualProperty() + */ + public function getLastName() + { + return $this->lastName; + } + +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/AuthorList.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/AuthorList.php new file mode 100644 index 0000000000..642bef824e --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/AuthorList.php @@ -0,0 +1,94 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation as Serializer; + +/** + * An array-acting object that holds many author instances. + */ +class AuthorList implements \IteratorAggregate, \Countable, \ArrayAccess +{ + /** + * @Serializer\Type("array") + * @var array + */ + protected $authors = array(); + + /** + * @param Author $author + */ + public function add(Author $author) + { + $this->authors[] = $author; + } + + /** + * @see IteratorAggregate + */ + public function getIterator() + { + return new \ArrayIterator($this->authors); + } + + /** + * @see Countable + */ + public function count() + { + return count($this->authors); + } + + /** + * @see ArrayAccess + */ + public function offsetExists($offset) + { + return isset($this->authors[$offset]); + } + + /** + * @see ArrayAccess + */ + public function offsetGet($offset) + { + return isset($this->authors[$offset]) ? $this->authors[$offset] : null; + } + + /** + * @see ArrayAccess + */ + public function offsetSet($offset, $value) + { + if (null === $offset) { + $this->authors[] = $value; + } else { + $this->authors[$offset] = $value; + } + } + + /** + * @see ArrayAccess + */ + public function offsetUnset($offset) + { + unset($this->authors[$offset]); + } + +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/AuthorReadOnly.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/AuthorReadOnly.php new file mode 100644 index 0000000000..274c9fe241 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/AuthorReadOnly.php @@ -0,0 +1,58 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\SerializedName; +use JMS\Serializer\Annotation\Type; +use JMS\Serializer\Annotation\XmlRoot; +use JMS\Serializer\Annotation\ReadOnly; +use JMS\Serializer\Annotation\Accessor; + +/** @XmlRoot("author") */ +class AuthorReadOnly +{ + /** + * @ReadOnly + * @SerializedName("id") + */ + private $id; + + /** + * @Type("string") + * @SerializedName("full_name") + * @Accessor("getName") + */ + private $name; + + public function __construct($id, $name) + { + $this->id = $id; + $this->name = $name; + } + + public function getId() + { + return $this->id; + } + + public function getName() + { + return $this->name; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/AuthorReadOnlyPerClass.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/AuthorReadOnlyPerClass.php new file mode 100644 index 0000000000..3180bc0906 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/AuthorReadOnlyPerClass.php @@ -0,0 +1,62 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\SerializedName; +use JMS\Serializer\Annotation\Type; +use JMS\Serializer\Annotation\XmlRoot; +use JMS\Serializer\Annotation\ReadOnly; +use JMS\Serializer\Annotation\Accessor; + +/** + * @XmlRoot("author") + * @ReadOnly + */ +class AuthorReadOnlyPerClass +{ + /** + * @ReadOnly + * @SerializedName("id") + */ + private $id; + + /** + * @Type("string") + * @SerializedName("full_name") + * @Accessor("getName") + * @ReadOnly(false) + */ + private $name; + + public function __construct($id, $name) + { + $this->id = $id; + $this->name = $name; + } + + public function getId() + { + return $this->id; + } + + public function getName() + { + return $this->name; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/BlogPost.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/BlogPost.php new file mode 100644 index 0000000000..a59392e981 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/BlogPost.php @@ -0,0 +1,150 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\Type; +use JMS\Serializer\Annotation\SerializedName; +use JMS\Serializer\Annotation\XmlMap; +use JMS\Serializer\Annotation\XmlRoot; +use JMS\Serializer\Annotation\XmlNamespace; +use JMS\Serializer\Annotation\XmlAttribute; +use JMS\Serializer\Annotation\XmlList; +use JMS\Serializer\Annotation\XmlElement; +use JMS\Serializer\Annotation\Groups; +use Doctrine\Common\Collections\ArrayCollection; +use PhpCollection\Map; +use PhpCollection\Sequence; + +/** + * @XmlRoot("blog-post") + * @XmlNamespace(uri="http://example.com/namespace") + * @XmlNamespace(uri="http://schemas.google.com/g/2005", prefix="gd") + * @XmlNamespace(uri="http://www.w3.org/2005/Atom", prefix="atom") + * @XmlNamespace(uri="http://purl.org/dc/elements/1.1/", prefix="dc") + */ +class BlogPost +{ + /** + * @Type("string") + * @XmlElement(cdata=false) + * @Groups({"comments","post"}) + */ + private $id = 'what_a_nice_id'; + + /** + * @Type("string") + * @Groups({"comments","post"}) + * @XmlElement(namespace="http://purl.org/dc/elements/1.1/"); + */ + private $title; + + /** + * @Type("DateTime") + * @XmlAttribute + */ + private $createdAt; + + /** + * @Type("boolean") + * @SerializedName("is_published") + * @XmlAttribute + * @Groups({"post"}) + */ + private $published; + + /** + * @Type("string") + * @XmlAttribute(namespace="http://schemas.google.com/g/2005") + * @Groups({"post"}) + */ + private $etag; + + /** + * @Type("ArrayCollection") + * @XmlList(inline=true, entry="comment") + * @Groups({"comments"}) + */ + private $comments; + + /** + * @Type("PhpCollection\Sequence") + * @XmlList(inline=true, entry="comment2") + * @Groups({"comments"}) + */ + private $comments2; + + /** + * @Type("PhpCollection\Map") + * @XmlMap(keyAttribute = "key") + */ + private $metadata; + + /** + * @Type("JMS\Serializer\Tests\Fixtures\Author") + * @Groups({"post"}) + * @XmlElement(namespace="http://www.w3.org/2005/Atom") + */ + private $author; + + /** + * @Type("JMS\Serializer\Tests\Fixtures\Publisher") + */ + private $publisher; + + /** + * @Type("array") + * @XmlList(inline=true, entry="tag", namespace="http://purl.org/dc/elements/1.1/"); + */ + private $tag; + + public function __construct($title, Author $author, \DateTime $createdAt, Publisher $publisher) + { + $this->title = $title; + $this->author = $author; + $this->publisher = $publisher; + $this->published = false; + $this->comments = new ArrayCollection(); + $this->comments2 = new Sequence(); + $this->metadata = new Map(); + $this->metadata->set('foo', 'bar'); + $this->createdAt = $createdAt; + $this->etag = sha1($this->createdAt->format(\DateTime::ISO8601)); + } + + public function setPublished() + { + $this->published = true; + } + + public function getMetadata() + { + return $this->metadata; + } + + public function addComment(Comment $comment) + { + $this->comments->add($comment); + $this->comments2->add($comment); + } + + public function addTag(Tag $tag) + { + $this->tag[] = $tag; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/CircularReferenceChild.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/CircularReferenceChild.php new file mode 100644 index 0000000000..bdefc5eeec --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/CircularReferenceChild.php @@ -0,0 +1,51 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\Type; + +class CircularReferenceChild +{ + /** @Type("string") */ + private $name; + + /** @Type("JMS\Serializer\Tests\Fixtures\CircularReferenceParent") */ + private $parent; + + public function __construct($name, CircularReferenceParent $parent) + { + $this->name = $name; + $this->parent = $parent; + } + + public function getName() + { + return $this->name; + } + + public function getParent() + { + return $this->parent; + } + + public function setParent(CircularReferenceParent $parent) + { + $this->parent = $parent; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/CircularReferenceParent.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/CircularReferenceParent.php new file mode 100644 index 0000000000..90745bdf81 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/CircularReferenceParent.php @@ -0,0 +1,61 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use Doctrine\Common\Collections\ArrayCollection; +use JMS\Serializer\Annotation\Type; +use JMS\Serializer\Annotation\PostDeserialize; + +/** No annotation */ +class CircularReferenceParent +{ + /** @Type("array") */ + protected $collection = array(); + + /** @Type("ArrayCollection") */ + private $anotherCollection; + + public function __construct() + { + $this->collection[] = new CircularReferenceChild('child1', $this); + $this->collection[] = new CircularReferenceChild('child2', $this); + + $this->anotherCollection = new ArrayCollection(); + $this->anotherCollection->add(new CircularReferenceChild('child1', $this)); + $this->anotherCollection->add(new CircularReferenceChild('child2', $this)); + } + + /** @PostDeserialize */ + private function afterDeserialization() + { + if (!$this->collection) { + $this->collection = array(); + } + foreach ($this->collection as $v) { + $v->setParent($this); + } + + if (!$this->anotherCollection) { + $this->anotherCollection = new ArrayCollection(); + } + foreach ($this->anotherCollection as $v) { + $v->setParent($this); + } + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Comment.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Comment.php new file mode 100644 index 0000000000..9c061576d2 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Comment.php @@ -0,0 +1,45 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\Type; + +class Comment +{ + /** + * @Type("JMS\Serializer\Tests\Fixtures\Author") + */ + private $author; + + /** + * @Type("string") + */ + private $text; + + public function __construct(Author $author = null, $text) + { + $this->author = $author; + $this->text = $text; + } + + public function getAuthor() + { + return $this->author; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/CurrencyAwareOrder.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/CurrencyAwareOrder.php new file mode 100644 index 0000000000..07e65cb601 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/CurrencyAwareOrder.php @@ -0,0 +1,34 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\XmlRoot; +use JMS\Serializer\Annotation\Type; + +/** @XmlRoot("order") */ +class CurrencyAwareOrder +{ + /** @Type("JMS\Serializer\Tests\Fixtures\CurrencyAwarePrice") */ + private $cost; + + public function __construct(CurrencyAwarePrice $price = null) + { + $this->cost = $price ?: new CurrencyAwarePrice(5); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/CurrencyAwarePrice.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/CurrencyAwarePrice.php new file mode 100644 index 0000000000..654022ea1f --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/CurrencyAwarePrice.php @@ -0,0 +1,43 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation as Serializer; + +/** @Serializer\XmlRoot("price") */ +class CurrencyAwarePrice +{ + /** + * @Serializer\XmlAttribute + * @Serializer\Type("string") + */ + private $currency; + + /** + * @Serializer\XmlValue + * @Serializer\Type("double") + */ + private $amount; + + public function __construct($amount, $currency = 'EUR') + { + $this->currency = $currency; + $this->amount = $amount; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/CustomDeserializationObject.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/CustomDeserializationObject.php new file mode 100644 index 0000000000..3a37e4968c --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/CustomDeserializationObject.php @@ -0,0 +1,34 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\Type; + +class CustomDeserializationObject +{ + /** + * @Type("string") + */ + public $someProperty; + + public function __construct($value) + { + $this->someProperty = $value; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/DateTimeArraysObject.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/DateTimeArraysObject.php new file mode 100644 index 0000000000..0ef62977e1 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/DateTimeArraysObject.php @@ -0,0 +1,63 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\Type; +use JMS\Serializer\Annotation\XmlMap; +use JMS\Serializer\Annotation\XmlList; +use JMS\Serializer\Annotation\XmlKeyValuePairs; + + +class DateTimeArraysObject +{ + /** + * @var \DateTime[] + * @Type("array") + */ + private $arrayWithDefaultDateTime; + + /** + * @var \DateTime[] + * @Type("array>") + */ + private $arrayWithFormattedDateTime; + + + function __construct($arrayWithDefaultDateTime, $arrayWithFormattedDateTime) + { + $this->arrayWithDefaultDateTime = $arrayWithDefaultDateTime; + $this->arrayWithFormattedDateTime = $arrayWithFormattedDateTime; + } + + /** + * @return \DateTime[] + */ + public function getArrayWithDefaultDateTime() + { + return $this->arrayWithDefaultDateTime; + } + + /** + * @return \DateTime[] + */ + public function getArrayWithFormattedDateTime() + { + return $this->arrayWithFormattedDateTime; + } + +} \ No newline at end of file diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Discriminator/Car.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Discriminator/Car.php new file mode 100644 index 0000000000..3b2ed3d66b --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Discriminator/Car.php @@ -0,0 +1,23 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures\Discriminator; + +class Car extends Vehicle implements VehicleInterface +{ +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Discriminator/Moped.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Discriminator/Moped.php new file mode 100644 index 0000000000..d6867b2f3b --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Discriminator/Moped.php @@ -0,0 +1,23 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures\Discriminator; + +class Moped extends Vehicle implements VehicleInterface +{ +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Discriminator/ObjectWithXmlAttributeDiscriminatorChild.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Discriminator/ObjectWithXmlAttributeDiscriminatorChild.php new file mode 100644 index 0000000000..2a39644166 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Discriminator/ObjectWithXmlAttributeDiscriminatorChild.php @@ -0,0 +1,23 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures\Discriminator; + +class ObjectWithXmlAttributeDiscriminatorChild extends ObjectWithXmlAttributeDiscriminatorParent +{ +} \ No newline at end of file diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Discriminator/ObjectWithXmlAttributeDiscriminatorParent.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Discriminator/ObjectWithXmlAttributeDiscriminatorParent.php new file mode 100644 index 0000000000..8aeded603f --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Discriminator/ObjectWithXmlAttributeDiscriminatorParent.php @@ -0,0 +1,32 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures\Discriminator; + +use JMS\Serializer\Annotation as Serializer; + +/** + * @Serializer\Discriminator(field = "type", map = { + * "child": "JMS\Serializer\Tests\Fixtures\Discriminator\ObjectWithXmlAttributeDiscriminatorChild" + * }) + * @Serializer\XmlDiscriminator(attribute=true, cdata=false) + */ +class ObjectWithXmlAttributeDiscriminatorParent +{ + +} \ No newline at end of file diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Discriminator/ObjectWithXmlNamespaceDiscriminatorChild.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Discriminator/ObjectWithXmlNamespaceDiscriminatorChild.php new file mode 100644 index 0000000000..2ffd4280e5 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Discriminator/ObjectWithXmlNamespaceDiscriminatorChild.php @@ -0,0 +1,23 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures\Discriminator; + +class ObjectWithXmlNamespaceDiscriminatorChild extends ObjectWithXmlNamespaceDiscriminatorParent +{ +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Discriminator/ObjectWithXmlNamespaceDiscriminatorParent.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Discriminator/ObjectWithXmlNamespaceDiscriminatorParent.php new file mode 100644 index 0000000000..ca433a4e05 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Discriminator/ObjectWithXmlNamespaceDiscriminatorParent.php @@ -0,0 +1,33 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures\Discriminator; + +use JMS\Serializer\Annotation as Serializer; + +/** + * @Serializer\Discriminator(field = "type", map = { + * "child": "JMS\Serializer\Tests\Fixtures\Discriminator\ObjectWithXmlNamespaceDiscriminatorChild" + * }) + * @Serializer\XmlDiscriminator(namespace="http://example.com/", cdata=false) + * @Serializer\XmlNamespace(prefix="foo", uri="http://example.com/") + */ +class ObjectWithXmlNamespaceDiscriminatorParent +{ + +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Discriminator/ObjectWithXmlNotCDataDiscriminatorChild.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Discriminator/ObjectWithXmlNotCDataDiscriminatorChild.php new file mode 100644 index 0000000000..e45af7b4b1 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Discriminator/ObjectWithXmlNotCDataDiscriminatorChild.php @@ -0,0 +1,23 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures\Discriminator; + +class ObjectWithXmlNotCDataDiscriminatorChild extends ObjectWithXmlNotCDataDiscriminatorParent +{ +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Discriminator/ObjectWithXmlNotCDataDiscriminatorParent.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Discriminator/ObjectWithXmlNotCDataDiscriminatorParent.php new file mode 100644 index 0000000000..b57d568f1a --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Discriminator/ObjectWithXmlNotCDataDiscriminatorParent.php @@ -0,0 +1,32 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures\Discriminator; + +use JMS\Serializer\Annotation as Serializer; + +/** + * @Serializer\Discriminator(field = "type", map = { + * "child": "JMS\Serializer\Tests\Fixtures\Discriminator\ObjectWithXmlNotCDataDiscriminatorChild" + * }) + * @Serializer\XmlDiscriminator(cdata=false) + */ +class ObjectWithXmlNotCDataDiscriminatorParent +{ + +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Discriminator/Vehicle.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Discriminator/Vehicle.php new file mode 100644 index 0000000000..d9e5c3c1af --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Discriminator/Vehicle.php @@ -0,0 +1,38 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures\Discriminator; + +use JMS\Serializer\Annotation as Serializer; + +/** + * @Serializer\Discriminator(field = "type", map = { + * "car": "JMS\Serializer\Tests\Fixtures\Discriminator\Car", + * "moped": "JMS\Serializer\Tests\Fixtures\Discriminator\Moped", + * }) + */ +abstract class Vehicle +{ + /** @Serializer\Type("integer") */ + public $km; + + public function __construct($km) + { + $this->km = (integer) $km; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Discriminator/VehicleInterface.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Discriminator/VehicleInterface.php new file mode 100644 index 0000000000..1fe39e5309 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Discriminator/VehicleInterface.php @@ -0,0 +1,31 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures\Discriminator; + +use JMS\Serializer\Annotation as Serializer; + +/** + * @Serializer\Discriminator(field = "type", map = { + * "car": "JMS\Serializer\Tests\Fixtures\Discriminator\Car", + * "moped": "JMS\Serializer\Tests\Fixtures\Discriminator\Moped", + * }) + */ +interface VehicleInterface +{ +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/DiscriminatorGroup/Car.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/DiscriminatorGroup/Car.php new file mode 100644 index 0000000000..01a10bb9c5 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/DiscriminatorGroup/Car.php @@ -0,0 +1,23 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures\DiscriminatorGroup; + +class Car extends Vehicle +{ +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/DiscriminatorGroup/Vehicle.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/DiscriminatorGroup/Vehicle.php new file mode 100644 index 0000000000..77add2ede7 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/DiscriminatorGroup/Vehicle.php @@ -0,0 +1,40 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures\DiscriminatorGroup; + +use JMS\Serializer\Annotation as Serializer; + +/** + * @Serializer\Discriminator(field = "type", groups={"foo"}, map = { + * "car": "JMS\Serializer\Tests\Fixtures\DiscriminatorGroup\Car" + * }) + */ +abstract class Vehicle +{ + /** + * @Serializer\Type("integer") + * @Serializer\Groups({"foo"}) + */ + public $km; + + public function __construct($km) + { + $this->km = (integer) $km; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Doctrine/Author.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Doctrine/Author.php new file mode 100644 index 0000000000..614a4dadf8 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Doctrine/Author.php @@ -0,0 +1,50 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures\Doctrine; + +use JMS\Serializer\Annotation\Type; +use JMS\Serializer\Annotation\SerializedName; + +use Doctrine\ORM\Mapping as ORM; + +/** @ORM\Entity */ +class Author +{ + /** + * @ORM\Id @ORM\Column(type="integer") + */ + protected $id; + + /** + * @ORM\Column(type="string") + * @SerializedName("full_name") + */ + private $name; + + public function __construct($name, $id = null) + { + $this->name = $name; + $this->id = $id; + } + + public function getName() + { + return $this->name; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Doctrine/BlogPost.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Doctrine/BlogPost.php new file mode 100644 index 0000000000..bf610e4c54 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Doctrine/BlogPost.php @@ -0,0 +1,117 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures\Doctrine; + +use JMS\Serializer\Annotation as Serializer; +use JMS\Serializer\Annotation\SerializedName; +use JMS\Serializer\Annotation\XmlRoot; +use JMS\Serializer\Annotation\XmlAttribute; +use JMS\Serializer\Annotation\XmlList; +use JMS\Serializer\Annotation\Groups; +use JMS\Serializer\Annotation\Type; +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\ORM\Mapping as ORM; + +/** + * @ORM\Entity + * @XmlRoot("blog-post") + */ +class BlogPost +{ + /** + * @ORM\Id @ORM\Column(type="integer") + */ + protected $id; + + /** + * @ORM\Column(type="string") + * @Groups({"comments","post"}) + */ + private $title; + + /** + * @ORM\Column(type="some_custom_type") + */ + protected $slug; + + /** + * @ORM\Column(type="datetime") + * @XmlAttribute + */ + private $createdAt; + + /** + * @ORM\Column(type="boolean") + * @Type("integer") + * This boolean to integer conversion is one of the few changes between this + * and the standard BlogPost class. It's used to test the override behavior + * of the DoctrineTypeDriver so notice it, but please don't change it. + * + * @SerializedName("is_published") + * @Groups({"post"}) + * @XmlAttribute + */ + private $published; + + /** + * @ORM\OneToMany(targetEntity="Comment", mappedBy="blogPost") + * @XmlList(inline=true, entry="comment") + * @Groups({"comments"}) + */ + private $comments; + + /** + * @ORM\OneToOne(targetEntity="Author") + * @Groups({"post"}) + */ + private $author; + + /** + * @ORM\Column(type="integer") + * @Serializer\Exclude() + */ + private $ref; + + public function __construct($title, Author $author, \DateTime $createdAt) + { + $this->title = $title; + $this->author = $author; + $this->published = false; + $this->comments = new ArrayCollection(); + $this->createdAt = $createdAt; + } + + public function setPublished() + { + $this->published = true; + } + + public function addComment(Comment $comment) + { + $this->comments->add($comment); + } + + /** + * @Serializer\VirtualProperty() + */ + public function getRef() + { + return $this->ref; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Doctrine/Comment.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Doctrine/Comment.php new file mode 100644 index 0000000000..f1fa126dc3 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Doctrine/Comment.php @@ -0,0 +1,57 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures\Doctrine; + +use JMS\Serializer\Annotation\Type; +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\ORM\Mapping as ORM; + +/** @ORM\Entity */ +class Comment +{ + /** + * @ORM\Id @ORM\Column(type="integer") + */ + protected $id; + + /** + * @ORM\Column(type="Author") + */ + private $author; + + /** @ORM\ManyToOne(targetEntity="BlogPost") */ + private $blogPost; + + /** + * @ORM\Column(type="string") + */ + private $text; + + public function __construct(Author $author, $text) + { + $this->author = $author; + $this->text = $text; + $this->blogPost = new ArrayCollection(); + } + + public function getAuthor() + { + return $this->author; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Doctrine/SingleTableInheritance/AbstractModel.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Doctrine/SingleTableInheritance/AbstractModel.php new file mode 100644 index 0000000000..d6994e476f --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Doctrine/SingleTableInheritance/AbstractModel.php @@ -0,0 +1,10 @@ +teacher = $teacher; + $this->students = new ArrayCollection($students); + } + + public function getId() + { + return $this->id; + } + + public function getTeacher() + { + return $this->teacher; + } + + public function getStudents() + { + return $this->students; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Doctrine/SingleTableInheritance/Organization.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Doctrine/SingleTableInheritance/Organization.php new file mode 100644 index 0000000000..1c386b4fb6 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Doctrine/SingleTableInheritance/Organization.php @@ -0,0 +1,19 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures\DoctrinePHPCR; + +use JMS\Serializer\Annotation\Type; +use JMS\Serializer\Annotation\SerializedName; + +use Doctrine\ODM\PHPCR\Mapping\Annotations as PHPCRODM; + +/** @PHPCRODM\Document */ +class Author +{ + /** + * @PHPCRODM\Id() + */ + protected $id; + + /** + * @PHPCRODM\Field(type="string") + * @SerializedName("full_name") + */ + private $name; + + public function __construct($name) + { + $this->name = $name; + } + + public function getName() + { + return $this->name; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/DoctrinePHPCR/BlogPost.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/DoctrinePHPCR/BlogPost.php new file mode 100644 index 0000000000..aa238bc247 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/DoctrinePHPCR/BlogPost.php @@ -0,0 +1,102 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures\DoctrinePHPCR; + +use JMS\Serializer\Annotation\SerializedName; +use JMS\Serializer\Annotation\XmlRoot; +use JMS\Serializer\Annotation\XmlAttribute; +use JMS\Serializer\Annotation\XmlList; +use JMS\Serializer\Annotation\Groups; +use JMS\Serializer\Annotation\Type; +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\ODM\PHPCR\Mapping\Annotations as PHPCRODM; + +/** + * @PHPCRODM\Document + * @XmlRoot("blog-post") + */ +class BlogPost +{ + /** + * @PHPCRODM\Id() + */ + protected $id; + + /** + * @PHPCRODM\Field(type="string") + * @Groups({"comments","post"}) + */ + private $title; + + /** + * @PHPCRODM\Field(type="string") + */ + protected $slug; + + /** + * @PHPCRODM\Field(type="date") + * @XmlAttribute + */ + private $createdAt; + + /** + * @PHPCRODM\Field(type="boolean") + * @Type("integer") + * This boolean to integer conversion is one of the few changes between this + * and the standard BlogPost class. It's used to test the override behavior + * of the DoctrineTypeDriver so notice it, but please don't change it. + * + * @SerializedName("is_published") + * @Groups({"post"}) + * @XmlAttribute + */ + private $published; + + /** + * @PHPCRODM\ReferenceMany(targetDocument="Comment", property="blogPost") + * @XmlList(inline=true, entry="comment") + * @Groups({"comments"}) + */ + private $comments; + + /** + * @PHPCRODM\ReferenceOne(targetDocument="Author") + * @Groups({"post"}) + */ + private $author; + + public function __construct($title, Author $author, \DateTime $createdAt) + { + $this->title = $title; + $this->author = $author; + $this->published = false; + $this->comments = new ArrayCollection(); + $this->createdAt = $createdAt; + } + + public function setPublished() + { + $this->published = true; + } + + public function addComment(Comment $comment) + { + $this->comments->add($comment); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/DoctrinePHPCR/Comment.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/DoctrinePHPCR/Comment.php new file mode 100644 index 0000000000..936de482c5 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/DoctrinePHPCR/Comment.php @@ -0,0 +1,57 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures\DoctrinePHPCR; + +use JMS\Serializer\Annotation\Type; +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\ODM\PHPCR\Mapping\Annotations as PHPCRODM; + +/** @PHPCRODM\Document */ +class Comment +{ + /** + * @PHPCRODM\Id() + */ + protected $id; + + /** + * @PHPCRODM\ReferenceOne(targetDocument="Author") + */ + private $author; + + /** @PHPCRODM\ReferenceOne(targetDocument="BlogPost") */ + private $blogPost; + + /** + * @PHPCRODM\Field(type="string") + */ + private $text; + + public function __construct(Author $author, $text) + { + $this->author = $author; + $this->text = $text; + $this->blogPost = new ArrayCollection(); + } + + public function getAuthor() + { + return $this->author; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ExclusionStrategy/AlwaysExcludeExclusionStrategy.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ExclusionStrategy/AlwaysExcludeExclusionStrategy.php new file mode 100644 index 0000000000..184a0e7084 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ExclusionStrategy/AlwaysExcludeExclusionStrategy.php @@ -0,0 +1,21 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\Type; + +class Garage +{ + /** + * @Type("array") + */ + public $vehicles; + + public function __construct($vehicles) { + $this->vehicles = $vehicles; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/GetSetObject.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/GetSetObject.php new file mode 100644 index 0000000000..cfa369a6ff --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/GetSetObject.php @@ -0,0 +1,65 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\AccessType; +use JMS\Serializer\Annotation\Exclude; +use JMS\Serializer\Annotation\Type; +use JMS\Serializer\Annotation\ReadOnly; + +/** @AccessType("public_method") */ +class GetSetObject +{ + /** @AccessType("property") @Type("integer") */ + private $id = 1; + + /** @Type("string") */ + private $name = 'Foo'; + + /** + * @ReadOnly + */ + private $readOnlyProperty = 42; + + /** + * This property should be exlcluded + * @Exclude() + */ + private $excludedProperty; + + public function getId() + { + throw new \RuntimeException('This should not be called.'); + } + + public function getName() + { + return 'Johannes'; + } + + public function setName($name) + { + $this->name = $name; + } + + public function getReadOnlyProperty() + { + return $this->readOnlyProperty; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/GroupsObject.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/GroupsObject.php new file mode 100644 index 0000000000..88e4618d42 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/GroupsObject.php @@ -0,0 +1,57 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\Groups; +use JMS\Serializer\Annotation\Type; + +/** blablub */ +class GroupsObject +{ + /** + * @Groups({"foo"}) + * @Type("string") + */ + private $foo; + + /** + * @Groups({"foo","bar"}) + * @Type("string") + */ + private $foobar; + + /** + * @Groups({"bar", "Default"}) + * @Type("string") + */ + private $bar; + + /** + * @Type("string") + */ + private $none; + + public function __construct() + { + $this->foo = "foo"; + $this->bar = "bar"; + $this->foobar = "foobar"; + $this->none = "none"; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/GroupsUser.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/GroupsUser.php new file mode 100644 index 0000000000..534df6516f --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/GroupsUser.php @@ -0,0 +1,48 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\Groups; + +class GroupsUser +{ + private $name; + + /** + * @Groups({"nickname_group"}) + */ + private $nickname = 'nickname'; + + /** + * @Groups({"manager_group"}) + */ + private $manager; + + /** + * @Groups({"friends_group"}) + */ + private $friends; + + public function __construct($name, GroupsUser $manager = null, array $friends = array()) + { + $this->name = $name; + $this->manager = $manager; + $this->friends = $friends; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/IndexedCommentsBlogPost.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/IndexedCommentsBlogPost.php new file mode 100644 index 0000000000..446f9776e1 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/IndexedCommentsBlogPost.php @@ -0,0 +1,73 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\Accessor; +use JMS\Serializer\Annotation\XmlMap; +use JMS\Serializer\Annotation\XmlRoot; +use JMS\Serializer\Annotation\XmlList; +use JMS\Serializer\Annotation\XmlAttribute; + +/** @XmlRoot("post") */ +class IndexedCommentsBlogPost +{ + /** + * @XmlMap(keyAttribute="author-name", inline=true, entry="comments") + * @Accessor(getter="getCommentsIndexedByAuthor") + */ + private $comments = array(); + + public function __construct() + { + $author = new Author('Foo'); + $this->comments[] = new Comment($author, 'foo'); + $this->comments[] = new Comment($author, 'bar'); + } + + public function getCommentsIndexedByAuthor() + { + $indexedComments = array(); + foreach ($this->comments as $comment) { + $authorName = $comment->getAuthor()->getName(); + + if (!isset($indexedComments[$authorName])) { + $indexedComments[$authorName] = new IndexedCommentsList(); + } + + $indexedComments[$authorName]->addComment($comment); + } + + return $indexedComments; + } +} + +class IndexedCommentsList +{ + /** @XmlList(inline=true, entry="comment") */ + private $comments = array(); + + /** @XmlAttribute */ + private $count = 0; + + public function addComment(Comment $comment) + { + $this->comments[] = $comment; + $this->count += 1; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/InitializedBlogPostConstructor.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/InitializedBlogPostConstructor.php new file mode 100644 index 0000000000..3b7dc69525 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/InitializedBlogPostConstructor.php @@ -0,0 +1,43 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use Doctrine\Common\Collections\ArrayCollection; + +use JMS\Serializer\Metadata\ClassMetadata; +use JMS\Serializer\DeserializationContext; + +use JMS\Serializer\Construction\ObjectConstructorInterface; +use JMS\Serializer\VisitorInterface; + +use JMS\Serializer\Tests\Fixtures\Author; +use JMS\Serializer\Tests\Fixtures\Publisher; +use JMS\Serializer\Construction\UnserializeObjectConstructor; + +class InitializedBlogPostConstructor extends UnserializeObjectConstructor +{ + public function construct(VisitorInterface $visitor, ClassMetadata $metadata, $data, array $type, DeserializationContext $context) + { + if ($type['name'] !== 'JMS\Serializer\Tests\Fixtures\BlogPost') { + return parent::construct($visitor, $metadata, $data, $type); + } + + return new BlogPost('This is a nice title.', new Author('Foo Bar'), new \DateTime('2011-07-30 00:00', new \DateTimeZone('UTC')), new Publisher('Bar Foo')); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/InitializedObjectConstructor.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/InitializedObjectConstructor.php new file mode 100644 index 0000000000..f5bbcd8e40 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/InitializedObjectConstructor.php @@ -0,0 +1,56 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\VisitorInterface; +use JMS\Serializer\Metadata\ClassMetadata; +use JMS\Serializer\DeserializationContext; +use JMS\Serializer\Construction\ObjectConstructorInterface; + +/** + * Object constructor that allows deserialization into already constructed + * objects passed through the deserialization context + */ +class InitializedObjectConstructor implements ObjectConstructorInterface +{ + private $fallbackConstructor; + + /** + * Constructor. + * + * @param ObjectConstructorInterface $fallbackConstructor Fallback object constructor + */ + public function __construct(ObjectConstructorInterface $fallbackConstructor) + { + $this->fallbackConstructor = $fallbackConstructor; + } + + /** + * {@inheritdoc} + */ + public function construct(VisitorInterface $visitor, ClassMetadata $metadata, $data, array $type, DeserializationContext $context) + { + if ($context->attributes->containsKey('target') && $context->getDepth() === 1) { + return $context->attributes->get('target')->get(); + } + + return $this->fallbackConstructor->construct($visitor, $metadata, $data, $type, $context); + } + +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/InlineChild.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/InlineChild.php new file mode 100644 index 0000000000..645bb37e82 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/InlineChild.php @@ -0,0 +1,35 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation as Serializer; +use JMS\Serializer\Annotation\Type; + +class InlineChild +{ + /** + * @Type("string") + */ + public $a = 'a'; + + /** + * @Type("string") + */ + public $b = 'b'; +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/InlineChildEmpty.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/InlineChildEmpty.php new file mode 100644 index 0000000000..fc69a3edb9 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/InlineChildEmpty.php @@ -0,0 +1,26 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation as Serializer; + +class InlineChildEmpty +{ + +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/InlineChildWithGroups.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/InlineChildWithGroups.php new file mode 100644 index 0000000000..ceb592bab5 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/InlineChildWithGroups.php @@ -0,0 +1,37 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation as Serializer; +use JMS\Serializer\Annotation\Type; + +class InlineChildWithGroups +{ + /** + * @Type("string") + * @Serializer\Groups({"a"}) + */ + public $a = 'a'; + + /** + * @Type("string") + * @Serializer\Groups({"b"}) + */ + public $b = 'b'; +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/InlineParent.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/InlineParent.php new file mode 100644 index 0000000000..39b71a614d --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/InlineParent.php @@ -0,0 +1,46 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation as Serializer; +use JMS\Serializer\Annotation\Type; + +/** @Serializer\AccessorOrder("alphabetical") */ +class InlineParent +{ + /** + * @Type("string") + */ + private $c = 'c'; + + /** + * @Type("string") + */ + private $d = 'd'; + + /** + * @Serializer\Inline + */ + private $child; + + public function __construct($child = null) + { + $this->child = $child ?: new InlineChild(); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Input.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Input.php new file mode 100644 index 0000000000..a052ba395f --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Input.php @@ -0,0 +1,41 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation as Serializer; + +/** + * @Serializer\XmlRoot("input") + */ +class Input +{ + /** + * @Serializer\XmlAttributeMap + */ + private $attributes; + + public function __construct($attributes = null) + { + $this->attributes = $attributes ?: array( + 'type' => 'text', + 'name' => 'firstname', + 'value' => 'Adrien', + ); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/InvalidGroupsObject.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/InvalidGroupsObject.php new file mode 100644 index 0000000000..737a167c80 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/InvalidGroupsObject.php @@ -0,0 +1,31 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\Groups; +use JMS\Serializer\Annotation\Type; + +class InvalidGroupsObject +{ + /** + * @Groups({"foo, bar"}) + * @Type("string") + */ + private $foo; +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/InvalidUsageOfXmlValue.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/InvalidUsageOfXmlValue.php new file mode 100644 index 0000000000..4001433b28 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/InvalidUsageOfXmlValue.php @@ -0,0 +1,30 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\XmlValue; + +/** Dummy */ +class InvalidUsageOfXmlValue +{ + /** @XmlValue */ + private $value = 'bar'; + + private $element = 'foo'; +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Log.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Log.php new file mode 100644 index 0000000000..2fe9068888 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Log.php @@ -0,0 +1,55 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\XmlRoot; +use JMS\Serializer\Annotation\SerializedName; +use JMS\Serializer\Annotation\XmlList; +use JMS\Serializer\Annotation\XmlMap; +use JMS\Serializer\Annotation\Type; + +/** @XmlRoot("log") */ +class Log +{ + /** + * @SerializedName("author_list") + * @XmlMap + * @Type("AuthorList") + */ + private $authors; + + /** + * @XmlList(inline=true, entry = "comment") + * @Type("array") + */ + private $comments; + + public function __construct() + { + $this->authors = new AuthorList(); + $this->authors->add(new Author('Johannes Schmitt')); + $this->authors->add(new Author('John Doe')); + + $author = new Author('Foo Bar'); + $this->comments = array(); + $this->comments[] = new Comment($author, 'foo'); + $this->comments[] = new Comment($author, 'bar'); + $this->comments[] = new Comment($author, 'baz'); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/MaxDepth/Gh236Bar.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/MaxDepth/Gh236Bar.php new file mode 100644 index 0000000000..ab08c13592 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/MaxDepth/Gh236Bar.php @@ -0,0 +1,19 @@ +a = new Gh236Bar(); + $this->a->inner = new Gh236Bar(); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/NamedDateTimeArraysObject.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/NamedDateTimeArraysObject.php new file mode 100644 index 0000000000..8b88032241 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/NamedDateTimeArraysObject.php @@ -0,0 +1,47 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\Type; +use JMS\Serializer\Annotation\XmlMap; +use JMS\Serializer\Annotation\XmlList; +use JMS\Serializer\Annotation\XmlKeyValuePairs; + + +class NamedDateTimeArraysObject +{ + /** + * @var \DateTime[] + * @Type("array>") + * @XmlKeyValuePairs + */ + private $namedArrayWithFormattedDate; + + function __construct($namedArrayWithFormattedDate) + { + $this->namedArrayWithFormattedDate = $namedArrayWithFormattedDate; + } + + /** + * @return \DateTime[] + */ + public function getNamedArrayWithFormattedDate() + { + return $this->namedArrayWithFormattedDate; + } +} \ No newline at end of file diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/NamedDateTimeImmutableArraysObject.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/NamedDateTimeImmutableArraysObject.php new file mode 100644 index 0000000000..60416cb8d1 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/NamedDateTimeImmutableArraysObject.php @@ -0,0 +1,44 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\Type; +use JMS\Serializer\Annotation\XmlKeyValuePairs; + +class NamedDateTimeImmutableArraysObject +{ + /** + * @var \DateTime[] + * @Type("array>") + * @XmlKeyValuePairs + */ + private $namedArrayWithFormattedDate; + + function __construct($namedArrayWithFormattedDate) + { + $this->namedArrayWithFormattedDate = $namedArrayWithFormattedDate; + } + + /** + * @return \DateTimeImmutable[] + */ + public function getNamedArrayWithFormattedDate() + { + return $this->namedArrayWithFormattedDate; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Node.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Node.php new file mode 100644 index 0000000000..0de749cead --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Node.php @@ -0,0 +1,36 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation as Serializer; + +class Node +{ + /** + * @Serializer\MaxDepth(2) + */ + public $children; + + public $foo = 'bar'; + + public function __construct($children = array()) + { + $this->children = $children; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithAbsentXmlListNode.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithAbsentXmlListNode.php new file mode 100644 index 0000000000..739c643bc6 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithAbsentXmlListNode.php @@ -0,0 +1,47 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation as Serializer; + +class ObjectWithAbsentXmlListNode +{ + /** + * @Serializer\XmlList(inline=false, entry="comment", skipWhenEmpty=true) + * @Serializer\Type("array") + */ + public $absent; + /** + * @Serializer\XmlList(inline=false, entry="comment", skipWhenEmpty=false) + * @Serializer\Type("array") + */ + public $present; + + /** + * @Serializer\XmlList(inline=false, entry="comment") + * @Serializer\Type("array") + */ + public $skipDefault; + + /** + * @Serializer\XmlList(inline=false, namespace="http://www.example.com") + * @Serializer\Type("array") + */ + public $absentAndNs; +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithEmptyArrayAndHash.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithEmptyArrayAndHash.php new file mode 100644 index 0000000000..6376b82717 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithEmptyArrayAndHash.php @@ -0,0 +1,45 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation as Serializer; + +class ObjectWithEmptyArrayAndHash +{ + /** + * @Serializer\Type("array") + * @Serializer\SkipWhenEmpty() + */ + private $hash = array(); + /** + * @Serializer\Type("array") + * @Serializer\SkipWhenEmpty() + */ + private $array = array(); + + /** + * @Serializer\SkipWhenEmpty() + */ + private $object = array(); + + public function __construct() + { + $this->object = new InlineChildEmpty(); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithEmptyHash.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithEmptyHash.php new file mode 100644 index 0000000000..032b6d09ce --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithEmptyHash.php @@ -0,0 +1,30 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation as Serializer; + +class ObjectWithEmptyHash +{ + /** + * @Serializer\Type("array") + * @Serializer\XmlList(skipWhenEmpty=false) + */ + private $hash = array(); +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithEmptyNullableAndEmptyArrays.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithEmptyNullableAndEmptyArrays.php new file mode 100644 index 0000000000..b8a0b17bbd --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithEmptyNullableAndEmptyArrays.php @@ -0,0 +1,80 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation as Serializer; + +class ObjectWithEmptyNullableAndEmptyArrays +{ + /** + * @Serializer\XmlList(inline = true, entry = "comment") + * @Serializer\Type("array") + */ + public $null_inline = null; + + /** + * @Serializer\XmlList(inline = true, entry = "comment") + * @Serializer\Type("array") + */ + public $empty_inline = []; + + + /** + * @Serializer\XmlList(inline = true, entry = "comment") + * @Serializer\Type("array") + */ + public $not_empty_inline = ['not_empty_inline']; + + /** + * @Serializer\XmlList(inline = false, entry = "comment") + * @Serializer\Type("array") + */ + public $null_not_inline = null; + + /** + * @Serializer\XmlList(inline = false, entry = "comment") + * @Serializer\Type("array") + */ + public $empty_not_inline = []; + + /** + * @Serializer\XmlList(inline = false, entry = "comment", skipWhenEmpty=false) + * @Serializer\Type("array") + */ + public $not_empty_not_inline = ['not_empty_not_inline']; + + /** + * @Serializer\XmlList(inline = false, entry = "comment", skipWhenEmpty=false) + * @Serializer\Type("array") + */ + public $null_not_inline_skip = null; + + /** + * @Serializer\XmlList(inline = false, entry = "comment", skipWhenEmpty=false) + * @Serializer\Type("array") + */ + public $empty_not_inline_skip = []; + + + /** + * @Serializer\XmlList(inline = false, entry = "comment", skipWhenEmpty=false) + * @Serializer\Type("array") + */ + public $not_empty_not_inline_skip = ['not_empty_not_inline_skip']; +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithExpressionVirtualPropertiesAndExcludeAll.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithExpressionVirtualPropertiesAndExcludeAll.php new file mode 100644 index 0000000000..7afe283d30 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithExpressionVirtualPropertiesAndExcludeAll.php @@ -0,0 +1,38 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\VirtualProperty; +use JMS\Serializer\Annotation\ExclusionPolicy; + +/** + * @VirtualProperty( + * "virtualValue", + * exp="object.getVirtualValue()" + * ) + * @ExclusionPolicy("all") + */ +class ObjectWithExpressionVirtualPropertiesAndExcludeAll +{ + + public function getVirtualValue() + { + return 'value'; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithHandlerCallbacks.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithHandlerCallbacks.php new file mode 100644 index 0000000000..3ab9c3d2db --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithHandlerCallbacks.php @@ -0,0 +1,46 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\HandlerCallback; +use JMS\Serializer\Annotation\Type; + +class ObjectWithHandlerCallbacks +{ + /** + * @Type("string") + */ + public $name; + + /** + * @HandlerCallback(direction="serialization", format="json") + */ + public function toJson() + { + return $this->name; + } + + /** + * @HandlerCallback(direction="serialization", format="xml") + */ + public function toXml() + { + return $this->name; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithIntListAndIntMap.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithIntListAndIntMap.php new file mode 100644 index 0000000000..f5f1e8da8a --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithIntListAndIntMap.php @@ -0,0 +1,20 @@ +") @Serializer\XmlList */ + private $list; + + /** @Serializer\Type("array") @Serializer\XmlMap */ + private $map; + + public function __construct(array $list, array $map) + { + $this->list = $list; + $this->map = $map; + } +} \ No newline at end of file diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithLifecycleCallbacks.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithLifecycleCallbacks.php new file mode 100644 index 0000000000..ca22593196 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithLifecycleCallbacks.php @@ -0,0 +1,74 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\Exclude; +use JMS\Serializer\Annotation\PreSerialize; +use JMS\Serializer\Annotation\PostSerialize; +use JMS\Serializer\Annotation\PostDeserialize; +use JMS\Serializer\Annotation\Type; + +class ObjectWithLifecycleCallbacks +{ + /** + * @Exclude + */ + private $firstname; + + /** + * @Exclude + */ + private $lastname; + + /** + * @Type("string") + */ + private $name; + + public function __construct($firstname = 'Foo', $lastname = 'Bar') + { + $this->firstname = $firstname; + $this->lastname = $lastname; + } + + /** + * @PreSerialize + */ + private function prepareForSerialization() + { + $this->name = $this->firstname.' '.$this->lastname; + } + + /** + * @PostSerialize + */ + private function cleanUpAfterSerialization() + { + $this->name = null; + } + + /** + * @PostDeserialize + */ + private function afterDeserialization() + { + list($this->firstname, $this->lastname) = explode(' ', $this->name); + $this->name = null; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithNamespacesAndList.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithNamespacesAndList.php new file mode 100644 index 0000000000..2bca2c7ac7 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithNamespacesAndList.php @@ -0,0 +1,103 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\SerializedName; +use JMS\Serializer\Annotation\Type; +use JMS\Serializer\Annotation\XmlRoot; +use JMS\Serializer\Annotation\XmlNamespace; +use JMS\Serializer\Annotation\XmlElement; +use JMS\Serializer\Annotation\XmlList; +use JMS\Serializer\Annotation\XmlMap; +/** + * @XmlRoot("ObjectWithNamespacesAndList", namespace="http://example.com/namespace") + * @XmlNamespace(uri="http://example.com/namespace") + * @XmlNamespace(uri="http://example.com/namespace2", prefix="x") + */ +class ObjectWithNamespacesAndList +{ + /** + * @Type("string") + * @SerializedName("name") + * @XmlElement(namespace="http://example.com/namespace") + */ + public $name; + /** + * @Type("string") + * @SerializedName("name") + * @XmlElement(namespace="http://example.com/namespace2") + */ + public $nameAlternativeB; + + /** + * @Type("array") + * @SerializedName("phones") + * @XmlElement(namespace="http://example.com/namespace2") + * @XmlList(inline = false, entry = "phone", namespace="http://example.com/namespace2") + */ + public $phones; + /** + * @Type("array") + * @SerializedName("addresses") + * @XmlElement(namespace="http://example.com/namespace2") + * @XmlMap(inline = false, entry = "address", keyAttribute = "id", namespace="http://example.com/namespace2") + */ + public $addresses; + + /** + * @Type("array") + * @SerializedName("phones") + * @XmlList(inline = true, entry = "phone", namespace="http://example.com/namespace") + */ + public $phonesAlternativeB; + /** + * @Type("array") + * @SerializedName("addresses") + * @XmlMap(inline = true, entry = "address", keyAttribute = "id", namespace="http://example.com/namespace") + */ + public $addressesAlternativeB; + + /** + * @Type("array") + * @SerializedName("phones") + * @XmlList(inline = true, entry = "phone", namespace="http://example.com/namespace2") + */ + public $phonesAlternativeC; + /** + * @Type("array") + * @SerializedName("addresses") + * @XmlMap(inline = true, entry = "address", keyAttribute = "id", namespace="http://example.com/namespace2") + */ + public $addressesAlternativeC; + + /** + * @Type("array") + * @SerializedName("phones") + * @XmlList(inline = false, entry = "phone") + */ + public $phonesAlternativeD; + /** + * @Type("array") + * @SerializedName("addresses") + * @XmlMap(inline = false, entry = "address", keyAttribute = "id") + */ + public $addressesAlternativeD; + +} + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithNullProperty.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithNullProperty.php new file mode 100644 index 0000000000..7434434a87 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithNullProperty.php @@ -0,0 +1,26 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Tests\Fixtures\SimpleObject; + +class ObjectWithNullProperty extends SimpleObject +{ + private $nullProperty = null; +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithObjectProperty.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithObjectProperty.php new file mode 100644 index 0000000000..ea56a567bf --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithObjectProperty.php @@ -0,0 +1,53 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\Type; + + +class ObjectWithObjectProperty +{ + /** + * @Type("string") + */ + private $foo; + + /** + * @Type("JMS\Serializer\Tests\Fixtures\Author") + */ + private $author; + + /** + * @return string + */ + public function getFoo() + { + return $this->foo; + } + + /** + * @return \JMS\Serializer\Tests\Fixtures\Author + */ + public function getAuthor() + { + return $this->author; + } + + +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithToString.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithToString.php new file mode 100644 index 0000000000..e4df6b9299 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithToString.php @@ -0,0 +1,34 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +class ObjectWithToString +{ + private $input; + + public function __construct($input) + { + $this->input = $input; + } + + public function __toString() + { + return $this->input; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithVersionedVirtualProperties.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithVersionedVirtualProperties.php new file mode 100644 index 0000000000..67c3d79fd6 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithVersionedVirtualProperties.php @@ -0,0 +1,57 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\Groups; +use JMS\Serializer\Annotation\XmlValue; +use JMS\Serializer\Annotation\XmlAttribute; +use JMS\Serializer\Annotation\XmlList; +use JMS\Serializer\Annotation\XmlMap; +use JMS\Serializer\Annotation\Since; +use JMS\Serializer\Annotation\Until; +use JMS\Serializer\Annotation\VirtualProperty; +use JMS\Serializer\Annotation\SerializedName; + +/** + * dummy comment + */ +class ObjectWithVersionedVirtualProperties +{ + /** + * @Groups({"versions"}) + * @VirtualProperty + * @SerializedName("low") + * @Until("8") + */ + public function getVirualLowValue() + { + return 1; + } + + /** + * @Groups({"versions"}) + * @VirtualProperty + * @SerializedName("high") + * @Since("6") + */ + public function getVirualHighValue() + { + return 8; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithVirtualProperties.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithVirtualProperties.php new file mode 100644 index 0000000000..c6e7f35d97 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithVirtualProperties.php @@ -0,0 +1,64 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\AccessorOrder; +use JMS\Serializer\Annotation\Type; +use JMS\Serializer\Annotation\VirtualProperty; +use JMS\Serializer\Annotation\SerializedName; +use JMS\Serializer\Annotation\Exclude; + +/** + * @AccessorOrder("custom", custom = {"prop_name", "existField", "foo" }) + */ +class ObjectWithVirtualProperties +{ + + /** + * @Type("string") + */ + protected $existField = 'value'; + + /** + * + * @VirtualProperty + */ + public function getVirtualValue() + { + return 'value'; + } + + /** + * @VirtualProperty + * @SerializedName("test") + */ + public function getVirtualSerializedValue() + { + return 'other-name'; + } + + /** + * @VirtualProperty + * @Type("integer") + */ + public function getTypedVirtualProperty() + { + return '1'; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithVirtualPropertiesAndExcludeAll.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithVirtualPropertiesAndExcludeAll.php new file mode 100644 index 0000000000..a39b96bde2 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithVirtualPropertiesAndExcludeAll.php @@ -0,0 +1,36 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\VirtualProperty; +use JMS\Serializer\Annotation\ExclusionPolicy; + +/** + * @ExclusionPolicy("all") + */ +class ObjectWithVirtualPropertiesAndExcludeAll +{ + /** + * @VirtualProperty + */ + public function getVirtualValue() + { + return 'value'; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithVirtualXmlProperties.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithVirtualXmlProperties.php new file mode 100644 index 0000000000..7881e8be4c --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithVirtualXmlProperties.php @@ -0,0 +1,108 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\Groups; +use JMS\Serializer\Annotation\XmlValue; +use JMS\Serializer\Annotation\XmlAttribute; +use JMS\Serializer\Annotation\XmlList; +use JMS\Serializer\Annotation\XmlMap; +use JMS\Serializer\Annotation\Since; +use JMS\Serializer\Annotation\Until; +use JMS\Serializer\Annotation\VirtualProperty; +use JMS\Serializer\Annotation\SerializedName; + +class ObjectWithVirtualXmlProperties +{ + + /** + * + * @VirtualProperty + * @SerializedName("foo") + * @Groups({"attributes"}) + * @XmlAttribute + */ + public function getVirualXmlAttributeValue() + { + return 'bar'; + } + + /** + * + * @VirtualProperty + * @SerializedName("xml-value") + * @Groups({"values"}) + * @XmlValue + */ + public function getVirualXmlValue() + { + return 'xml-value'; + } + + /** + * + * @VirtualProperty + * @SerializedName("list") + * @Groups({"list"}) + * @XmlList(inline = true, entry = "val") + */ + public function getVirualXmlList() + { + return array('One','Two'); + } + + /** + * + * @VirtualProperty + * @SerializedName("map") + * @Groups({"map"}) + * @XmlMap(keyAttribute = "key") + */ + public function getVirualXmlMap() + { + return array( + 'key-one' => 'One', + 'key-two' => 'Two' + ); + } + + /** + * + * @VirtualProperty + * @SerializedName("low") + * @Groups({"versions"}) + * @Until("8") + */ + public function getVirualLowValue() + { + return 1; + } + + /** + * @VirtualProperty + * @SerializedName("hight") + * @Groups({"versions"}) + * @Since("8") + */ + public function getVirualHighValue() + { + return 8; + } + +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithXmlKeyValuePairs.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithXmlKeyValuePairs.php new file mode 100644 index 0000000000..95a3469fd9 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithXmlKeyValuePairs.php @@ -0,0 +1,46 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\XmlKeyValuePairs; + +class ObjectWithXmlKeyValuePairs +{ + /** + * @var array + * @XmlKeyValuePairs + */ + private $array = array( + 'key-one' => 'foo', + 'key-two' => 1, + 'nested-array' => array( + 'bar' => 'foo', + ), + 'without-keys' => array( + 1, + 'test' + ), + 'mixed' => array( + 'test', + 'foo' => 'bar', + '1_foo' => 'bar' + ), + 1 => 'foo' + ); +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithXmlNamespaces.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithXmlNamespaces.php new file mode 100644 index 0000000000..84345ed0d4 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithXmlNamespaces.php @@ -0,0 +1,73 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\Type; +use JMS\Serializer\Annotation\XmlRoot; +use JMS\Serializer\Annotation\XmlNamespace; +use JMS\Serializer\Annotation\XmlElement; +use JMS\Serializer\Annotation\XmlAttribute; + +/** + * @XmlRoot("test-object", namespace="http://example.com/namespace") + * @XmlNamespace(uri="http://example.com/namespace") + * @XmlNamespace(uri="http://schemas.google.com/g/2005", prefix="gd") + * @XmlNamespace(uri="http://www.w3.org/2005/Atom", prefix="atom") + */ +class ObjectWithXmlNamespaces +{ + /** + * @Type("string") + * @XmlElement(namespace="http://purl.org/dc/elements/1.1/"); + */ + private $title; + + /** + * @Type("DateTime") + * @XmlAttribute + */ + private $createdAt; + + /** + * @Type("string") + * @XmlAttribute(namespace="http://schemas.google.com/g/2005") + */ + private $etag; + + /** + * @Type("string") + * @XmlElement(namespace="http://www.w3.org/2005/Atom") + */ + private $author; + + /** + * @Type("string") + * @XmlAttribute(namespace="http://purl.org/dc/elements/1.1/"); + */ + private $language; + + public function __construct($title, $author, \DateTime $createdAt, $language) + { + $this->title = $title; + $this->author = $author; + $this->createdAt = $createdAt; + $this->language = $language; + $this->etag = sha1($this->createdAt->format(\DateTime::ISO8601)); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithXmlNamespacesAndObjectProperty.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithXmlNamespacesAndObjectProperty.php new file mode 100644 index 0000000000..8340bb679e --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithXmlNamespacesAndObjectProperty.php @@ -0,0 +1,49 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\Type; +use JMS\Serializer\Annotation\XmlRoot; +use JMS\Serializer\Annotation\XmlNamespace; +use JMS\Serializer\Annotation\XmlElement; + +/** + * @XmlRoot("property:test-object", namespace="http://example.com/namespace-property") + * @XmlNamespace(uri="http://example.com/namespace-property", prefix="property") + */ +class ObjectWithXmlNamespacesAndObjectProperty +{ + /** + * @Type("string") + * @XmlElement(namespace="http://example.com/namespace-property"); + */ + private $title; + + /** + * @Type("JMS\Serializer\Tests\Fixtures\ObjectWithXmlNamespacesAndObjectPropertyAuthor") + * @XmlElement(namespace="http://example.com/namespace-property") + */ + private $author; + + public function __construct($title, $author) + { + $this->title = $title; + $this->author = $author; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithXmlNamespacesAndObjectPropertyAuthor.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithXmlNamespacesAndObjectPropertyAuthor.php new file mode 100644 index 0000000000..458347c852 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithXmlNamespacesAndObjectPropertyAuthor.php @@ -0,0 +1,53 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\Type; +use JMS\Serializer\Annotation\XmlNamespace; +use JMS\Serializer\Annotation\XmlElement; + +/** + * @XmlNamespace(uri="http://example.com/namespace-author") + */ +class ObjectWithXmlNamespacesAndObjectPropertyAuthor +{ + /** + * @Type("string") + * @XmlElement(namespace="http://example.com/namespace-modified"); + */ + private $author; + + /** + * @Type("string") + * @XmlElement(namespace="http://example.com/namespace-author"); + */ + private $info = "hidden-info"; + + /** + * @Type("string") + * @XmlElement(namespace="http://example.com/namespace-property") + */ + private $name; + + public function __construct($name, $author) + { + $this->name = $name; + $this->author = $author; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithXmlNamespacesAndObjectPropertyVirtual.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithXmlNamespacesAndObjectPropertyVirtual.php new file mode 100644 index 0000000000..30d9bc9c05 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithXmlNamespacesAndObjectPropertyVirtual.php @@ -0,0 +1,49 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\Type; +use JMS\Serializer\Annotation\XmlRoot; +use JMS\Serializer\Annotation\XmlNamespace; +use JMS\Serializer\Annotation\XmlElement; + +/** + * @XmlRoot("property:test-object", namespace="http://example.com/namespace-property") + * @XmlNamespace(uri="http://example.com/namespace-property", prefix="property") + */ +class ObjectWithXmlNamespacesAndObjectPropertyVirtual +{ + /** + * @Type("string") + * @XmlElement(namespace="http://example.com/namespace-property"); + */ + private $title; + + /** + * @Type("ObjectWithXmlNamespacesAndObjectPropertyAuthorVirtual") + * @XmlElement(namespace="http://example.com/namespace-property") + */ + private $author; + + public function __construct($title, $author) + { + $this->title = $title; + $this->author = $author; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithXmlRootNamespace.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithXmlRootNamespace.php new file mode 100644 index 0000000000..f4ca835939 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ObjectWithXmlRootNamespace.php @@ -0,0 +1,68 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\Type; +use JMS\Serializer\Annotation\XmlRoot; +use JMS\Serializer\Annotation\XmlNamespace; +use JMS\Serializer\Annotation\XmlElement; +use JMS\Serializer\Annotation\XmlAttribute; + +/** + * @XmlRoot("test-object", namespace="http://example.com/namespace") + */ +class ObjectWithXmlRootNamespace +{ + /** + * @Type("string") + */ + private $title; + + /** + * @Type("DateTime") + * @XmlAttribute + */ + private $createdAt; + + /** + * @Type("string") + * @XmlAttribute + */ + private $etag; + + /** + * @Type("string") + */ + private $author; + + /** + * @Type("string") + * @XmlAttribute + */ + private $language; + + public function __construct($title, $author, \DateTime $createdAt, $language) + { + $this->title = $title; + $this->author = $author; + $this->createdAt = $createdAt; + $this->language = $language; + $this->etag = sha1($this->createdAt->format(\DateTime::ISO8601)); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Order.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Order.php new file mode 100644 index 0000000000..aef963b3fe --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Order.php @@ -0,0 +1,34 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\XmlRoot; +use JMS\Serializer\Annotation\Type; + +/** @XmlRoot("order") */ +class Order +{ + /** @Type("JMS\Serializer\Tests\Fixtures\Price") */ + private $cost; + + public function __construct(Price $price = null) + { + $this->cost = $price ?: new Price(5); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ParentDoNotSkipWithEmptyChild.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ParentDoNotSkipWithEmptyChild.php new file mode 100644 index 0000000000..7cc30b49b1 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ParentDoNotSkipWithEmptyChild.php @@ -0,0 +1,36 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +class ParentDoNotSkipWithEmptyChild +{ + private $c = 'c'; + + private $d = 'd'; + + /** + * @var InlineChild + */ + private $child; + + public function __construct($child = null) + { + $this->child = $child ?: new InlineChild(); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ParentSkipWithEmptyChild.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ParentSkipWithEmptyChild.php new file mode 100644 index 0000000000..5c05f97382 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/ParentSkipWithEmptyChild.php @@ -0,0 +1,39 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation as Serializer; + +class ParentSkipWithEmptyChild +{ + private $c = 'c'; + + private $d = 'd'; + + /** + * @Serializer\SkipWhenEmpty() + * @var InlineChild + */ + private $child; + + public function __construct($child = null) + { + $this->child = $child ?: new InlineChild(); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Person.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Person.php new file mode 100644 index 0000000000..aec22e94c8 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Person.php @@ -0,0 +1,43 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\XmlAttribute; +use JMS\Serializer\Annotation\XmlValue; +use JMS\Serializer\Annotation\XmlRoot; +use JMS\Serializer\Annotation\XmlElement; +use JMS\Serializer\Annotation\Type; + +/** + * @XmlRoot("child") + */ +class Person +{ + /** + * @Type("string") + * @XmlValue(cdata=false) + */ + public $name; + + /** + * @Type("int") + * @XmlAttribute + */ + public $age; +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/PersonCollection.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/PersonCollection.php new file mode 100644 index 0000000000..090b723708 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/PersonCollection.php @@ -0,0 +1,46 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\XmlRoot; +use JMS\Serializer\Annotation\XmlList; +use Doctrine\Common\Collections\ArrayCollection; +use JMS\Serializer\Annotation\Type; + +/** + * @XmlRoot("person_collection") + */ +class PersonCollection +{ + /** + * @Type("ArrayCollection") + * @XmlList(entry = "person", inline = true) + */ + public $persons; + + /** + * @Type("string") + */ + public $location; + + public function __construct() + { + $this->persons = new ArrayCollection; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/PersonLocation.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/PersonLocation.php new file mode 100644 index 0000000000..62c31d6b75 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/PersonLocation.php @@ -0,0 +1,38 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\XmlRoot; +use JMS\Serializer\Annotation\Type; + +/** + * @XmlRoot("person_location") + */ +class PersonLocation +{ + /** + * @Type("JMS\Serializer\Tests\Fixtures\Person") + */ + public $person; + + /** + * @Type("string") + */ + public $location; +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/PersonSecret.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/PersonSecret.php new file mode 100644 index 0000000000..a2dc13c48f --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/PersonSecret.php @@ -0,0 +1,45 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation as Serializer; + +/** + * @Serializer\ExclusionPolicy("NONE") + * @Serializer\AccessorOrder("custom",custom = {"name", "gender" ,"age"}) + */ +class PersonSecret +{ + /** + * @Serializer\Type("string") + */ + public $name; + + /** + * @Serializer\Type("string") + * @Serializer\Exclude(if="show_data('gender')") + */ + public $gender; + + /** + * @Serializer\Type("string") + * @Serializer\Expose(if="show_data('age')") + */ + public $age; +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/PersonSecretMore.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/PersonSecretMore.php new file mode 100644 index 0000000000..ef7877357a --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/PersonSecretMore.php @@ -0,0 +1,40 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation as Serializer; + +/** + * @Serializer\ExclusionPolicy("ALL") + * @Serializer\AccessorOrder("custom",custom = {"name", "gender"}) + */ +class PersonSecretMore +{ + /** + * @Serializer\Type("string") + * @Serializer\Expose() + */ + public $name; + + /** + * @Serializer\Type("string") + * @Serializer\Expose(if="show_data('gender')") + */ + public $gender; +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/PersonSecretMoreVirtual.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/PersonSecretMoreVirtual.php new file mode 100644 index 0000000000..2f0a64a5b7 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/PersonSecretMoreVirtual.php @@ -0,0 +1,46 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation as Serializer; + +/** + * @Serializer\ExclusionPolicy("ALL") + * @Serializer\AccessorOrder("custom",custom = {"name", "gender"}) + */ +class PersonSecretMoreVirtual +{ + /** + * @Serializer\Type("string") + * @Serializer\Expose() + */ + public $name; + + public $gender; + + /** + * @Serializer\VirtualProperty() + * @Serializer\Type("string") + * @Serializer\Expose(if="show_data('gender')") + */ + public function getGender() + { + return $this->gender; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/PersonSecretVirtual.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/PersonSecretVirtual.php new file mode 100644 index 0000000000..913ff4701c --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/PersonSecretVirtual.php @@ -0,0 +1,54 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation as Serializer; + +/** + * @Serializer\ExclusionPolicy("NONE") + * @Serializer\AccessorOrder("custom",custom = {"name", "gender", "age"}) + */ +class PersonSecretVirtual +{ + /** + * @Serializer\Type("string") + */ + public $name; + + /** + * @Serializer\Exclude() + */ + public $gender; + + /** + * @Serializer\Type("string") + * @Serializer\Expose(if="show_data('age')") + */ + public $age; + + /** + * @Serializer\VirtualProperty() + * @Serializer\Type("string") + * @Serializer\Exclude(if="show_data('gender')") + */ + public function getGender() + { + return $this->gender; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Price.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Price.php new file mode 100644 index 0000000000..501ffdcab5 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Price.php @@ -0,0 +1,40 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\Type; +use JMS\Serializer\Annotation\XmlValue; +use JMS\Serializer\Annotation\XmlRoot; + +/** + * @XmlRoot("price") + */ +class Price +{ + /** + * @Type("float") + * @XmlValue + */ + private $price; + + public function __construct($price) + { + $this->price = $price; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Publisher.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Publisher.php new file mode 100644 index 0000000000..5aa8c38485 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Publisher.php @@ -0,0 +1,49 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\SerializedName; +use JMS\Serializer\Annotation\Type; +use JMS\Serializer\Annotation\XmlRoot; +use JMS\Serializer\Annotation\XmlNamespace; +use JMS\Serializer\Annotation\XmlElement; + +/** + * @XmlRoot("publisher") + * @XmlNamespace(uri="http://example.com/namespace2", prefix="ns2") + */ +class Publisher +{ + /** + * @Type("string") + * @XmlElement(namespace="http://example.com/namespace2") + * @SerializedName("pub_name") + */ + private $name; + + public function __construct($name) + { + $this->name = $name; + } + + public function getName() + { + return $this->name; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/SimpleClassObject.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/SimpleClassObject.php new file mode 100644 index 0000000000..c3d782fe48 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/SimpleClassObject.php @@ -0,0 +1,51 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\XmlNamespace; +use JMS\Serializer\Annotation\Type; +use JMS\Serializer\Annotation\XmlAttribute; +use JMS\Serializer\Annotation\XmlElement; + +/** + * @XmlNamespace(prefix="old_foo", uri="http://old.foo.example.org"); + * @XmlNamespace(prefix="foo", uri="http://foo.example.org"); + * @XmlNamespace(prefix="new_foo", uri="http://new.foo.example.org"); + */ +class SimpleClassObject +{ + /** + * @Type("string") + * @XmlAttribute(namespace="http://old.foo.example.org") + */ + public $foo; + + /** + * @Type("string") + * @XmlElement(namespace="http://foo.example.org") + */ + public $bar; + + /** + * @Type("string") + * @XmlElement(namespace="http://new.foo.example.org") + */ + public $moo; + +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/SimpleObject.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/SimpleObject.php new file mode 100644 index 0000000000..77a968694a --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/SimpleObject.php @@ -0,0 +1,53 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\SerializedName; +use JMS\Serializer\Annotation\Type; + +class SimpleObject +{ + /** @Type("string") */ + private $foo; + + /** + * @SerializedName("moo") + * @Type("string") + */ + private $bar; + + /** @Type("string") */ + protected $camelCase = 'boo'; + + public function __construct($foo, $bar) + { + $this->foo = $foo; + $this->bar = $bar; + } + + public function getFoo() + { + return $this->foo; + } + + public function getBar() + { + return $this->bar; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/SimpleObjectProxy.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/SimpleObjectProxy.php new file mode 100644 index 0000000000..dffa7268cd --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/SimpleObjectProxy.php @@ -0,0 +1,41 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use Doctrine\Common\Persistence\Proxy; + +class SimpleObjectProxy extends SimpleObject implements Proxy +{ + public $__isInitialized__ = false; + + private $baz = 'baz'; + + public function __load() + { + if (!$this->__isInitialized__) { + $this->camelCase = 'proxy-boo'; + $this->__isInitialized__ = true; + } + } + + public function __isInitialized() + { + return $this->__isInitialized__; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/SimpleSubClassObject.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/SimpleSubClassObject.php new file mode 100644 index 0000000000..52f02e2d1f --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/SimpleSubClassObject.php @@ -0,0 +1,52 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\XmlNamespace; +use JMS\Serializer\Annotation\Type; +use JMS\Serializer\Annotation\XmlAttribute; +use JMS\Serializer\Annotation\XmlElement; + +/** + * @XmlNamespace(prefix="old_foo", uri="http://foo.example.org"); + * @XmlNamespace(prefix="foo", uri="http://better.foo.example.org"); + */ +class SimpleSubClassObject + extends SimpleClassObject +{ + + /** + * @Type("string") + * @XmlElement(namespace="http://better.foo.example.org") + */ + public $moo; + + /** + * @Type("string") + * @XmlElement(namespace="http://foo.example.org") + */ + public $baz; + + /** + * @Type("string") + * @XmlElement(namespace="http://new.foo.example.org") + */ + public $qux; + +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Tag.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Tag.php new file mode 100644 index 0000000000..5c1e92264b --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Tag.php @@ -0,0 +1,42 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation as JMS; + + +/** + * @JMS\XmlRoot("tag") + * @JMS\XmlNamespace(uri="http://purl.org/dc/elements/1.1/", prefix="dc") + */ +class Tag { + + /** + * @JMS\XmlElement(cdata=false) + * @JMS\Type("string") + */ + public $name; + + function __construct($name) + { + $this->name = $name; + } + + +} \ No newline at end of file diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Timestamp.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Timestamp.php new file mode 100644 index 0000000000..7d3d0476b5 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Timestamp.php @@ -0,0 +1,39 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\Type; + +class Timestamp +{ + /** + * @Type("DateTime<'U'>") + */ + private $timestamp; + + public function __construct($timestamp) + { + $this->timestamp = $timestamp; + } + + public function getTimestamp() + { + return $this->timestamp; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Tree.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Tree.php new file mode 100644 index 0000000000..e5066b8088 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/Tree.php @@ -0,0 +1,34 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation as Serializer; + +class Tree +{ + /** + * @Serializer\MaxDepth(10) + */ + public $tree; + + public function __construct($tree) + { + $this->tree = $tree; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/VehicleInterfaceGarage.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/VehicleInterfaceGarage.php new file mode 100644 index 0000000000..ca27b33d78 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/VehicleInterfaceGarage.php @@ -0,0 +1,33 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\Type; + +class VehicleInterfaceGarage +{ + /** + * @Type("array") + */ + public $vehicles; + + public function __construct($vehicles) { + $this->vehicles = $vehicles; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/VersionedObject.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/VersionedObject.php new file mode 100644 index 0000000000..b4bfb5155d --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Fixtures/VersionedObject.php @@ -0,0 +1,43 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Fixtures; + +use JMS\Serializer\Annotation\SerializedName; +use JMS\Serializer\Annotation\Since; +use JMS\Serializer\Annotation\Until; + +class VersionedObject +{ + /** + * @Until("1.0.0") + */ + private $name; + + /** + * @Since("1.0.1") + * @SerializedName("name") + */ + private $name2; + + public function __construct($name, $name2) + { + $this->name = $name; + $this->name2 = $name2; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Handler/ArrayCollectionHandlerTest.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Handler/ArrayCollectionHandlerTest.php new file mode 100644 index 0000000000..4012a07c9f --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Handler/ArrayCollectionHandlerTest.php @@ -0,0 +1,52 @@ +getMockBuilder(VisitorInterface::class)->getMock(); + $visitor->method('visitArray')->with(['foo'])->willReturn(['foo']); + + $context = $this->getMockBuilder(SerializationContext::class)->getMock(); + $type = ['name' => 'ArrayCollection', 'params' => []]; + + $collection = new ArrayCollection(['foo']); + + $handler->serializeCollection($visitor, $collection, $type, $context); + } + + public function testSerializeArraySkipByExclusionStrategy() + { + $handler = new ArrayCollectionHandler(false); + + $visitor = $this->getMockBuilder(VisitorInterface::class)->getMock(); + $visitor->method('visitArray')->with([])->willReturn([]); + + $context = $this->getMockBuilder(SerializationContext::class)->getMock(); + + $factoryMock = $this->getMockBuilder(MetadataFactoryInterface::class)->getMock(); + $factoryMock->method('getMetadataForClass')->willReturn(new ClassMetadata(ArrayCollection::class)); + + $context->method('getExclusionStrategy')->willReturn(new AlwaysExcludeExclusionStrategy()); + $context->method('getMetadataFactory')->willReturn($factoryMock); + + + $type = ['name' => 'ArrayCollection', 'params' => []]; + + $collection = new ArrayCollection(['foo']); + + $handler->serializeCollection($visitor, $collection, $type, $context); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Handler/FormErrorHandlerTest.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Handler/FormErrorHandlerTest.php new file mode 100644 index 0000000000..93bcdb26f5 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Handler/FormErrorHandlerTest.php @@ -0,0 +1,137 @@ +handler = new FormErrorHandler(new Translator('en')); + $this->visitor = new JsonSerializationVisitor(new SerializedNameAnnotationStrategy(new CamelCaseNamingStrategy())); + $this->dispatcher = new EventDispatcher(); + $this->factory = $this->getMock('Symfony\Component\Form\FormFactoryInterface'); + } + + protected function tearDown() + { + $this->handler = null; + $this->visitor = null; + $this->dispatcher = null; + $this->factory = null; + } + + public function testSerializeEmptyFormError() + { + $form = $this->createForm(); + $json = json_encode($this->handler->serializeFormToJson($this->visitor, $form, array())); + + $this->assertSame('{}', $json); + } + + public function testSerializeHasFormError() + { + $form = $this->createForm(); + $form->addError(new FormError('error!')); + $json = json_encode($this->handler->serializeFormToJson($this->visitor, $form, array())); + + $this->assertSame(json_encode(array( + 'errors' => array( + 'error!', + ), + )), $json); + } + + + public function testSerializeChildElements() + { + $formFactory = Forms::createFormFactory(); + $form = $formFactory->createBuilder() + ->add('child') + ->add('date') + ->getForm(); + + $form->addError(new FormError('error!')); + $form->get('date')->addError(new FormError('child-error')); + + $json = json_encode($this->handler->serializeFormToJson($this->visitor, $form, array())); + + $this->assertSame(json_encode(array( + 'errors' => array( + 'error!', + ), + 'children' => [ + 'child' => new \stdClass(), + 'date' => ['errors' => ['child-error']] + ] + )), $json); + + } + + /** + * @param string $name + * @param EventDispatcherInterface $dispatcher + * @param string $dataClass + * + * @return FormBuilder + */ + protected function getBuilder($name = 'name', EventDispatcherInterface $dispatcher = null, $dataClass = null) + { + return new FormBuilder($name, $dataClass, $dispatcher ?: $this->dispatcher, $this->factory); + } + + /** + * @param string $name + * + * @return \PHPUnit_Framework_MockObject_MockObject + */ + protected function getMockForm($name = 'name') + { + $form = $this->getMock('Symfony\Component\Form\Test\FormInterface'); + $config = $this->getMock('Symfony\Component\Form\FormConfigInterface'); + + $form->expects($this->any()) + ->method('getName') + ->will($this->returnValue($name)); + $form->expects($this->any()) + ->method('getConfig') + ->will($this->returnValue($config)); + + return $form; + } + + protected function createForm() + { + return $this->getBuilder()->getForm(); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Handler/PropelCollectionHandlerTest.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Handler/PropelCollectionHandlerTest.php new file mode 100644 index 0000000000..b59d723dcc --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Handler/PropelCollectionHandlerTest.php @@ -0,0 +1,43 @@ +serializer = SerializerBuilder::create() + ->addDefaultHandlers() //load PropelCollectionHandler + ->build(); + } + + public function testSerializePropelObjectCollection() + { + $collection = new \PropelObjectCollection(); + $collection->setData(array(new TestSubject('lolo'), new TestSubject('pepe'))); + $json = $this->serializer->serialize($collection, 'json'); + + $data = json_decode($json, true); + + $this->assertCount(2, $data); //will fail if PropelCollectionHandler not loaded + + foreach ($data as $testSubject) { + $this->assertArrayHasKey('name', $testSubject); + } + } +} + +class TestSubject +{ + protected $name; + + public function __construct($name) + { + $this->name = $name; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/ClassMetadataTest.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/ClassMetadataTest.php new file mode 100644 index 0000000000..d1219745de --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/ClassMetadataTest.php @@ -0,0 +1,168 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Metadata; + +use JMS\Serializer\Metadata\PropertyMetadata; +use JMS\Serializer\Metadata\ClassMetadata; + +class ClassMetadataTest extends \PHPUnit_Framework_TestCase +{ + public function getAccessOrderCases() + { + return [ + [array('b', 'a'), array('b', 'a')], + [array('a', 'b'), array('a', 'b')], + [array('b'), array('b', 'a')], + [array('a'), array('a', 'b')], + [array('foo', 'bar'), array('b', 'a')], + ]; + } + + public function testSerialization() + { + $meta = new PropertyMetadata('JMS\Serializer\Tests\Metadata\PropertyMetadataOrder', 'b'); + $restoredMeta = unserialize(serialize($meta)); + $this->assertEquals($meta, $restoredMeta); + } + + /** + * @dataProvider getAccessOrderCases + */ + public function testSetAccessorOrderCustom(array $order, array $expected) + { + $metadata = new ClassMetadata('JMS\Serializer\Tests\Metadata\PropertyMetadataOrder'); + $metadata->addPropertyMetadata(new PropertyMetadata('JMS\Serializer\Tests\Metadata\PropertyMetadataOrder', 'b')); + $metadata->addPropertyMetadata(new PropertyMetadata('JMS\Serializer\Tests\Metadata\PropertyMetadataOrder', 'a')); + $this->assertEquals(array('b', 'a'), array_keys($metadata->propertyMetadata)); + + $metadata->setAccessorOrder(ClassMetadata::ACCESSOR_ORDER_CUSTOM, $order); + $this->assertEquals($expected, array_keys($metadata->propertyMetadata)); + } + + public function testSetAccessorOrderAlphabetical() + { + $metadata = new ClassMetadata('JMS\Serializer\Tests\Metadata\PropertyMetadataOrder'); + $metadata->addPropertyMetadata(new PropertyMetadata('JMS\Serializer\Tests\Metadata\PropertyMetadataOrder', 'b')); + $metadata->addPropertyMetadata(new PropertyMetadata('JMS\Serializer\Tests\Metadata\PropertyMetadataOrder', 'a')); + $this->assertEquals(array('b', 'a'), array_keys($metadata->propertyMetadata)); + + $metadata->setAccessorOrder(ClassMetadata::ACCESSOR_ORDER_ALPHABETICAL); + $this->assertEquals(array('a', 'b'), array_keys($metadata->propertyMetadata)); + } + + /** + * @dataProvider providerPublicMethodData + */ + public function testAccessorTypePublicMethod($property, $getterInit, $setterInit, $getterName, $setterName) + { + $object = new PropertyMetadataPublicMethod(); + + $metadata = new PropertyMetadata(get_class($object), $property); + $metadata->setAccessor(PropertyMetadata::ACCESS_TYPE_PUBLIC_METHOD, $getterInit, $setterInit); + + $this->assertEquals($getterName, $metadata->getter); + $this->assertEquals($setterName, $metadata->setter); + + $metadata->setValue($object, 'x'); + + $this->assertEquals(sprintf('%1$s:%1$s:x', strtoupper($property)), $metadata->getValue($object)); + } + + /** + * @dataProvider providerPublicMethodException + */ + public function testAccessorTypePublicMethodException($getter, $setter, $message) + { + $this->setExpectedException('\JMS\Serializer\Exception\RuntimeException', $message); + + $object = new PropertyMetadataPublicMethod(); + + $metadata = new PropertyMetadata(get_class($object), 'e'); + $metadata->setAccessor(PropertyMetadata::ACCESS_TYPE_PUBLIC_METHOD, $getter, $setter); + } + + public function providerPublicMethodData() + { + return array( + array('a', null, null, 'geta', 'seta'), + array('b', null, null, 'isb', 'setb'), + array('c', null, null, 'hasc', 'setc'), + array('d', 'fetchd', 'saved', 'fetchd', 'saved') + ); + } + + public function providerPublicMethodException() + { + return array( + array(null, null, 'a public getE method, nor a public isE method, nor a public hasE method in class'), + array(null, 'setx', 'a public getE method, nor a public isE method, nor a public hasE method in class'), + array('getx', null, 'no public setE method in class'), + ); + } +} + +class PropertyMetadataOrder +{ + private $b, $a; +} + +class PropertyMetadataPublicMethod +{ + private $a, $b, $c, $d, $e; + + public function getA() + { + return 'A:' . $this->a; + } + + public function setA($a) + { + $this->a = 'A:' . $a; + } + + public function isB() + { + return 'B:' . $this->b; + } + + public function setB($b) + { + $this->b = 'B:' . $b; + } + + public function hasC() + { + return 'C:' . $this->c; + } + + public function setC($c) + { + $this->c = 'C:' . $c; + } + + public function fetchD() + { + return 'D:' . $this->d; + } + + public function saveD($d) + { + $this->d = 'D:' . $d; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/AnnotationDriverTest.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/AnnotationDriverTest.php new file mode 100644 index 0000000000..419d11eb94 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/AnnotationDriverTest.php @@ -0,0 +1,30 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Metadata\Driver; + +use Doctrine\Common\Annotations\AnnotationReader; +use JMS\Serializer\Metadata\Driver\AnnotationDriver; + +class AnnotationDriverTest extends BaseDriverTest +{ + protected function getDriver() + { + return new AnnotationDriver(new AnnotationReader()); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/BaseDriverTest.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/BaseDriverTest.php new file mode 100644 index 0000000000..0f4824a6af --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/BaseDriverTest.php @@ -0,0 +1,485 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Metadata\Driver; + +use JMS\Serializer\GraphNavigator; +use JMS\Serializer\Metadata\ClassMetadata; +use JMS\Serializer\Metadata\ExpressionPropertyMetadata; +use JMS\Serializer\Metadata\PropertyMetadata; +use JMS\Serializer\Metadata\VirtualPropertyMetadata; +use JMS\Serializer\Tests\Fixtures\Discriminator\ObjectWithXmlAttributeDiscriminatorChild; +use JMS\Serializer\Tests\Fixtures\Discriminator\ObjectWithXmlAttributeDiscriminatorParent; +use JMS\Serializer\Tests\Fixtures\Discriminator\ObjectWithXmlNamespaceDiscriminatorChild; +use JMS\Serializer\Tests\Fixtures\Discriminator\ObjectWithXmlNamespaceDiscriminatorParent; +use JMS\Serializer\Tests\Fixtures\ParentSkipWithEmptyChild; +use Metadata\Driver\DriverInterface; + +abstract class BaseDriverTest extends \PHPUnit_Framework_TestCase +{ + public function testLoadBlogPostMetadata() + { + $m = $this->getDriver()->loadMetadataForClass(new \ReflectionClass('JMS\Serializer\Tests\Fixtures\BlogPost')); + + $this->assertNotNull($m); + $this->assertEquals('blog-post', $m->xmlRootName); + $this->assertCount(4, $m->xmlNamespaces); + $this->assertArrayHasKey('', $m->xmlNamespaces); + $this->assertEquals('http://example.com/namespace', $m->xmlNamespaces['']); + $this->assertArrayHasKey('gd', $m->xmlNamespaces); + $this->assertEquals('http://schemas.google.com/g/2005', $m->xmlNamespaces['gd']); + $this->assertArrayHasKey('atom', $m->xmlNamespaces); + $this->assertEquals('http://www.w3.org/2005/Atom', $m->xmlNamespaces['atom']); + $this->assertArrayHasKey('dc', $m->xmlNamespaces); + $this->assertEquals('http://purl.org/dc/elements/1.1/', $m->xmlNamespaces['dc']); + + $p = new PropertyMetadata($m->name, 'id'); + $p->type = array('name' => 'string', 'params' => array()); + $p->groups = array("comments","post"); + $p->xmlElementCData = false; + $this->assertEquals($p, $m->propertyMetadata['id']); + + $p = new PropertyMetadata($m->name, 'title'); + $p->type = array('name' => 'string', 'params' => array()); + $p->groups = array("comments","post"); + $p->xmlNamespace = "http://purl.org/dc/elements/1.1/"; + $this->assertEquals($p, $m->propertyMetadata['title']); + + $p = new PropertyMetadata($m->name, 'createdAt'); + $p->type = array('name' => 'DateTime', 'params' => array()); + $p->xmlAttribute = true; + $this->assertEquals($p, $m->propertyMetadata['createdAt']); + + $p = new PropertyMetadata($m->name, 'published'); + $p->type = array('name' => 'boolean', 'params' => array()); + $p->serializedName = 'is_published'; + $p->xmlAttribute = true; + $p->groups = array("post"); + $this->assertEquals($p, $m->propertyMetadata['published']); + + $p = new PropertyMetadata($m->name, 'etag'); + $p->type = array('name' => 'string', 'params' => array()); + $p->xmlAttribute = true; + $p->groups = array("post"); + $p->xmlNamespace = "http://schemas.google.com/g/2005"; + $this->assertEquals($p, $m->propertyMetadata['etag']); + + $p = new PropertyMetadata($m->name, 'comments'); + $p->type = array('name' => 'ArrayCollection', 'params' => array(array('name' => 'JMS\Serializer\Tests\Fixtures\Comment', 'params' => array()))); + $p->xmlCollection = true; + $p->xmlCollectionInline = true; + $p->xmlEntryName = 'comment'; + $p->groups = array("comments"); + $this->assertEquals($p, $m->propertyMetadata['comments']); + + $p = new PropertyMetadata($m->name, 'author'); + $p->type = array('name' => 'JMS\Serializer\Tests\Fixtures\Author', 'params' => array()); + $p->groups = array("post"); + $p->xmlNamespace = 'http://www.w3.org/2005/Atom'; + $this->assertEquals($p, $m->propertyMetadata['author']); + + $m = $this->getDriver()->loadMetadataForClass(new \ReflectionClass('JMS\Serializer\Tests\Fixtures\Price')); + $this->assertNotNull($m); + + $p = new PropertyMetadata($m->name, 'price'); + $p->type = array('name' => 'float', 'params' => array()); + $p->xmlValue = true; + $this->assertEquals($p, $m->propertyMetadata['price']); + } + + public function testXMLListAbsentNode() + { + $m = $this->getDriver()->loadMetadataForClass(new \ReflectionClass('JMS\Serializer\Tests\Fixtures\ObjectWithAbsentXmlListNode')); + + $this->assertArrayHasKey('absent', $m->propertyMetadata); + $this->assertArrayHasKey('present', $m->propertyMetadata); + $this->assertArrayHasKey('skipDefault', $m->propertyMetadata); + + $this->assertTrue($m->propertyMetadata['absent']->xmlCollectionSkipWhenEmpty); + $this->assertTrue($m->propertyMetadata['skipDefault']->xmlCollectionSkipWhenEmpty); + $this->assertFalse($m->propertyMetadata['present']->xmlCollectionSkipWhenEmpty); + } + + public function testVirtualProperty() + { + $m = $this->getDriver()->loadMetadataForClass(new \ReflectionClass('JMS\Serializer\Tests\Fixtures\ObjectWithVirtualProperties')); + + $this->assertArrayHasKey('existField', $m->propertyMetadata); + $this->assertArrayHasKey('virtualValue', $m->propertyMetadata); + $this->assertArrayHasKey('virtualSerializedValue', $m->propertyMetadata); + $this->assertArrayHasKey('typedVirtualProperty', $m->propertyMetadata); + + $this->assertEquals($m->propertyMetadata['virtualSerializedValue']->serializedName, 'test', 'Serialized name is missing' ); + + $p = new VirtualPropertyMetadata($m->name, 'virtualValue'); + $p->getter = 'getVirtualValue'; + + $this->assertEquals($p, $m->propertyMetadata['virtualValue']); + } + + public function testXmlKeyValuePairs() + { + $m = $this->getDriver()->loadMetadataForClass(new \ReflectionClass('JMS\Serializer\Tests\Fixtures\ObjectWithXmlKeyValuePairs')); + + $this->assertArrayHasKey('array', $m->propertyMetadata); + $this->assertTrue($m->propertyMetadata['array']->xmlKeyValuePairs); + } + + public function testExpressionVirtualPropertyWithExcludeAll() + { + $a = new \JMS\Serializer\Tests\Fixtures\ObjectWithExpressionVirtualPropertiesAndExcludeAll(); + $m = $this->getDriver()->loadMetadataForClass(new \ReflectionClass($a));; + + $this->assertArrayHasKey('virtualValue', $m->propertyMetadata); + + $p = new ExpressionPropertyMetadata($m->name, 'virtualValue', 'object.getVirtualValue()'); + $this->assertEquals($p, $m->propertyMetadata['virtualValue']); + } + + public function testVirtualPropertyWithExcludeAll() + { + $a = new \JMS\Serializer\Tests\Fixtures\ObjectWithVirtualPropertiesAndExcludeAll(); + $m = $this->getDriver()->loadMetadataForClass(new \ReflectionClass($a)); + + $this->assertArrayHasKey('virtualValue', $m->propertyMetadata); + + $p = new VirtualPropertyMetadata($m->name, 'virtualValue'); + $p->getter = 'getVirtualValue'; + + $this->assertEquals($p, $m->propertyMetadata['virtualValue']); + } + + public function testReadOnlyDefinedBeforeGetterAndSetter() + { + $m = $this->getDriver()->loadMetadataForClass(new \ReflectionClass('JMS\Serializer\Tests\Fixtures\AuthorReadOnly')); + + $this->assertNotNull($m); + } + + public function testExpressionVirtualProperty() + { + /** @var $m ClassMetadata */ + $m = $this->getDriver()->loadMetadataForClass(new \ReflectionClass('JMS\Serializer\Tests\Fixtures\AuthorExpressionAccess')); + + $keys = array_keys($m->propertyMetadata); + $this->assertEquals(['firstName', 'lastName', 'id'], $keys); + } + + public function testLoadDiscriminator() + { + /** @var $m ClassMetadata */ + $m = $this->getDriver()->loadMetadataForClass(new \ReflectionClass('JMS\Serializer\Tests\Fixtures\Discriminator\Vehicle')); + + $this->assertNotNull($m); + $this->assertEquals('type', $m->discriminatorFieldName); + $this->assertEquals($m->name, $m->discriminatorBaseClass); + $this->assertEquals( + array( + 'car' => 'JMS\Serializer\Tests\Fixtures\Discriminator\Car', + 'moped' => 'JMS\Serializer\Tests\Fixtures\Discriminator\Moped', + ), + $m->discriminatorMap + ); + } + + public function testLoadXmlDiscriminator() + { + /** @var $m ClassMetadata */ + $m = $this->getDriver()->loadMetadataForClass(new \ReflectionClass(ObjectWithXmlAttributeDiscriminatorParent::class)); + + $this->assertNotNull($m); + $this->assertEquals('type', $m->discriminatorFieldName); + $this->assertEquals($m->name, $m->discriminatorBaseClass); + $this->assertEquals( + array( + 'child' => ObjectWithXmlAttributeDiscriminatorChild::class, + ), + $m->discriminatorMap + ); + $this->assertTrue($m->xmlDiscriminatorAttribute); + $this->assertFalse($m->xmlDiscriminatorCData); + } + + public function testLoadXmlDiscriminatorWithNamespaces() + { + /** @var $m ClassMetadata */ + $m = $this->getDriver()->loadMetadataForClass(new \ReflectionClass(ObjectWithXmlNamespaceDiscriminatorParent::class)); + + $this->assertNotNull($m); + $this->assertEquals('type', $m->discriminatorFieldName); + $this->assertEquals($m->name, $m->discriminatorBaseClass); + $this->assertEquals( + array( + 'child' => ObjectWithXmlNamespaceDiscriminatorChild::class, + ), + $m->discriminatorMap + ); + $this->assertEquals('http://example.com/', $m->xmlDiscriminatorNamespace); + } + + public function testLoadDiscriminatorWithGroup() + { + /** @var $m ClassMetadata */ + $m = $this->getDriver()->loadMetadataForClass(new \ReflectionClass('JMS\Serializer\Tests\Fixtures\DiscriminatorGroup\Vehicle')); + + $this->assertNotNull($m); + $this->assertEquals('type', $m->discriminatorFieldName); + $this->assertEquals(array('foo'), $m->discriminatorGroups); + $this->assertEquals($m->name, $m->discriminatorBaseClass); + $this->assertEquals( + array( + 'car' => 'JMS\Serializer\Tests\Fixtures\DiscriminatorGroup\Car' + ), + $m->discriminatorMap + ); + } + + public function testSkipWhenEmptyOption() + { + /** @var $m ClassMetadata */ + $m = $this->getDriver()->loadMetadataForClass(new \ReflectionClass(ParentSkipWithEmptyChild::class)); + + $this->assertNotNull($m); + + $this->assertInstanceOf(PropertyMetadata::class, $m->propertyMetadata['c']); + $this->assertInstanceOf(PropertyMetadata::class, $m->propertyMetadata['d']); + $this->assertInstanceOf(PropertyMetadata::class, $m->propertyMetadata['child']); + $this->assertFalse($m->propertyMetadata['c']->skipWhenEmpty); + $this->assertFalse($m->propertyMetadata['d']->skipWhenEmpty); + $this->assertTrue($m->propertyMetadata['child']->skipWhenEmpty); + } + + public function testLoadDiscriminatorSubClass() + { + /** @var $m ClassMetadata */ + $m = $this->getDriver()->loadMetadataForClass(new \ReflectionClass('JMS\Serializer\Tests\Fixtures\Discriminator\Car')); + + $this->assertNotNull($m); + $this->assertNull($m->discriminatorValue); + $this->assertNull($m->discriminatorBaseClass); + $this->assertNull($m->discriminatorFieldName); + $this->assertEquals(array(), $m->discriminatorMap); + } + + public function testLoadXmlObjectWithNamespacesMetadata() + { + $m = $this->getDriver()->loadMetadataForClass(new \ReflectionClass('JMS\Serializer\Tests\Fixtures\ObjectWithXmlNamespaces')); + $this->assertNotNull($m); + $this->assertEquals('test-object', $m->xmlRootName); + $this->assertEquals('http://example.com/namespace', $m->xmlRootNamespace); + $this->assertCount(3, $m->xmlNamespaces); + $this->assertArrayHasKey('', $m->xmlNamespaces); + $this->assertEquals('http://example.com/namespace', $m->xmlNamespaces['']); + $this->assertArrayHasKey('gd', $m->xmlNamespaces); + $this->assertEquals('http://schemas.google.com/g/2005', $m->xmlNamespaces['gd']); + $this->assertArrayHasKey('atom', $m->xmlNamespaces); + $this->assertEquals('http://www.w3.org/2005/Atom', $m->xmlNamespaces['atom']); + + $p = new PropertyMetadata($m->name, 'title'); + $p->type = array('name' => 'string', 'params' => array()); + $p->xmlNamespace = "http://purl.org/dc/elements/1.1/"; + $this->assertEquals($p, $m->propertyMetadata['title']); + + $p = new PropertyMetadata($m->name, 'createdAt'); + $p->type = array('name' => 'DateTime', 'params' => array()); + $p->xmlAttribute = true; + $this->assertEquals($p, $m->propertyMetadata['createdAt']); + + $p = new PropertyMetadata($m->name, 'etag'); + $p->type = array('name' => 'string', 'params' => array()); + $p->xmlAttribute = true; + $p->xmlNamespace = "http://schemas.google.com/g/2005"; + $this->assertEquals($p, $m->propertyMetadata['etag']); + + $p = new PropertyMetadata($m->name, 'author'); + $p->type = array('name' => 'string', 'params' => array()); + $p->xmlAttribute = false; + $p->xmlNamespace = "http://www.w3.org/2005/Atom"; + $this->assertEquals($p, $m->propertyMetadata['author']); + + $p = new PropertyMetadata($m->name, 'language'); + $p->type = array('name' => 'string', 'params' => array()); + $p->xmlAttribute = true; + $p->xmlNamespace = "http://purl.org/dc/elements/1.1/"; + $this->assertEquals($p, $m->propertyMetadata['language']); + } + + public function testMaxDepth() + { + $m = $this->getDriver()->loadMetadataForClass(new \ReflectionClass('JMS\Serializer\Tests\Fixtures\Node')); + + $this->assertEquals(2, $m->propertyMetadata['children']->maxDepth); + } + + public function testPersonCData() + { + $m = $this->getDriver()->loadMetadataForClass(new \ReflectionClass('JMS\Serializer\Tests\Fixtures\Person')); + + $this->assertNotNull($m); + $this->assertFalse($m->propertyMetadata['name']->xmlElementCData); + } + + public function testXmlNamespaceInheritanceMetadata() + { + $m = $this->getDriver()->loadMetadataForClass(new \ReflectionClass('JMS\Serializer\Tests\Fixtures\SimpleClassObject')); + $this->assertNotNull($m); + $this->assertCount(3, $m->xmlNamespaces); + $this->assertArrayHasKey('old_foo', $m->xmlNamespaces); + $this->assertEquals('http://old.foo.example.org', $m->xmlNamespaces['old_foo']); + $this->assertArrayHasKey('foo', $m->xmlNamespaces); + $this->assertEquals('http://foo.example.org', $m->xmlNamespaces['foo']); + $this->assertArrayHasKey('new_foo', $m->xmlNamespaces); + $this->assertEquals('http://new.foo.example.org', $m->xmlNamespaces['new_foo']); + $this->assertCount(3, $m->propertyMetadata); + + $p = new PropertyMetadata($m->name, 'foo'); + $p->type = array('name' => 'string', 'params' => array()); + $p->xmlNamespace = "http://old.foo.example.org"; + $p->xmlAttribute = true; + $this->assertEquals($p, $m->propertyMetadata['foo']); + + $p = new PropertyMetadata($m->name, 'bar'); + $p->type = array('name' => 'string', 'params' => array()); + $p->xmlNamespace = "http://foo.example.org"; + $this->assertEquals($p, $m->propertyMetadata['bar']); + + $p = new PropertyMetadata($m->name, 'moo'); + $p->type = array('name' => 'string', 'params' => array()); + $p->xmlNamespace = "http://new.foo.example.org"; + $this->assertEquals($p, $m->propertyMetadata['moo']); + + + $subm = $this->getDriver()->loadMetadataForClass(new \ReflectionClass('JMS\Serializer\Tests\Fixtures\SimpleSubClassObject')); + $this->assertNotNull($subm); + $this->assertCount(2, $subm->xmlNamespaces); + $this->assertArrayHasKey('old_foo', $subm->xmlNamespaces); + $this->assertEquals('http://foo.example.org', $subm->xmlNamespaces['old_foo']); + $this->assertArrayHasKey('foo', $subm->xmlNamespaces); + $this->assertEquals('http://better.foo.example.org', $subm->xmlNamespaces['foo']); + $this->assertCount(3, $subm->propertyMetadata); + + $p = new PropertyMetadata($subm->name, 'moo'); + $p->type = array('name' => 'string', 'params' => array()); + $p->xmlNamespace = "http://better.foo.example.org"; + $this->assertEquals($p, $subm->propertyMetadata['moo']); + + $p = new PropertyMetadata($subm->name, 'baz'); + $p->type = array('name' => 'string', 'params' => array()); + $p->xmlNamespace = "http://foo.example.org"; + $this->assertEquals($p, $subm->propertyMetadata['baz']); + + $p = new PropertyMetadata($subm->name, 'qux'); + $p->type = array('name' => 'string', 'params' => array()); + $p->xmlNamespace = "http://new.foo.example.org"; + $this->assertEquals($p, $subm->propertyMetadata['qux']); + + $m->merge($subm); + $this->assertNotNull($m); + $this->assertCount(3, $m->xmlNamespaces); + $this->assertArrayHasKey('old_foo', $m->xmlNamespaces); + $this->assertEquals('http://foo.example.org', $m->xmlNamespaces['old_foo']); + $this->assertArrayHasKey('foo', $m->xmlNamespaces); + $this->assertEquals('http://better.foo.example.org', $m->xmlNamespaces['foo']); + $this->assertArrayHasKey('new_foo', $m->xmlNamespaces); + $this->assertEquals('http://new.foo.example.org', $m->xmlNamespaces['new_foo']); + $this->assertCount(5, $m->propertyMetadata); + + $p = new PropertyMetadata($m->name, 'foo'); + $p->type = array('name' => 'string', 'params' => array()); + $p->xmlNamespace = "http://old.foo.example.org"; + $p->xmlAttribute = true; + $p->class = 'JMS\Serializer\Tests\Fixtures\SimpleClassObject'; + $this->assetMetadataEquals($p, $m->propertyMetadata['foo']); + + $p = new PropertyMetadata($m->name, 'bar'); + $p->type = array('name' => 'string', 'params' => array()); + $p->xmlNamespace = "http://foo.example.org"; + $p->class = 'JMS\Serializer\Tests\Fixtures\SimpleClassObject'; + $this->assetMetadataEquals($p, $m->propertyMetadata['bar']); + + $p = new PropertyMetadata($m->name, 'moo'); + $p->type = array('name' => 'string', 'params' => array()); + $p->xmlNamespace = "http://better.foo.example.org"; + $this->assetMetadataEquals($p, $m->propertyMetadata['moo']); + + $p = new PropertyMetadata($m->name, 'baz'); + $p->type = array('name' => 'string', 'params' => array()); + $p->xmlNamespace = "http://foo.example.org"; + $this->assetMetadataEquals($p, $m->propertyMetadata['baz']); + + $p = new PropertyMetadata($m->name, 'qux'); + $p->type = array('name' => 'string', 'params' => array()); + $p->xmlNamespace = "http://new.foo.example.org"; + $this->assetMetadataEquals($p, $m->propertyMetadata['qux']); + } + + private function assetMetadataEquals(PropertyMetadata $expected, PropertyMetadata $actual) + { + $expectedVars = get_object_vars($expected); + $actualVars = get_object_vars($actual); + + $expectedReflection = (array)$expectedVars['reflection']; + $actualReflection = (array)$actualVars['reflection']; + + // HHVM bug with class property + unset($expectedVars['reflection'], $actualVars['reflection']); + $this->assertEquals($expectedVars, $actualVars); + + // HHVM bug with class property + if (isset($expectedReflection['info']) || isset($actualReflection['info'])){ + $expectedReflection['class'] = $expectedReflection['info']['class']; + $actualReflection['class'] = $actualReflection['info']['class']; + } + + $this->assertEquals($expectedReflection, $actualReflection); + } + + public function testHandlerCallbacks() + { + $m = $this->getDriver()->loadMetadataForClass(new \ReflectionClass('JMS\Serializer\Tests\Fixtures\ObjectWithHandlerCallbacks')); + + $this->assertEquals('toJson', $m->handlerCallbacks[GraphNavigator::DIRECTION_SERIALIZATION]['json']); + $this->assertEquals('toXml', $m->handlerCallbacks[GraphNavigator::DIRECTION_SERIALIZATION]['xml']); + } + + public function testExclusionIf() + { + $class = 'JMS\Serializer\Tests\Fixtures\PersonSecret'; + $m = $this->getDriver()->loadMetadataForClass(new \ReflectionClass($class)); + + $p = new PropertyMetadata($class, 'name'); + $p->type = array('name' => 'string', 'params' => array()); + $this->assertEquals($p, $m->propertyMetadata['name']); + + $p = new PropertyMetadata($class, 'gender'); + $p->type = array('name' => 'string', 'params' => array()); + $p->excludeIf = "show_data('gender')"; + $this->assertEquals($p, $m->propertyMetadata['gender']); + + $p = new PropertyMetadata($class, 'age'); + $p->type = array('name' => 'string', 'params' => array()); + $p->excludeIf = "!(show_data('age'))"; + $this->assertEquals($p, $m->propertyMetadata['age']); + } + + + /** + * @return DriverInterface + */ + abstract protected function getDriver(); +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/DoctrineDriverTest.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/DoctrineDriverTest.php new file mode 100644 index 0000000000..c4f8ae1b87 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/DoctrineDriverTest.php @@ -0,0 +1,143 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Metadata\Driver; + +use JMS\Serializer\Metadata\Driver\AnnotationDriver; +use JMS\Serializer\Metadata\Driver\DoctrineTypeDriver; +use Doctrine\Common\Annotations\AnnotationReader; +use Doctrine\ORM\Configuration; +use Doctrine\ORM\EntityManager; +use Doctrine\ORM\Mapping\Driver\AnnotationDriver as DoctrineDriver; + +class DoctrineDriverTest extends \PHPUnit_Framework_TestCase +{ + public function getMetadata() + { + $refClass = new \ReflectionClass('JMS\Serializer\Tests\Fixtures\Doctrine\BlogPost'); + $metadata = $this->getDoctrineDriver()->loadMetadataForClass($refClass); + + return $metadata; + } + + public function testTypelessPropertyIsGivenTypeFromDoctrineMetadata() + { + $metadata = $this->getMetadata(); + + $this->assertEquals( + array('name'=> 'DateTime', 'params' => array()), + $metadata->propertyMetadata['createdAt']->type + ); + } + + public function testSingleValuedAssociationIsProperlyHinted() + { + $metadata = $this->getMetadata(); + $this->assertEquals( + array('name'=> 'JMS\Serializer\Tests\Fixtures\Doctrine\Author', 'params' => array()), + $metadata->propertyMetadata['author']->type + ); + } + + public function testMultiValuedAssociationIsProperlyHinted() + { + $metadata = $this->getMetadata(); + + $this->assertEquals( + array('name'=> 'ArrayCollection', 'params' => array( + array('name' => 'JMS\Serializer\Tests\Fixtures\Doctrine\Comment', 'params' => array())) + ), + $metadata->propertyMetadata['comments']->type + ); + } + + public function testTypeGuessByDoctrineIsOverwrittenByDelegateDriver() + { + $metadata = $this->getMetadata(); + + // This would be guessed as boolean but we've overriden it to integer + $this->assertEquals( + array('name'=> 'integer', 'params' => array()), + $metadata->propertyMetadata['published']->type + ); + } + + public function testUnknownDoctrineTypeDoesNotResultInAGuess() + { + $metadata = $this->getMetadata(); + $this->assertNull($metadata->propertyMetadata['slug']->type); + } + + public function testNonDoctrineEntityClassIsNotModified() + { + // Note: Using regular BlogPost fixture here instead of Doctrine fixture + // because it has no Doctrine metadata. + $refClass = new \ReflectionClass('JMS\Serializer\Tests\Fixtures\BlogPost'); + + $plainMetadata = $this->getAnnotationDriver()->loadMetadataForClass($refClass); + $doctrineMetadata = $this->getDoctrineDriver()->loadMetadataForClass($refClass); + + // Do not compare timestamps + if (abs($doctrineMetadata->createdAt - $plainMetadata->createdAt) < 2) { + $plainMetadata->createdAt = $doctrineMetadata->createdAt; + } + + $this->assertEquals($plainMetadata, $doctrineMetadata); + } + + public function testVirtualPropertiesAreNotModified() + { + $doctrineMetadata = $this->getMetadata(); + $this->assertNull($doctrineMetadata->propertyMetadata['ref']->type); + } + + protected function getEntityManager() + { + $config = new Configuration(); + $config->setProxyDir(sys_get_temp_dir() . '/JMSDoctrineTestProxies'); + $config->setProxyNamespace('JMS\Tests\Proxies'); + $config->setMetadataDriverImpl( + new DoctrineDriver(new AnnotationReader(), __DIR__.'/../../Fixtures/Doctrine') + ); + + $conn = array( + 'driver' => 'pdo_sqlite', + 'memory' => true, + ); + + return EntityManager::create($conn, $config); + } + + public function getAnnotationDriver() + { + return new AnnotationDriver(new AnnotationReader()); + } + + protected function getDoctrineDriver() + { + $registry = $this->getMock('Doctrine\Common\Persistence\ManagerRegistry'); + $registry->expects($this->atLeastOnce()) + ->method('getManagerForClass') + ->will($this->returnValue($this->getEntityManager())); + + return new DoctrineTypeDriver( + $this->getAnnotationDriver(), + $registry + ); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/DoctrinePHPCRDriverTest.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/DoctrinePHPCRDriverTest.php new file mode 100644 index 0000000000..361b0e2929 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/DoctrinePHPCRDriverTest.php @@ -0,0 +1,127 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Metadata\Driver; + +use JMS\Serializer\Metadata\Driver\AnnotationDriver; +use JMS\Serializer\Metadata\Driver\DoctrinePHPCRTypeDriver; +use Doctrine\Common\Annotations\AnnotationReader; +use Doctrine\ODM\PHPCR\Configuration; +use Doctrine\ODM\PHPCR\DocumentManager; +use Doctrine\ODM\PHPCR\Mapping\Driver\AnnotationDriver as DoctrinePHPCRDriver; + +class DoctrinePHPCRDriverTest extends \PHPUnit_Framework_TestCase +{ + public function getMetadata() + { + $refClass = new \ReflectionClass('JMS\Serializer\Tests\Fixtures\DoctrinePHPCR\BlogPost'); + $metadata = $this->getDoctrinePHPCRDriver()->loadMetadataForClass($refClass); + + return $metadata; + } + + public function testTypelessPropertyIsGivenTypeFromDoctrineMetadata() + { + $metadata = $this->getMetadata(); + $this->assertEquals( + array('name'=> 'DateTime', 'params' => array()), + $metadata->propertyMetadata['createdAt']->type + ); + } + + public function testSingleValuedAssociationIsProperlyHinted() + { + $metadata = $this->getMetadata(); + $this->assertEquals( + array('name'=> 'JMS\Serializer\Tests\Fixtures\DoctrinePHPCR\Author', 'params' => array()), + $metadata->propertyMetadata['author']->type + ); + } + + public function testMultiValuedAssociationIsProperlyHinted() + { + $metadata = $this->getMetadata(); + + $this->assertEquals( + array('name'=> 'ArrayCollection', 'params' => array( + array('name' => 'JMS\Serializer\Tests\Fixtures\DoctrinePHPCR\Comment', 'params' => array())) + ), + $metadata->propertyMetadata['comments']->type + ); + } + + public function testTypeGuessByDoctrineIsOverwrittenByDelegateDriver() + { + $metadata = $this->getMetadata(); + + // This would be guessed as boolean but we've overridden it to integer + $this->assertEquals( + array('name'=> 'integer', 'params' => array()), + $metadata->propertyMetadata['published']->type + ); + } + + public function testNonDoctrineDocumentClassIsNotModified() + { + // Note: Using regular BlogPost fixture here instead of Doctrine fixture + // because it has no Doctrine metadata. + $refClass = new \ReflectionClass('JMS\Serializer\Tests\Fixtures\BlogPost'); + + $plainMetadata = $this->getAnnotationDriver()->loadMetadataForClass($refClass); + $doctrineMetadata = $this->getDoctrinePHPCRDriver()->loadMetadataForClass($refClass); + + // Do not compare timestamps + if (abs($doctrineMetadata->createdAt - $plainMetadata->createdAt) < 2) { + $plainMetadata->createdAt = $doctrineMetadata->createdAt; + } + + $this->assertEquals($plainMetadata, $doctrineMetadata); + } + + protected function getDocumentManager() + { + $config = new Configuration(); + $config->setProxyDir(sys_get_temp_dir() . '/JMSDoctrineTestProxies'); + $config->setProxyNamespace('JMS\Tests\Proxies'); + $config->setMetadataDriverImpl( + new DoctrinePHPCRDriver(new AnnotationReader(), __DIR__.'/../../Fixtures/DoctrinePHPCR') + ); + + $session = $this->getMock('PHPCR\SessionInterface'); + + return DocumentManager::create($session, $config); + } + + public function getAnnotationDriver() + { + return new AnnotationDriver(new AnnotationReader()); + } + + protected function getDoctrinePHPCRDriver() + { + $registry = $this->getMock('Doctrine\Common\Persistence\ManagerRegistry'); + $registry->expects($this->atLeastOnce()) + ->method('getManagerForClass') + ->will($this->returnValue($this->getDocumentManager())); + + return new DoctrinePHPCRTypeDriver( + $this->getAnnotationDriver(), + $registry + ); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/PhpDriverTest.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/PhpDriverTest.php new file mode 100644 index 0000000000..3ac1d6cff3 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/PhpDriverTest.php @@ -0,0 +1,32 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Metadata\Driver; + +use Metadata\Driver\FileLocator; +use JMS\Serializer\Metadata\Driver\PhpDriver; + +class PhpDriverTest extends BaseDriverTest +{ + protected function getDriver() + { + return new PhpDriver(new FileLocator(array( + 'JMS\Serializer\Tests\Fixtures' => __DIR__.'/php', + ))); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/XmlDriverTest.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/XmlDriverTest.php new file mode 100644 index 0000000000..76e51eec54 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/XmlDriverTest.php @@ -0,0 +1,96 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Metadata\Driver; + +use Metadata\Driver\FileLocator; +use JMS\Serializer\Metadata\PropertyMetadata; +use JMS\Serializer\Metadata\Driver\XmlDriver; + +class XmlDriverTest extends BaseDriverTest +{ + /** + * @expectedException JMS\Serializer\Exception\XmlErrorException + * @expectedExceptionMessage [FATAL] Start tag expected, '<' not found + */ + public function testInvalidXml() + { + $driver = $this->getDriver(); + + $ref = new \ReflectionMethod($driver, 'loadMetadataFromFile'); + $ref->setAccessible(true); + $ref->invoke($driver, new \ReflectionClass('stdClass'), __DIR__.'/xml/invalid.xml'); + } + + public function testBlogPostExcludeAllStrategy() + { + $m = $this->getDriver('exclude_all')->loadMetadataForClass(new \ReflectionClass('JMS\Serializer\Tests\Fixtures\BlogPost')); + + $this->assertArrayHasKey('title', $m->propertyMetadata); + + $excluded = array('createdAt', 'published', 'comments', 'author'); + foreach ($excluded as $key) { + $this->assertArrayNotHasKey($key, $m->propertyMetadata); + } + } + + public function testBlogPostExcludeNoneStrategy() + { + $m = $this->getDriver('exclude_none')->loadMetadataForClass(new \ReflectionClass('JMS\Serializer\Tests\Fixtures\BlogPost')); + + $this->assertArrayNotHasKey('title', $m->propertyMetadata); + + $excluded = array('createdAt', 'published', 'comments', 'author'); + foreach ($excluded as $key) { + $this->assertArrayHasKey($key, $m->propertyMetadata); + } + } + + public function testBlogPostCaseInsensitive() + { + $m = $this->getDriver('case')->loadMetadataForClass(new \ReflectionClass('JMS\Serializer\Tests\Fixtures\BlogPost')); + + $p = new PropertyMetadata($m->name, 'title'); + $p->type = array('name' => 'string', 'params' => array()); + $this->assertEquals($p, $m->propertyMetadata['title']); + } + + public function testAccessorAttributes() + { + $m = $this->getDriver()->loadMetadataForClass(new \ReflectionClass('JMS\Serializer\Tests\Fixtures\GetSetObject')); + + $p = new PropertyMetadata($m->name, 'name'); + $p->type = array('name' => 'string', 'params' => array()); + $p->getter = 'getTrimmedName'; + $p->setter = 'setCapitalizedName'; + + $this->assertEquals($p, $m->propertyMetadata['name']); + } + + protected function getDriver() + { + $append = ''; + if (func_num_args() == 1) { + $append = '/'.func_get_arg(0); + } + + return new XmlDriver(new FileLocator(array( + 'JMS\Serializer\Tests\Fixtures' => __DIR__.'/xml'.$append, + ))); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/YamlDriverTest.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/YamlDriverTest.php new file mode 100644 index 0000000000..d295a7f912 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/YamlDriverTest.php @@ -0,0 +1,97 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Metadata\Driver; + +use Metadata\Driver\FileLocator; +use JMS\Serializer\Metadata\PropertyMetadata; +use JMS\Serializer\Metadata\Driver\YamlDriver; + +class YamlDriverTest extends BaseDriverTest +{ + public function testAccessorOrderIsInferred() + { + $m = $this->getDriverForSubDir('accessor_inferred')->loadMetadataForClass(new \ReflectionClass('JMS\Serializer\Tests\Fixtures\Person')); + $this->assertEquals(array('age', 'name'), array_keys($m->propertyMetadata)); + } + + public function testShortExposeSyntax() + { + $m = $this->getDriverForSubDir('short_expose')->loadMetadataForClass(new \ReflectionClass('JMS\Serializer\Tests\Fixtures\Person')); + + $this->assertArrayHasKey('name', $m->propertyMetadata); + $this->assertArrayNotHasKey('age', $m->propertyMetadata); + } + + public function testBlogPost() + { + $m = $this->getDriverForSubDir('exclude_all')->loadMetadataForClass(new \ReflectionClass('JMS\Serializer\Tests\Fixtures\BlogPost')); + + $this->assertArrayHasKey('title', $m->propertyMetadata); + + $excluded = array('createdAt', 'published', 'comments', 'author'); + foreach ($excluded as $key) { + $this->assertArrayNotHasKey($key, $m->propertyMetadata); + } + } + + public function testBlogPostExcludeNoneStrategy() + { + $m = $this->getDriverForSubDir('exclude_none')->loadMetadataForClass(new \ReflectionClass('JMS\Serializer\Tests\Fixtures\BlogPost')); + + $this->assertArrayNotHasKey('title', $m->propertyMetadata); + + $excluded = array('createdAt', 'published', 'comments', 'author'); + foreach ($excluded as $key) { + $this->assertArrayHasKey($key, $m->propertyMetadata); + } + } + + public function testBlogPostCaseInsensitive() + { + $m = $this->getDriverForSubDir('case')->loadMetadataForClass(new \ReflectionClass('JMS\Serializer\Tests\Fixtures\BlogPost')); + + $p = new PropertyMetadata($m->name, 'title'); + $p->type = array('name' => 'string', 'params' => array()); + $this->assertEquals($p, $m->propertyMetadata['title']); + } + + public function testBlogPostAccessor() + { + $m = $this->getDriverForSubDir('accessor')->loadMetadataForClass(new \ReflectionClass('JMS\Serializer\Tests\Fixtures\BlogPost')); + + $this->assertArrayHasKey('title', $m->propertyMetadata); + + $p = new PropertyMetadata($m->name, 'title'); + $p->getter = 'getOtherTitle'; + $p->setter = 'setOtherTitle'; + $this->assertEquals($p, $m->propertyMetadata['title']); + } + + private function getDriverForSubDir($subDir = null) + { + return new YamlDriver(new FileLocator(array( + 'JMS\Serializer\Tests\Fixtures' => __DIR__.'/yml' . ($subDir ? '/'.$subDir : ''), + ))); + } + + protected function getDriver() + { + return $this->getDriverForSubDir(); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/AuthorExpressionAccess.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/AuthorExpressionAccess.php new file mode 100644 index 0000000000..a452ea7777 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/AuthorExpressionAccess.php @@ -0,0 +1,19 @@ +addPropertyMetadata($p); + +$p = new VirtualPropertyMetadata('JMS\Serializer\Tests\Fixtures\AuthorExpressionAccess', 'getLastName'); +$metadata->addPropertyMetadata($p); + +$p = new PropertyMetadata('JMS\Serializer\Tests\Fixtures\AuthorExpressionAccess', 'id'); +$metadata->addPropertyMetadata($p); + +return $metadata; diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/AuthorReadOnly.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/AuthorReadOnly.php new file mode 100644 index 0000000000..d323d6e4da --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/AuthorReadOnly.php @@ -0,0 +1,7 @@ +xmlRootName = 'blog-post'; + +$metadata->registerNamespace('http://example.com/namespace'); +$metadata->registerNamespace('http://schemas.google.com/g/2005', 'gd'); +$metadata->registerNamespace('http://www.w3.org/2005/Atom', 'atom'); +$metadata->registerNamespace('http://purl.org/dc/elements/1.1/', 'dc'); + +$pMetadata = new PropertyMetadata('JMS\Serializer\Tests\Fixtures\BlogPost', 'id'); +$pMetadata->setType('string'); +$pMetadata->groups = array('comments','post'); +$pMetadata->xmlElementCData = false; +$metadata->addPropertyMetadata($pMetadata); + +$pMetadata = new PropertyMetadata('JMS\Serializer\Tests\Fixtures\BlogPost', 'title'); +$pMetadata->setType('string'); +$pMetadata->groups = array('comments','post'); +$pMetadata->xmlNamespace = "http://purl.org/dc/elements/1.1/"; +$metadata->addPropertyMetadata($pMetadata); + +$pMetadata = new PropertyMetadata('JMS\Serializer\Tests\Fixtures\BlogPost', 'createdAt'); +$pMetadata->setType('DateTime'); +$pMetadata->xmlAttribute = true; +$metadata->addPropertyMetadata($pMetadata); + +$pMetadata = new PropertyMetadata('JMS\Serializer\Tests\Fixtures\BlogPost', 'published'); +$pMetadata->setType('boolean'); +$pMetadata->serializedName = 'is_published'; +$pMetadata->groups = array('post'); +$pMetadata->xmlAttribute = true; +$metadata->addPropertyMetadata($pMetadata); + +$pMetadata = new PropertyMetadata('JMS\Serializer\Tests\Fixtures\BlogPost', 'etag'); +$pMetadata->setType('string'); +$pMetadata->groups = array('post'); +$pMetadata->xmlAttribute = true; +$pMetadata->xmlNamespace = 'http://schemas.google.com/g/2005'; +$metadata->addPropertyMetadata($pMetadata); + +$pMetadata = new PropertyMetadata('JMS\Serializer\Tests\Fixtures\BlogPost', 'comments'); +$pMetadata->setType('ArrayCollection'); +$pMetadata->xmlCollection = true; +$pMetadata->xmlCollectionInline = true; +$pMetadata->xmlEntryName = 'comment'; +$pMetadata->groups = array('comments'); + +$metadata->addPropertyMetadata($pMetadata); + +$pMetadata = new PropertyMetadata('JMS\Serializer\Tests\Fixtures\BlogPost', 'author'); +$pMetadata->setType('JMS\Serializer\Tests\Fixtures\Author'); +$pMetadata->groups = array('post'); +$pMetadata->xmlNamespace = 'http://www.w3.org/2005/Atom'; + +$metadata->addPropertyMetadata($pMetadata); + +return $metadata; diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/Discriminator.Car.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/Discriminator.Car.php new file mode 100644 index 0000000000..a3b07b5001 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/Discriminator.Car.php @@ -0,0 +1,7 @@ +setDiscriminator('type', array( + 'child' => 'JMS\Serializer\Tests\Fixtures\Discriminator\ObjectWithXmlAttributeDiscriminatorChild' +)); +$metadata->xmlDiscriminatorAttribute = true; +$metadata->xmlDiscriminatorCData = false; +return $metadata; diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/Discriminator.ObjectWithXmlNamespaceDiscriminatorParent.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/Discriminator.ObjectWithXmlNamespaceDiscriminatorParent.php new file mode 100644 index 0000000000..a10ee1f520 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/Discriminator.ObjectWithXmlNamespaceDiscriminatorParent.php @@ -0,0 +1,11 @@ +setDiscriminator('type', array( + 'child' => 'JMS\Serializer\Tests\Fixtures\Discriminator\ObjectWithXmlNamespaceDiscriminatorChild' +)); +$metadata->xmlDiscriminatorNamespace = 'http://example.com/'; + +return $metadata; diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/Discriminator.Vehicle.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/Discriminator.Vehicle.php new file mode 100644 index 0000000000..9267162a4a --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/Discriminator.Vehicle.php @@ -0,0 +1,16 @@ +setDiscriminator('type', array( + 'car' => 'JMS\Serializer\Tests\Fixtures\Discriminator\Car', + 'moped' => 'JMS\Serializer\Tests\Fixtures\Discriminator\Moped', +)); + +$km = new PropertyMetadata('JMS\Serializer\Tests\Fixtures\Discriminator\Vehicle', 'km'); +$km->setType('integer'); +$metadata->addPropertyMetadata($km); + +return $metadata; diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/DiscriminatorGroup.Vehicle.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/DiscriminatorGroup.Vehicle.php new file mode 100644 index 0000000000..792d93ff7a --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/DiscriminatorGroup.Vehicle.php @@ -0,0 +1,15 @@ +setDiscriminator('type', array( + 'car' => 'JMS\Serializer\Tests\Fixtures\DiscriminatorGroup\Car', +), array('foo')); + +$km = new PropertyMetadata('JMS\Serializer\Tests\Fixtures\DiscriminatorGroup\Vehicle', 'km'); +$km->setType('integer'); +$metadata->addPropertyMetadata($km); + +return $metadata; diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/Node.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/Node.php new file mode 100644 index 0000000000..782c9ab29a --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/Node.php @@ -0,0 +1,12 @@ +maxDepth = 2; +$metadata->addPropertyMetadata($pMetadata); + +return $metadata; diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/ObjectWithAbsentXmlListNode.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/ObjectWithAbsentXmlListNode.php new file mode 100644 index 0000000000..3599ac3f4a --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/ObjectWithAbsentXmlListNode.php @@ -0,0 +1,23 @@ +xmlCollectionSkipWhenEmpty = true; +$metadata->addPropertyMetadata($pMetadata); + +$pMetadata = new PropertyMetadata($className, 'present'); +$pMetadata->xmlCollectionSkipWhenEmpty = false; +$metadata->addPropertyMetadata($pMetadata); + +$pMetadata = new PropertyMetadata($className, 'skipDefault'); +$metadata->addPropertyMetadata($pMetadata); + + +return $metadata; diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/ObjectWithExpressionVirtualPropertiesAndExcludeAll.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/ObjectWithExpressionVirtualPropertiesAndExcludeAll.php new file mode 100644 index 0000000000..b6365ecac4 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/ObjectWithExpressionVirtualPropertiesAndExcludeAll.php @@ -0,0 +1,13 @@ +addPropertyMetadata($pMetadata); + +return $metadata; diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/ObjectWithHandlerCallbacks.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/ObjectWithHandlerCallbacks.php new file mode 100644 index 0000000000..5edaa0c675 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/ObjectWithHandlerCallbacks.php @@ -0,0 +1,16 @@ +type = 'string'; +$metadata->addPropertyMetadata($pMetadata); + +$metadata->addHandlerCallback(GraphNavigator::DIRECTION_SERIALIZATION, 'json', 'toJson'); +$metadata->addHandlerCallback(GraphNavigator::DIRECTION_SERIALIZATION, 'xml', 'toXml'); + +return $metadata; diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/ObjectWithVirtualProperties.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/ObjectWithVirtualProperties.php new file mode 100644 index 0000000000..913688bfd5 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/ObjectWithVirtualProperties.php @@ -0,0 +1,28 @@ +addPropertyMetadata($pMetadata); + +$pMetadata = new VirtualPropertyMetadata($className, 'virtualValue'); +$pMetadata->getter = 'getVirtualValue'; +$metadata->addPropertyMetadata($pMetadata); + +$pMetadata = new VirtualPropertyMetadata($className, 'virtualSerializedValue'); +$pMetadata->getter = 'getVirtualSerializedValue'; +$pMetadata->serializedName = 'test'; +$metadata->addPropertyMetadata($pMetadata); + +$pMetadata = new VirtualPropertyMetadata($className, 'typedVirtualProperty'); +$pMetadata->getter = 'getTypedVirtualProperty'; +$pMetadata->setType('integer'); +$metadata->addPropertyMetadata($pMetadata); + +return $metadata; diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/ObjectWithVirtualPropertiesAndExcludeAll.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/ObjectWithVirtualPropertiesAndExcludeAll.php new file mode 100644 index 0000000000..9feef55f27 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/ObjectWithVirtualPropertiesAndExcludeAll.php @@ -0,0 +1,14 @@ +getter = 'getVirtualValue'; +$metadata->addPropertyMetadata($pMetadata); + +return $metadata; diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/ObjectWithXmlKeyValuePairs.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/ObjectWithXmlKeyValuePairs.php new file mode 100644 index 0000000000..ca1115b009 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/ObjectWithXmlKeyValuePairs.php @@ -0,0 +1,13 @@ +xmlKeyValuePairs = true; +$metadata->addPropertyMetadata($pMetadata); + +return $metadata; diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/ObjectWithXmlNamespaces.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/ObjectWithXmlNamespaces.php new file mode 100644 index 0000000000..5904dc6744 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/ObjectWithXmlNamespaces.php @@ -0,0 +1,41 @@ +xmlRootName = 'test-object'; +$metadata->xmlRootNamespace = 'http://example.com/namespace'; + +$metadata->registerNamespace('http://example.com/namespace'); +$metadata->registerNamespace('http://schemas.google.com/g/2005', 'gd'); +$metadata->registerNamespace('http://www.w3.org/2005/Atom', 'atom'); + +$pMetadata = new PropertyMetadata('JMS\Serializer\Tests\Fixtures\ObjectWithXmlNamespaces', 'title'); +$pMetadata->setType('string'); +$pMetadata->xmlNamespace = "http://purl.org/dc/elements/1.1/"; +$metadata->addPropertyMetadata($pMetadata); + +$pMetadata = new PropertyMetadata('JMS\Serializer\Tests\Fixtures\ObjectWithXmlNamespaces', 'createdAt'); +$pMetadata->setType('DateTime'); +$pMetadata->xmlAttribute = true; +$metadata->addPropertyMetadata($pMetadata); + +$pMetadata = new PropertyMetadata('JMS\Serializer\Tests\Fixtures\ObjectWithXmlNamespaces', 'etag'); +$pMetadata->setType('string'); +$pMetadata->xmlAttribute = true; +$pMetadata->xmlNamespace = 'http://schemas.google.com/g/2005'; +$metadata->addPropertyMetadata($pMetadata); + +$pMetadata = new PropertyMetadata('JMS\Serializer\Tests\Fixtures\ObjectWithXmlNamespaces', 'author'); +$pMetadata->setType('string'); +$pMetadata->xmlNamespace = 'http://www.w3.org/2005/Atom'; +$metadata->addPropertyMetadata($pMetadata); + +$pMetadata = new PropertyMetadata('JMS\Serializer\Tests\Fixtures\ObjectWithXmlNamespaces', 'language'); +$pMetadata->setType('string'); +$pMetadata->xmlAttribute = true; +$pMetadata->xmlNamespace = 'http://purl.org/dc/elements/1.1/'; +$metadata->addPropertyMetadata($pMetadata); + +return $metadata; diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/ParentSkipWithEmptyChild.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/ParentSkipWithEmptyChild.php new file mode 100644 index 0000000000..537430f3f0 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/ParentSkipWithEmptyChild.php @@ -0,0 +1,19 @@ +name, 'c'); +$metadata->addPropertyMetadata($pMeta); + +$pMeta = new PropertyMetadata($metadata->name, 'd'); +$metadata->addPropertyMetadata($pMeta); + +$pMeta = new PropertyMetadata($metadata->name, 'child'); +$pMeta->skipWhenEmpty = true; + +$metadata->addPropertyMetadata($pMeta); + +return $metadata; diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/Person.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/Person.php new file mode 100644 index 0000000000..1de706f281 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/Person.php @@ -0,0 +1,20 @@ +xmlRootName = 'child'; + +$pMetadata = new PropertyMetadata('JMS\Serializer\Tests\Fixtures\Person', 'name'); +$pMetadata->setType('string'); +$pMetadata->xmlValue = true; +$pMetadata->xmlElementCData = false; +$metadata->addPropertyMetadata($pMetadata); + +$pMetadata = new PropertyMetadata('JMS\Serializer\Tests\Fixtures\Person', 'age'); +$pMetadata->setType('integer'); +$pMetadata->xmlAttribute = true; +$metadata->addPropertyMetadata($pMetadata); + +return $metadata; diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/PersonSecret.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/PersonSecret.php new file mode 100644 index 0000000000..065ea45579 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/PersonSecret.php @@ -0,0 +1,22 @@ +setType('string'); +$metadata->addPropertyMetadata($pMetadata); + +$pMetadata = new PropertyMetadata('JMS\Serializer\Tests\Fixtures\PersonSecret', 'gender'); +$pMetadata->setType('string'); +$pMetadata->excludeIf = "show_data('gender')"; +$metadata->addPropertyMetadata($pMetadata); + +$pMetadata = new PropertyMetadata('JMS\Serializer\Tests\Fixtures\PersonSecret', 'age'); +$pMetadata->setType('string'); +$pMetadata->excludeIf = "!(show_data('age'))"; +$metadata->addPropertyMetadata($pMetadata); + +return $metadata; diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/Price.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/Price.php new file mode 100644 index 0000000000..541bcd89dc --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/Price.php @@ -0,0 +1,13 @@ +setType('float'); +$pMetadata->xmlValue = true; +$metadata->addPropertyMetadata($pMetadata); + +return $metadata; diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/SimpleClassObject.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/SimpleClassObject.php new file mode 100644 index 0000000000..8baf68a629 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/SimpleClassObject.php @@ -0,0 +1,28 @@ +registerNamespace('http://foo.example.org', 'foo'); +$metadata->registerNamespace('http://old.foo.example.org', 'old_foo'); +$metadata->registerNamespace('http://new.foo.example.org', 'new_foo'); + +$pMetadata = new PropertyMetadata('JMS\Serializer\Tests\Fixtures\SimpleClassObject', 'foo'); +$pMetadata->setType('string'); +$pMetadata->xmlNamespace = "http://old.foo.example.org"; +$pMetadata->xmlAttribute = true; +$metadata->addPropertyMetadata($pMetadata); + +$pMetadata = new PropertyMetadata('JMS\Serializer\Tests\Fixtures\SimpleClassObject', 'bar'); +$pMetadata->setType('string'); +$pMetadata->xmlNamespace = "http://foo.example.org"; +$metadata->addPropertyMetadata($pMetadata); + +$pMetadata = new PropertyMetadata('JMS\Serializer\Tests\Fixtures\SimpleClassObject', 'moo'); +$pMetadata->setType('string'); +$pMetadata->xmlNamespace = "http://new.foo.example.org"; +$metadata->addPropertyMetadata($pMetadata); + +return $metadata; \ No newline at end of file diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/SimpleSubClassObject.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/SimpleSubClassObject.php new file mode 100644 index 0000000000..ed750857ef --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/php/SimpleSubClassObject.php @@ -0,0 +1,26 @@ +registerNamespace('http://better.foo.example.org', 'foo'); +$metadata->registerNamespace('http://foo.example.org', 'old_foo'); + +$pMetadata = new PropertyMetadata('JMS\Serializer\Tests\Fixtures\SimpleSubClassObject', 'moo'); +$pMetadata->setType('string'); +$pMetadata->xmlNamespace = "http://better.foo.example.org"; +$metadata->addPropertyMetadata($pMetadata); + +$pMetadata = new PropertyMetadata('JMS\Serializer\Tests\Fixtures\SimpleSubClassObject', 'baz'); +$pMetadata->setType('string'); +$pMetadata->xmlNamespace = "http://foo.example.org"; +$metadata->addPropertyMetadata($pMetadata); + +$pMetadata = new PropertyMetadata('JMS\Serializer\Tests\Fixtures\SimpleSubClassObject', 'qux'); +$pMetadata->setType('string'); +$pMetadata->xmlNamespace = "http://new.foo.example.org"; +$metadata->addPropertyMetadata($pMetadata); + +return $metadata; \ No newline at end of file diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/AuthorExpressionAccess.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/AuthorExpressionAccess.xml new file mode 100644 index 0000000000..426ed6f5eb --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/AuthorExpressionAccess.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/AuthorReadOnly.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/AuthorReadOnly.xml new file mode 100644 index 0000000000..d145ced786 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/AuthorReadOnly.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/AuthorReadOnlyPerClass.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/AuthorReadOnlyPerClass.xml new file mode 100644 index 0000000000..b7a140fe89 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/AuthorReadOnlyPerClass.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/BlogPost.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/BlogPost.xml new file mode 100644 index 0000000000..98fb667c06 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/BlogPost.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ]]> + + + + + + + \ No newline at end of file diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/Discriminator.Car.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/Discriminator.Car.xml new file mode 100644 index 0000000000..638d67bcb7 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/Discriminator.Car.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/Discriminator.Moped.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/Discriminator.Moped.xml new file mode 100644 index 0000000000..b46eca19a3 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/Discriminator.Moped.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/Discriminator.ObjectWithXmlAttributeDiscriminatorParent.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/Discriminator.ObjectWithXmlAttributeDiscriminatorParent.xml new file mode 100644 index 0000000000..5a5ac6eb4f --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/Discriminator.ObjectWithXmlAttributeDiscriminatorParent.xml @@ -0,0 +1,9 @@ + + + + JMS\Serializer\Tests\Fixtures\Discriminator\ObjectWithXmlAttributeDiscriminatorChild + + + \ No newline at end of file diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/Discriminator.ObjectWithXmlNamespaceDiscriminatorParent.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/Discriminator.ObjectWithXmlNamespaceDiscriminatorParent.xml new file mode 100644 index 0000000000..ff021cc7fb --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/Discriminator.ObjectWithXmlNamespaceDiscriminatorParent.xml @@ -0,0 +1,9 @@ + + + + JMS\Serializer\Tests\Fixtures\Discriminator\ObjectWithXmlNamespaceDiscriminatorChild + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/Discriminator.Vehicle.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/Discriminator.Vehicle.xml new file mode 100644 index 0000000000..252c5a3776 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/Discriminator.Vehicle.xml @@ -0,0 +1,8 @@ + + + + JMS\Serializer\Tests\Fixtures\Discriminator\Car + JMS\Serializer\Tests\Fixtures\Discriminator\Moped + + + \ No newline at end of file diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/DiscriminatorGroup.Vehicle.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/DiscriminatorGroup.Vehicle.xml new file mode 100644 index 0000000000..4b40bbb7c9 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/DiscriminatorGroup.Vehicle.xml @@ -0,0 +1,10 @@ + + + + JMS\Serializer\Tests\Fixtures\DiscriminatorGroup\Car + + foo + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/GetSetObject.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/GetSetObject.xml new file mode 100644 index 0000000000..1835a5ba60 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/GetSetObject.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/Node.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/Node.xml new file mode 100644 index 0000000000..fd4162c099 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/Node.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/ObjectWithAbsentXmlListNode.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/ObjectWithAbsentXmlListNode.xml new file mode 100644 index 0000000000..5ebeb9aec0 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/ObjectWithAbsentXmlListNode.xml @@ -0,0 +1,16 @@ + + + + + array + + + + array + + + + array + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/ObjectWithExpressionVirtualPropertiesAndExcludeAll.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/ObjectWithExpressionVirtualPropertiesAndExcludeAll.xml new file mode 100644 index 0000000000..0219cbe11d --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/ObjectWithExpressionVirtualPropertiesAndExcludeAll.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/ObjectWithHandlerCallbacks.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/ObjectWithHandlerCallbacks.xml new file mode 100644 index 0000000000..14202907c7 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/ObjectWithHandlerCallbacks.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/ObjectWithVirtualProperties.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/ObjectWithVirtualProperties.xml new file mode 100644 index 0000000000..9f65def74a --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/ObjectWithVirtualProperties.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/ObjectWithVirtualPropertiesAndExcludeAll.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/ObjectWithVirtualPropertiesAndExcludeAll.xml new file mode 100644 index 0000000000..8128445d39 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/ObjectWithVirtualPropertiesAndExcludeAll.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/ObjectWithXmlKeyValuePairs.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/ObjectWithXmlKeyValuePairs.xml new file mode 100644 index 0000000000..6cabc2ca0b --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/ObjectWithXmlKeyValuePairs.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/ObjectWithXmlNamespaces.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/ObjectWithXmlNamespaces.xml new file mode 100644 index 0000000000..c9a0b5f7d0 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/ObjectWithXmlNamespaces.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/ParentSkipWithEmptyChild.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/ParentSkipWithEmptyChild.xml new file mode 100644 index 0000000000..30b8643c84 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/ParentSkipWithEmptyChild.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/Person.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/Person.xml new file mode 100644 index 0000000000..a723e7baf5 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/Person.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/PersonSecret.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/PersonSecret.xml new file mode 100644 index 0000000000..141f79504d --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/PersonSecret.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/Price.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/Price.xml new file mode 100644 index 0000000000..1e6c31fc7d --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/Price.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/SimpleClassObject.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/SimpleClassObject.xml new file mode 100644 index 0000000000..bdd17116ca --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/SimpleClassObject.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/SimpleSubClassObject.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/SimpleSubClassObject.xml new file mode 100644 index 0000000000..8acd396227 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/SimpleSubClassObject.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/case/BlogPost.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/case/BlogPost.xml new file mode 100644 index 0000000000..663ccd6351 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/case/BlogPost.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/exclude_all/BlogPost.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/exclude_all/BlogPost.xml new file mode 100644 index 0000000000..a0e77c52a0 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/exclude_all/BlogPost.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/exclude_none/BlogPost.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/exclude_none/BlogPost.xml new file mode 100644 index 0000000000..e0394ee2c0 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/exclude_none/BlogPost.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/invalid.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/invalid.xml new file mode 100644 index 0000000000..619d54aec2 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/xml/invalid.xml @@ -0,0 +1 @@ +This contains no valid XML markup. \ No newline at end of file diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/AuthorExpressionAccess.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/AuthorExpressionAccess.yml new file mode 100644 index 0000000000..9d65e6215e --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/AuthorExpressionAccess.yml @@ -0,0 +1,11 @@ +JMS\Serializer\Tests\Fixtures\AuthorExpressionAccess: + xml_root_name: author + properties: + id: + expose: true + virtual_properties: + firstName: + exp: object.getFirstName() + getLastName: + expose: true + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/AuthorReadOnly.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/AuthorReadOnly.yml new file mode 100644 index 0000000000..07859d2a1d --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/AuthorReadOnly.yml @@ -0,0 +1,10 @@ +JMS\Serializer\Tests\Fixtures\AuthorReadOnly: + xml_root_name: author + properties: + id: + read_only: true + name: + serialized_name: full_name + access_type: public_method + accessor_getter: getName + read_only: true diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/AuthorReadOnlyPerClass.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/AuthorReadOnlyPerClass.yml new file mode 100644 index 0000000000..95f87eee1d --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/AuthorReadOnlyPerClass.yml @@ -0,0 +1,11 @@ +JMS\Serializer\Tests\Fixtures\AuthorReadOnlyPerClass: + xml_root_name: author + read_only: true + properties: + id: + + name: + serialized_name: full_name + access_type: public_method + accessor_getter: getName + read_only: false diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/BlogPost.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/BlogPost.yml new file mode 100644 index 0000000000..bb9ff7fa45 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/BlogPost.yml @@ -0,0 +1,43 @@ +JMS\Serializer\Tests\Fixtures\BlogPost: + xml_root_name: blog-post + xml_namespaces: + "": http://example.com/namespace + gd: http://schemas.google.com/g/2005 + atom: http://www.w3.org/2005/Atom + dc: http://purl.org/dc/elements/1.1/ + properties: + id: + type: string + groups: [comments, post] + xml_element: + cdata: false + title: + type: string + groups: [comments, post] + xml_element: + namespace: http://purl.org/dc/elements/1.1/ + createdAt: + type: DateTime + xml_attribute: true + published: + type: boolean + serialized_name: is_published + xml_attribute: true + groups: [post] + etag: + type: string + groups: [post] + xml_attribute: true + xml_element: + namespace: http://schemas.google.com/g/2005 + comments: + type: ArrayCollection + groups: [comments] + xml_list: + inline: true + entry_name: comment + author: + type: JMS\Serializer\Tests\Fixtures\Author + groups: [post] + xml_element: + namespace: http://www.w3.org/2005/Atom diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/Discriminator.Car.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/Discriminator.Car.yml new file mode 100644 index 0000000000..9f0fcba4ab --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/Discriminator.Car.yml @@ -0,0 +1 @@ +JMS\Serializer\Tests\Fixtures\Discriminator\Car: { } \ No newline at end of file diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/Discriminator.Moped.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/Discriminator.Moped.yml new file mode 100644 index 0000000000..d52a81d4bd --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/Discriminator.Moped.yml @@ -0,0 +1 @@ +JMS\Serializer\Tests\Fixtures\Discriminator\Moped: { } \ No newline at end of file diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/Discriminator.ObjectWithXmlAttributeDiscriminatorParent.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/Discriminator.ObjectWithXmlAttributeDiscriminatorParent.yml new file mode 100644 index 0000000000..ba572c561a --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/Discriminator.ObjectWithXmlAttributeDiscriminatorParent.yml @@ -0,0 +1,8 @@ +JMS\Serializer\Tests\Fixtures\Discriminator\ObjectWithXmlAttributeDiscriminatorParent: + discriminator: + field_name: type + map: + child: JMS\Serializer\Tests\Fixtures\Discriminator\ObjectWithXmlAttributeDiscriminatorChild + xml_attribute: true + xml_element: + cdata: false \ No newline at end of file diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/Discriminator.ObjectWithXmlNamespaceDiscriminatorParent.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/Discriminator.ObjectWithXmlNamespaceDiscriminatorParent.yml new file mode 100644 index 0000000000..e04a81d246 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/Discriminator.ObjectWithXmlNamespaceDiscriminatorParent.yml @@ -0,0 +1,7 @@ +JMS\Serializer\Tests\Fixtures\Discriminator\ObjectWithXmlNamespaceDiscriminatorParent: + discriminator: + field_name: type + map: + child: JMS\Serializer\Tests\Fixtures\Discriminator\ObjectWithXmlNamespaceDiscriminatorChild + xml_element: + namespace: http://example.com/ diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/Discriminator.Vehicle.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/Discriminator.Vehicle.yml new file mode 100644 index 0000000000..bcd5dc91f9 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/Discriminator.Vehicle.yml @@ -0,0 +1,10 @@ +JMS\Serializer\Tests\Fixtures\Discriminator\Vehicle: + discriminator: + field_name: type + map: + car: JMS\Serializer\Tests\Fixtures\Discriminator\Car + moped: JMS\Serializer\Tests\Fixtures\Discriminator\Moped + + properties: + km: + type: integer \ No newline at end of file diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/DiscriminatorGroup.Vehicle.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/DiscriminatorGroup.Vehicle.yml new file mode 100644 index 0000000000..6d1ad8dbc4 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/DiscriminatorGroup.Vehicle.yml @@ -0,0 +1,10 @@ +JMS\Serializer\Tests\Fixtures\DiscriminatorGroup\Vehicle: + discriminator: + field_name: type + map: + car: JMS\Serializer\Tests\Fixtures\DiscriminatorGroup\Car + groups: [foo] + + properties: + km: + type: integer diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/Node.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/Node.yml new file mode 100644 index 0000000000..c4651fd616 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/Node.yml @@ -0,0 +1,4 @@ +JMS\Serializer\Tests\Fixtures\Node: + properties: + children: + max_depth: 2 diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/ObjectWithAbsentXmlListNode.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/ObjectWithAbsentXmlListNode.yml new file mode 100644 index 0000000000..fd4d8e6af1 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/ObjectWithAbsentXmlListNode.yml @@ -0,0 +1,14 @@ +JMS\Serializer\Tests\Fixtures\ObjectWithAbsentXmlListNode: + properties: + absent: + type: array + xml_list: + skip_when_empty: true + present: + type: array + xml_list: + skip_when_empty: false + skipDefault: + type: array + xml_list: + inline: false diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/ObjectWithExpressionVirtualPropertiesAndExcludeAll.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/ObjectWithExpressionVirtualPropertiesAndExcludeAll.yml new file mode 100644 index 0000000000..4b7efd039f --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/ObjectWithExpressionVirtualPropertiesAndExcludeAll.yml @@ -0,0 +1,5 @@ +JMS\Serializer\Tests\Fixtures\ObjectWithExpressionVirtualPropertiesAndExcludeAll: + exclusion_policy: all + virtual_properties: + virtualValue: + exp: object.getVirtualValue() diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/ObjectWithHandlerCallbacks.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/ObjectWithHandlerCallbacks.yml new file mode 100644 index 0000000000..6c5ad76e9f --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/ObjectWithHandlerCallbacks.yml @@ -0,0 +1,8 @@ +JMS\Serializer\Tests\Fixtures\ObjectWithHandlerCallbacks: + properties: + name: + type: string + handler_callbacks: + serialization: + xml: toXml + json: toJson diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/ObjectWithVirtualProperties.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/ObjectWithVirtualProperties.yml new file mode 100644 index 0000000000..9f6a04d3ab --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/ObjectWithVirtualProperties.yml @@ -0,0 +1,10 @@ +JMS\Serializer\Tests\Fixtures\ObjectWithVirtualProperties: + properties: + existField: + type: string + virtual_properties: + getVirtualValue: ~ + getVirtualSerializedValue: + serialized_name: test + getTypedVirtualProperty: + type: integer diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/ObjectWithVirtualPropertiesAndExcludeAll.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/ObjectWithVirtualPropertiesAndExcludeAll.yml new file mode 100644 index 0000000000..7351bf7ad9 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/ObjectWithVirtualPropertiesAndExcludeAll.yml @@ -0,0 +1,4 @@ +JMS\Serializer\Tests\Fixtures\ObjectWithVirtualPropertiesAndExcludeAll: + exclusion_policy: all + virtual_properties: + getVirtualValue: ~ \ No newline at end of file diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/ObjectWithXmlKeyValuePairs.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/ObjectWithXmlKeyValuePairs.yml new file mode 100644 index 0000000000..2195b67c3b --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/ObjectWithXmlKeyValuePairs.yml @@ -0,0 +1,5 @@ +JMS\Serializer\Tests\Fixtures\ObjectWithXmlKeyValuePairs: + properties: + array: + type: array + xml_key_value_pairs: true diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/ObjectWithXmlNamespaces.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/ObjectWithXmlNamespaces.yml new file mode 100644 index 0000000000..3e340d10d3 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/ObjectWithXmlNamespaces.yml @@ -0,0 +1,29 @@ +JMS\Serializer\Tests\Fixtures\ObjectWithXmlNamespaces: + xml_root_name: test-object + xml_root_namespace: http://example.com/namespace + xml_namespaces: + "": http://example.com/namespace + gd: http://schemas.google.com/g/2005 + atom: http://www.w3.org/2005/Atom + properties: + title: + type: string + xml_element: + namespace: http://purl.org/dc/elements/1.1/ + createdAt: + type: DateTime + xml_attribute: true + etag: + type: string + xml_attribute: true + xml_element: + namespace: http://schemas.google.com/g/2005 + author: + type: string + xml_element: + namespace: http://www.w3.org/2005/Atom + language: + type: string + xml_attribute: true + xml_element: + namespace: http://purl.org/dc/elements/1.1/ diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/ParentSkipWithEmptyChild.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/ParentSkipWithEmptyChild.yml new file mode 100644 index 0000000000..daf228b970 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/ParentSkipWithEmptyChild.yml @@ -0,0 +1,8 @@ +JMS\Serializer\Tests\Fixtures\ParentSkipWithEmptyChild: + properties: + c: + type: string + d: + type: string + child: + skip_when_empty: true diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/Person.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/Person.yml new file mode 100644 index 0000000000..c98e8655d3 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/Person.yml @@ -0,0 +1,11 @@ +JMS\Serializer\Tests\Fixtures\Person: + xml_root_name: child + properties: + name: + type: string + xml_value: true + xml_element: + cdata: false + age: + type: integer + xml_attribute: true diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/PersonSecret.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/PersonSecret.yml new file mode 100644 index 0000000000..88a6f554d3 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/PersonSecret.yml @@ -0,0 +1,10 @@ +JMS\Serializer\Tests\Fixtures\PersonSecret: + properties: + name: + type: string + gender: + type: string + exclude_if: "show_data('gender')" + age: + type: string + expose_if: "show_data('age')" diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/Price.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/Price.yml new file mode 100644 index 0000000000..678d53e167 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/Price.yml @@ -0,0 +1,5 @@ +JMS\Serializer\Tests\Fixtures\Price: + properties: + price: + type: float + xml_value: true diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/SimpleClassObject.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/SimpleClassObject.yml new file mode 100644 index 0000000000..609713406e --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/SimpleClassObject.yml @@ -0,0 +1,19 @@ +JMS\Serializer\Tests\Fixtures\SimpleClassObject: + xml_namespaces: + foo: http://foo.example.org + old_foo: http://old.foo.example.org + new_foo: http://new.foo.example.org + properties: + foo: + type: string + xml_attribute: true + xml_element: + namespace: http://old.foo.example.org + bar: + type: string + xml_element: + namespace: http://foo.example.org + moo: + type: string + xml_element: + namespace: http://new.foo.example.org \ No newline at end of file diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/SimpleSubClassObject.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/SimpleSubClassObject.yml new file mode 100644 index 0000000000..d99c7b113f --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/SimpleSubClassObject.yml @@ -0,0 +1,17 @@ +JMS\Serializer\Tests\Fixtures\SimpleSubClassObject: + xml_namespaces: + foo: http://better.foo.example.org + old_foo: http://foo.example.org + properties: + moo: + type: string + xml_element: + namespace: http://better.foo.example.org + baz: + type: string + xml_element: + namespace: http://foo.example.org + qux: + type: string + xml_element: + namespace: http://new.foo.example.org \ No newline at end of file diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/accessor/BlogPost.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/accessor/BlogPost.yml new file mode 100644 index 0000000000..9b57d39314 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/accessor/BlogPost.yml @@ -0,0 +1,7 @@ +JMS\Serializer\Tests\Fixtures\BlogPost: + xml_root_name: blog-post + properties: + title: + accessor: + getter: getOtherTitle + setter: setOtherTitle diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/accessor_inferred/Person.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/accessor_inferred/Person.yml new file mode 100644 index 0000000000..933e03fc3e --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/accessor_inferred/Person.yml @@ -0,0 +1,6 @@ +JMS\Serializer\Tests\Fixtures\Person: + custom_accessor_order: ["age", "name"] + + properties: + age: ~ + name: ~ diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/case/BlogPost.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/case/BlogPost.yml new file mode 100644 index 0000000000..4cc2f8ac10 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/case/BlogPost.yml @@ -0,0 +1,7 @@ +JMS\Serializer\Tests\Fixtures\BlogPost: + xml_root_name: blog-post + exclusion_policy: all + properties: + title: + type: string + expose: TRUE diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/exclude_all/BlogPost.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/exclude_all/BlogPost.yml new file mode 100644 index 0000000000..419cb7ea67 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/exclude_all/BlogPost.yml @@ -0,0 +1,7 @@ +JMS\Serializer\Tests\Fixtures\BlogPost: + xml_root_name: blog-post + exclusion_policy: ALL + properties: + title: + type: string + expose: true diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/exclude_none/BlogPost.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/exclude_none/BlogPost.yml new file mode 100644 index 0000000000..7067cf8222 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/exclude_none/BlogPost.yml @@ -0,0 +1,7 @@ +JMS\Serializer\Tests\Fixtures\BlogPost: + xml_root_name: blog-post + exclusion_policy: NONE + properties: + title: + type: string + exclude: true diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/short_expose/Person.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/short_expose/Person.yml new file mode 100644 index 0000000000..4ab55bea97 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Metadata/Driver/yml/short_expose/Person.yml @@ -0,0 +1,4 @@ +JMS\Serializer\Tests\Fixtures\Person: + exclusion_policy: ALL + properties: + name: ~ diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/ArrayTest.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/ArrayTest.php new file mode 100644 index 0000000000..3658ef7108 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/ArrayTest.php @@ -0,0 +1,123 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Serializer; + +use JMS\Serializer\Handler\HandlerRegistry; +use JMS\Serializer\Tests\Fixtures\Author; +use JMS\Serializer\Tests\Fixtures\AuthorList; +use JMS\Serializer\Tests\Fixtures\Order; +use JMS\Serializer\Tests\Fixtures\Price; +use PhpCollection\Map; +use JMS\Serializer\Naming\SerializedNameAnnotationStrategy; +use Metadata\MetadataFactory; +use JMS\Serializer\Metadata\Driver\AnnotationDriver; +use Doctrine\Common\Annotations\AnnotationReader; +use JMS\Serializer\Construction\UnserializeObjectConstructor; +use JMS\Serializer\JsonSerializationVisitor; +use JMS\Serializer\JsonDeserializationVisitor; +use JMS\Serializer\Serializer; +use JMS\Serializer\Naming\CamelCaseNamingStrategy; + +class ArrayTest extends \PHPUnit_Framework_TestCase +{ + protected $serializer; + + public function setUp() + { + $namingStrategy = new SerializedNameAnnotationStrategy(new CamelCaseNamingStrategy()); + + $this->serializer = new Serializer( + new MetadataFactory(new AnnotationDriver(new AnnotationReader())), + new HandlerRegistry(), + new UnserializeObjectConstructor(), + new Map(array('json' => new JsonSerializationVisitor($namingStrategy))), + new Map(array('json' => new JsonDeserializationVisitor($namingStrategy))) + ); + } + + public function testToArray() + { + $order = new Order(new Price(5)); + + $expected = array( + 'cost' => array( + 'price' => 5 + ) + ); + + $result = $this->serializer->toArray($order); + + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider scalarValues + */ + public function testToArrayWithScalar($input) + { + $this->setExpectedException('JMS\Serializer\Exception\RuntimeException', sprintf( + 'The input data of type "%s" did not convert to an array, but got a result of type "%s".', + gettype($input), + gettype($input) + )); + $result = $this->serializer->toArray($input); + + $this->assertEquals(array($input), $result); + } + + public function scalarValues() + { + return array( + array(42), + array(3.14159), + array('helloworld'), + array(true), + ); + } + + public function testFromArray() + { + $data = array( + 'cost' => array( + 'price' => 2.5 + ) + ); + + $expected = new Order(new Price(2.5)); + $result = $this->serializer->fromArray($data, 'JMS\Serializer\Tests\Fixtures\Order'); + + $this->assertEquals($expected, $result); + } + + public function testToArrayReturnsArrayObjectAsArray() + { + $result = $this->serializer->toArray(new Author(null)); + + $this->assertSame(array(), $result); + } + + public function testToArrayConversNestedArrayObjects() + { + $list = new AuthorList(); + $list->add(new Author(null)); + + $result = $this->serializer->toArray($list); + $this->assertSame(array('authors' => array(array())), $result); + } +} \ No newline at end of file diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/BaseSerializationTest.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/BaseSerializationTest.php new file mode 100644 index 0000000000..8dfb48570e --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/BaseSerializationTest.php @@ -0,0 +1,1436 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Serializer; + +use JMS\Serializer\Accessor\DefaultAccessorStrategy; +use JMS\Serializer\Accessor\ExpressionAccessorStrategy; +use JMS\Serializer\Context; +use JMS\Serializer\DeserializationContext; +use JMS\Serializer\Exclusion\GroupsExclusionStrategy; +use JMS\Serializer\Expression\ExpressionEvaluator; +use JMS\Serializer\GraphNavigator; +use JMS\Serializer\Handler\PhpCollectionHandler; +use JMS\Serializer\Handler\StdClassHandler; +use JMS\Serializer\SerializationContext; +use JMS\Serializer\Tests\Fixtures\AuthorExpressionAccess; +use JMS\Serializer\Tests\Fixtures\DateTimeArraysObject; +use JMS\Serializer\Tests\Fixtures\Discriminator\Car; +use JMS\Serializer\Tests\Fixtures\Discriminator\Moped; +use JMS\Serializer\Tests\Fixtures\Garage; +use JMS\Serializer\Tests\Fixtures\GroupsUser; +use JMS\Serializer\Tests\Fixtures\InlineChild; +use JMS\Serializer\Tests\Fixtures\InlineChildEmpty; +use JMS\Serializer\Tests\Fixtures\InlineChildWithGroups; +use JMS\Serializer\Tests\Fixtures\NamedDateTimeArraysObject; +use JMS\Serializer\Tests\Fixtures\ObjectWithEmptyNullableAndEmptyArrays; +use JMS\Serializer\Tests\Fixtures\NamedDateTimeImmutableArraysObject; +use JMS\Serializer\Tests\Fixtures\ObjectWithIntListAndIntMap; +use JMS\Serializer\Tests\Fixtures\ParentDoNotSkipWithEmptyChild; +use JMS\Serializer\Tests\Fixtures\ParentSkipWithEmptyChild; +use JMS\Serializer\Tests\Fixtures\PersonSecret; +use JMS\Serializer\Tests\Fixtures\PersonSecretMore; +use JMS\Serializer\Tests\Fixtures\PersonSecretMoreVirtual; +use JMS\Serializer\Tests\Fixtures\PersonSecretVirtual; +use JMS\Serializer\Tests\Fixtures\Tag; +use JMS\Serializer\Tests\Fixtures\Timestamp; +use JMS\Serializer\Tests\Fixtures\Tree; +use JMS\Serializer\Tests\Fixtures\VehicleInterfaceGarage; +use PhpCollection\Sequence; +use Symfony\Component\ExpressionLanguage\ExpressionFunction; +use Symfony\Component\ExpressionLanguage\ExpressionLanguage; +use Symfony\Component\Form\FormFactoryBuilder; +use Symfony\Component\Translation\MessageSelector; +use Symfony\Component\Translation\IdentityTranslator; +use JMS\Serializer\EventDispatcher\Subscriber\DoctrineProxySubscriber; +use JMS\Serializer\Handler\HandlerRegistry; +use JMS\Serializer\EventDispatcher\EventDispatcher; +use Doctrine\Common\Annotations\AnnotationReader; +use Doctrine\Common\Collections\ArrayCollection; +use JMS\Serializer\Metadata\Driver\AnnotationDriver; +use JMS\Serializer\Construction\UnserializeObjectConstructor; +use JMS\Serializer\Handler\ArrayCollectionHandler; +use JMS\Serializer\Handler\ConstraintViolationHandler; +use JMS\Serializer\Handler\DateHandler; +use JMS\Serializer\Handler\FormErrorHandler; +use JMS\Serializer\JsonDeserializationVisitor; +use JMS\Serializer\JsonSerializationVisitor; +use JMS\Serializer\Naming\CamelCaseNamingStrategy; +use JMS\Serializer\Naming\SerializedNameAnnotationStrategy; +use JMS\Serializer\Serializer; +use JMS\Serializer\VisitorInterface; +use JMS\Serializer\XmlDeserializationVisitor; +use JMS\Serializer\XmlSerializationVisitor; +use JMS\Serializer\YamlSerializationVisitor; +use JMS\Serializer\Tests\Fixtures\AccessorOrderChild; +use JMS\Serializer\Tests\Fixtures\AccessorOrderParent; +use JMS\Serializer\Tests\Fixtures\AccessorOrderMethod; +use JMS\Serializer\Tests\Fixtures\Author; +use JMS\Serializer\Tests\Fixtures\Publisher; +use JMS\Serializer\Tests\Fixtures\AuthorList; +use JMS\Serializer\Tests\Fixtures\AuthorReadOnly; +use JMS\Serializer\Tests\Fixtures\BlogPost; +use JMS\Serializer\Tests\Fixtures\CircularReferenceParent; +use JMS\Serializer\Tests\Fixtures\Comment; +use JMS\Serializer\Tests\Fixtures\CurrencyAwareOrder; +use JMS\Serializer\Tests\Fixtures\CurrencyAwarePrice; +use JMS\Serializer\Tests\Fixtures\CustomDeserializationObject; +use JMS\Serializer\Tests\Fixtures\GetSetObject; +use JMS\Serializer\Tests\Fixtures\MaxDepth\Gh236Foo; +use JMS\Serializer\Tests\Fixtures\GroupsObject; +use JMS\Serializer\Tests\Fixtures\InvalidGroupsObject; +use JMS\Serializer\Tests\Fixtures\IndexedCommentsBlogPost; +use JMS\Serializer\Tests\Fixtures\InlineParent; +use JMS\Serializer\Tests\Fixtures\InitializedObjectConstructor; +use JMS\Serializer\Tests\Fixtures\InitializedBlogPostConstructor; +use JMS\Serializer\Tests\Fixtures\Log; +use JMS\Serializer\Tests\Fixtures\ObjectWithLifecycleCallbacks; +use JMS\Serializer\Tests\Fixtures\ObjectWithVersionedVirtualProperties; +use JMS\Serializer\Tests\Fixtures\ObjectWithVirtualProperties; +use JMS\Serializer\Tests\Fixtures\Order; +use JMS\Serializer\Tests\Fixtures\Price; +use JMS\Serializer\Tests\Fixtures\SimpleObject; +use JMS\Serializer\Tests\Fixtures\ObjectWithNullProperty; +use JMS\Serializer\Tests\Fixtures\SimpleObjectProxy; +use JMS\Serializer\Tests\Fixtures\Article; +use JMS\Serializer\Tests\Fixtures\Input; +use JMS\Serializer\Tests\Fixtures\ObjectWithEmptyHash; +use Metadata\MetadataFactory; +use Symfony\Component\Form\Form; +use Symfony\Component\Form\FormError; +use Symfony\Component\Validator\Constraints\Time; +use Symfony\Component\Validator\ConstraintViolation; +use Symfony\Component\Validator\ConstraintViolationList; +use PhpCollection\Map; +use JMS\Serializer\Exclusion\DepthExclusionStrategy; +use JMS\Serializer\Tests\Fixtures\Node; +use JMS\Serializer\Tests\Fixtures\AuthorReadOnlyPerClass; + +abstract class BaseSerializationTest extends \PHPUnit_Framework_TestCase +{ + protected $factory; + + /** + * @var EventDispatcher + */ + protected $dispatcher; + + /** @var Serializer */ + protected $serializer; + protected $handlerRegistry; + protected $serializationVisitors; + protected $deserializationVisitors; + protected $objectConstructor; + + public function testSerializeNullArray() + { + $arr = array('foo' => 'bar', 'baz' => null, null); + + $this->assertEquals( + $this->getContent('nullable'), + $this->serializer->serialize($arr, $this->getFormat(), SerializationContext::create()->setSerializeNull(true)) + ); + } + + public function testSerializeNullArrayExcludingNulls() + { + $arr = array('foo' => 'bar', 'baz' => null, null); + + $this->assertEquals( + $this->getContent('nullable_skip'), + $this->serializer->serialize($arr, $this->getFormat(), SerializationContext::create()->setSerializeNull(false)) + ); + } + + public function testSerializeNullObject() + { + $obj = new ObjectWithNullProperty('foo', 'bar'); + + $this->assertEquals( + $this->getContent('simple_object_nullable'), + $this->serializer->serialize($obj, $this->getFormat(), SerializationContext::create()->setSerializeNull(true)) + ); + } + + /** + * @dataProvider getTypes + */ + public function testNull($type) + { + $this->assertEquals($this->getContent('null'), $this->serialize(null), $type); + + if ($this->hasDeserializer()) { + $this->assertEquals(null, $this->deserialize($this->getContent('null'), $type)); + } + } + + public function getTypes() + { + return array( + array('NULL'), + array('integer'), + array('double'), + array('float'), + array('string'), + array('DateTime'), + ); + } + + public function testString() + { + $this->assertEquals($this->getContent('string'), $this->serialize('foo')); + + if ($this->hasDeserializer()) { + $this->assertEquals('foo', $this->deserialize($this->getContent('string'), 'string')); + } + } + + /** + * @expectedException \JMS\Serializer\Exception\ExpressionLanguageRequiredException + * @expectedExceptionMessage To use conditional exclude/expose in JMS\Serializer\Tests\Fixtures\PersonSecret you must configure the expression language. + */ + public function testExpressionExclusionNotConfigured() + { + $person = new PersonSecret(); + $person->gender = 'f'; + $person->name = 'mike'; + $this->serialize($person); + } + + + public function testExpressionExclusionConfiguredWithDisjunctStrategy() + { + $person = new PersonSecret(); + $person->gender = 'f'; + $person->name = 'mike'; + + $language = new ExpressionLanguage(); + $language->addFunction(new ExpressionFunction('show_data', function () { + return "true"; + }, function () { + return true; + })); + + $serializer = new Serializer($this->factory, $this->handlerRegistry, $this->objectConstructor, $this->serializationVisitors, $this->deserializationVisitors, $this->dispatcher, null, new ExpressionEvaluator($language)); + + $this->assertEquals($this->getContent('person_secret_hide'), $serializer->serialize($person, $this->getFormat())); + } + + public function expressionFunctionProvider() + { + $person = new PersonSecret(); + $person->gender = 'f'; + $person->name = 'mike'; + + $personMoreSecret = new PersonSecretMore(); + $personMoreSecret->gender = 'f'; + $personMoreSecret->name = 'mike'; + + $personVirtual = new PersonSecretVirtual(); + $personVirtual->gender = 'f'; + $personVirtual->name = 'mike'; + + $personMoreSecretVirtual = new PersonSecretMoreVirtual(); + $personMoreSecretVirtual->gender = 'f'; + $personMoreSecretVirtual->name = 'mike'; + + $showGender = new ExpressionFunction('show_data', function () { + return "true"; + }, function () { + return true; + }); + + $hideGender = new ExpressionFunction('show_data', function () { + return "false"; + }, function () { + return false; + }); + + return [ + [ + $person, + $showGender, + 'person_secret_hide' + ], + [ + $person, + $hideGender, + 'person_secret_show' + ], + [ + $personMoreSecret, + $showGender, + 'person_secret_show' + ], + [ + $personMoreSecret, + $hideGender, + 'person_secret_hide' + ], + [ + $personVirtual, + $showGender, + 'person_secret_hide' + ], + [ + $personVirtual, + $hideGender, + 'person_secret_show' + ], + [ + $personMoreSecretVirtual, + $showGender, + 'person_secret_show' + ], + [ + $personMoreSecretVirtual, + $hideGender, + 'person_secret_hide' + ] + ]; + } + + /** + * @dataProvider expressionFunctionProvider + * @param PersonSecret|PersonSecretMore $person + * @param ExpressionFunction $function + * @param $json + */ + public function testExpressionExclusion($person, ExpressionFunction $function, $json) + { + $language = new ExpressionLanguage(); + $language->addFunction($function); + + $serializer = new Serializer($this->factory, $this->handlerRegistry, $this->objectConstructor, $this->serializationVisitors, $this->deserializationVisitors, $this->dispatcher, null, new ExpressionEvaluator($language)); + $this->assertEquals($this->getContent($json), $serializer->serialize($person, $this->getFormat())); + } + + /** + * @dataProvider getBooleans + */ + public function testBooleans($strBoolean, $boolean) + { + $this->assertEquals($this->getContent('boolean_'.$strBoolean), $this->serialize($boolean)); + + if ($this->hasDeserializer()) { + $this->assertSame($boolean, $this->deserialize($this->getContent('boolean_'.$strBoolean), 'boolean')); + } + } + + public function getBooleans() + { + return array(array('true', true), array('false', false)); + } + + /** + * @dataProvider getNumerics + */ + public function testNumerics($key, $value, $type) + { + $this->assertEquals($this->getContent($key), $this->serialize($value)); + + if ($this->hasDeserializer()) { + $this->assertEquals($value, $this->deserialize($this->getContent($key), $type)); + } + } + + public function getNumerics() + { + return array( + array('integer', 1, 'integer'), + array('float', 4.533, 'double'), + array('float', 4.533, 'float'), + array('float_trailing_zero', 1.0, 'double'), + array('float_trailing_zero', 1.0, 'float'), + ); + } + + public function testSimpleObject() + { + $this->assertEquals($this->getContent('simple_object'), $this->serialize($obj = new SimpleObject('foo', 'bar'))); + + if ($this->hasDeserializer()) { + $this->assertEquals($obj, $this->deserialize($this->getContent('simple_object'), get_class($obj))); + } + } + + public function testArrayStrings() + { + $data = array('foo', 'bar'); + $this->assertEquals($this->getContent('array_strings'), $this->serialize($data)); + + if ($this->hasDeserializer()) { + $this->assertEquals($data, $this->deserialize($this->getContent('array_strings'), 'array')); + } + } + + public function testArrayBooleans() + { + $data = array(true, false); + $this->assertEquals($this->getContent('array_booleans'), $this->serialize($data)); + + if ($this->hasDeserializer()) { + $this->assertEquals($data, $this->deserialize($this->getContent('array_booleans'), 'array')); + } + } + + public function testArrayIntegers() + { + $data = array(1, 3, 4); + $this->assertEquals($this->getContent('array_integers'), $this->serialize($data)); + + if ($this->hasDeserializer()) { + $this->assertEquals($data, $this->deserialize($this->getContent('array_integers'), 'array')); + } + } + + public function testArrayEmpty() + { + if ('xml' === $this->getFormat()) { + $this->markTestSkipped('XML can\'t be tested for empty array'); + } + + $data = array('array' => []); + $this->assertEquals($this->getContent('array_empty'), $this->serialize($data)); + + if ($this->hasDeserializer()) { + $this->assertEquals($data, $this->deserialize($this->getContent('array_empty'), 'array')); + } + } + + public function testArrayFloats() + { + $data = array(1.34, 3.0, 6.42); + $this->assertEquals($this->getContent('array_floats'), $this->serialize($data)); + + if ($this->hasDeserializer()) { + $this->assertEquals($data, $this->deserialize($this->getContent('array_floats'), 'array')); + } + } + + public function testArrayObjects() + { + $data = array(new SimpleObject('foo', 'bar'), new SimpleObject('baz', 'boo')); + $this->assertEquals($this->getContent('array_objects'), $this->serialize($data)); + + if ($this->hasDeserializer()) { + $this->assertEquals($data, $this->deserialize($this->getContent('array_objects'), 'array')); + } + } + + public function testArrayListAndMapDifference() + { + $arrayData = array(0 => 1, 2 => 2, 3 => 3); // Misses key 1 + $data = new ObjectWithIntListAndIntMap($arrayData, $arrayData); + + $this->assertEquals($this->getContent('array_list_and_map_difference'), $this->serialize($data)); + } + + public function testDateTimeArrays() + { + $data = array( + new \DateTime('2047-01-01 12:47:47', new \DateTimeZone('UTC')), + new \DateTime('2016-12-05 00:00:00', new \DateTimeZone('UTC')) + ); + + $object = new DateTimeArraysObject($data, $data); + $serializedObject = $this->serialize( $object ); + + $this->assertEquals($this->getContent('array_datetimes_object'), $serializedObject); + + if ($this->hasDeserializer()) { + /** @var DateTimeArraysObject $deserializedObject */ + $deserializedObject = $this->deserialize($this->getContent('array_datetimes_object'), 'Jms\Serializer\Tests\Fixtures\DateTimeArraysObject'); + + /** deserialized object has a default timezone set depending on user's timezone settings. That's why we manually set the UTC timezone on the DateTime objects. */ + foreach ($deserializedObject->getArrayWithDefaultDateTime() as $dateTime) { + $dateTime->setTimezone(new \DateTimeZone('UTC')); + } + + foreach ($deserializedObject->getArrayWithFormattedDateTime() as $dateTime) { + $dateTime->setTimezone(new \DateTimeZone('UTC')); + } + + $this->assertEquals($object, $deserializedObject); + } + } + + public function testNamedDateTimeArrays() + { + $data = array( + new \DateTime('2047-01-01 12:47:47', new \DateTimeZone('UTC')), + new \DateTime('2016-12-05 00:00:00', new \DateTimeZone('UTC')) + ); + + $object = new NamedDateTimeArraysObject(array('testdate1' => $data[0], 'testdate2' => $data[1])); + $serializedObject = $this->serialize( $object ); + + $this->assertEquals($this->getContent('array_named_datetimes_object'), $serializedObject); + + if ($this->hasDeserializer()) { + + // skip XML deserialization + if ($this->getFormat() === 'xml') { + return; + } + + /** @var NamedDateTimeArraysObject $deserializedObject */ + $deserializedObject = $this->deserialize($this->getContent('array_named_datetimes_object'), 'Jms\Serializer\Tests\Fixtures\NamedDateTimeArraysObject'); + + /** deserialized object has a default timezone set depending on user's timezone settings. That's why we manually set the UTC timezone on the DateTime objects. */ + foreach ($deserializedObject->getNamedArrayWithFormattedDate() as $dateTime) { + $dateTime->setTimezone(new \DateTimeZone('UTC')); + } + + $this->assertEquals($object, $deserializedObject); + } + } + + /** + * @group datetime + */ + public function testNamedDateTimeImmutableArrays() + { + $data = array( + new \DateTimeImmutable('2047-01-01 12:47:47', new \DateTimeZone('UTC')), + new \DateTimeImmutable('2016-12-05 00:00:00', new \DateTimeZone('UTC')) + ); + + $object = new NamedDateTimeImmutableArraysObject(array('testdate1' => $data[0], 'testdate2' => $data[1])); + $serializedObject = $this->serialize($object); + + $this->assertEquals($this->getContent('array_named_datetimeimmutables_object'), $serializedObject); + + if ($this->hasDeserializer()) { + + if ('xml' == $this->getFormat()) { + $this->markTestSkipped("XML deserialization does not support key-val pairs mode"); + } + /** @var NamedDateTimeArraysObject $deserializedObject */ + $deserializedObject = $this->deserialize($this->getContent('array_named_datetimeimmutables_object'), 'Jms\Serializer\Tests\Fixtures\NamedDateTimeImmutableArraysObject'); + + /** deserialized object has a default timezone set depending on user's timezone settings. That's why we manually set the UTC timezone on the DateTime objects. */ + foreach ($deserializedObject->getNamedArrayWithFormattedDate() as $dateTime) { + $dateTime->setTimezone(new \DateTimeZone('UTC')); + } + + $this->assertEquals($object, $deserializedObject); + } + } + + + public function testArrayMixed() + { + $this->assertEquals($this->getContent('array_mixed'), $this->serialize(array('foo', 1, true, new SimpleObject('foo', 'bar'), array(1, 3, true)))); + } + + /** + * @dataProvider getDateTime + * @group datetime + */ + public function testDateTime($key, $value, $type) + { + $this->assertEquals($this->getContent($key), $this->serialize($value)); + + if ($this->hasDeserializer()) { + $deserialized = $this->deserialize($this->getContent($key), $type); + + $this->assertTrue(is_object($deserialized)); + $this->assertEquals(get_class($value), get_class($deserialized)); + $this->assertEquals($value->getTimestamp(), $deserialized->getTimestamp()); + } + } + + public function getDateTime() + { + return array( + array('date_time', new \DateTime('2011-08-30 00:00', new \DateTimeZone('UTC')), 'DateTime'), + ); + } + + /** + * @dataProvider getDateTimeImmutable + * @group datetime + */ + public function testDateTimeImmutable($key, $value, $type) + { + $this->assertEquals($this->getContent($key), $this->serialize($value)); + + if ($this->hasDeserializer()) { + $deserialized = $this->deserialize($this->getContent($key), $type); + + $this->assertTrue(is_object($deserialized)); + $this->assertEquals(get_class($value), get_class($deserialized)); + $this->assertEquals($value->getTimestamp(), $deserialized->getTimestamp()); + } + } + + public function getDateTimeImmutable() + { + return array( + array('date_time_immutable', new \DateTimeImmutable('2011-08-30 00:00', new \DateTimeZone('UTC')), 'DateTimeImmutable'), + ); + } + + public function testTimestamp() + { + $value = new Timestamp(new \DateTime('2016-02-11 00:00:00', new \DateTimeZone('UTC'))); + $this->assertEquals($this->getContent('timestamp'), $this->serialize($value)); + + if ($this->hasDeserializer()) { + $deserialized = $this->deserialize($this->getContent('timestamp'), Timestamp::class); + $this->assertEquals($value, $deserialized); + $this->assertEquals($value->getTimestamp()->getTimestamp(), $deserialized->getTimestamp()->getTimestamp()); + + $deserialized = $this->deserialize($this->getContent('timestamp_prev'), Timestamp::class); + $this->assertEquals($value, $deserialized); + $this->assertEquals($value->getTimestamp()->getTimestamp(), $deserialized->getTimestamp()->getTimestamp()); + } + } + + public function testDateInterval() + { + $duration = new \DateInterval('PT45M'); + + $this->assertEquals($this->getContent('date_interval'), $this->serializer->serialize($duration, $this->getFormat())); + + if ($this->hasDeserializer()) { + $deserialized = $this->deserialize($this->getContent('date_interval'), \DateInterval::class); + $this->assertEquals($duration, $deserialized); + $this->assertEquals($duration->i, $deserialized->i); + } + } + + public function testBlogPost() + { + $post = new BlogPost('This is a nice title.', $author = new Author('Foo Bar'), new \DateTime('2011-07-30 00:00', new \DateTimeZone('UTC')), new Publisher('Bar Foo')); + $post->addComment($comment = new Comment($author, 'foo')); + + $post->addTag($tag1 = New Tag("tag1")); + $post->addTag($tag2 = New Tag("tag2")); + + $this->assertEquals($this->getContent('blog_post'), $this->serialize($post)); + + if ($this->hasDeserializer()) { + $deserialized = $this->deserialize($this->getContent('blog_post'), get_class($post)); + $this->assertEquals('2011-07-30T00:00:00+0000', $this->getField($deserialized, 'createdAt')->format(\DateTime::ISO8601)); + $this->assertAttributeEquals('This is a nice title.', 'title', $deserialized); + $this->assertAttributeSame(false, 'published', $deserialized); + $this->assertAttributeSame('1edf9bf60a32d89afbb85b2be849e3ceed5f5b10', 'etag', $deserialized); + $this->assertAttributeEquals(new ArrayCollection(array($comment)), 'comments', $deserialized); + $this->assertAttributeEquals(new Sequence(array($comment)), 'comments2', $deserialized); + $this->assertAttributeEquals($author, 'author', $deserialized); + $this->assertAttributeEquals(array($tag1, $tag2), 'tag', $deserialized); + } + } + + public function testDeserializingNull() + { + $objectConstructor = new InitializedBlogPostConstructor(); + $this->serializer = new Serializer($this->factory, $this->handlerRegistry, $objectConstructor, $this->serializationVisitors, $this->deserializationVisitors, $this->dispatcher); + + $post = new BlogPost('This is a nice title.', $author = new Author('Foo Bar'), new \DateTime('2011-07-30 00:00', new \DateTimeZone('UTC')), new Publisher('Bar Foo')); + + $this->setField($post, 'author', null); + $this->setField($post, 'publisher', null); + + $this->assertEquals($this->getContent('blog_post_unauthored'), $this->serialize($post, SerializationContext::create()->setSerializeNull(true))); + + if ($this->hasDeserializer()) { + $deserialized = $this->deserialize($this->getContent('blog_post_unauthored'), get_class($post), DeserializationContext::create()->setSerializeNull(true)); + + $this->assertEquals('2011-07-30T00:00:00+0000', $this->getField($deserialized, 'createdAt')->format(\DateTime::ISO8601)); + $this->assertAttributeEquals('This is a nice title.', 'title', $deserialized); + $this->assertAttributeSame(false, 'published', $deserialized); + $this->assertAttributeEquals(new ArrayCollection(), 'comments', $deserialized); + $this->assertEquals(null, $this->getField($deserialized, 'author')); + } + } + + public function testExpressionAuthor() + { + $namingStrategy = new SerializedNameAnnotationStrategy(new CamelCaseNamingStrategy()); + + $evaluator = new ExpressionEvaluator(new ExpressionLanguage()); + $accessor = new ExpressionAccessorStrategy($evaluator, new DefaultAccessorStrategy()); + + $this->serializationVisitors = new Map(array( + 'json' => new JsonSerializationVisitor($namingStrategy, $accessor), + 'xml' => new XmlSerializationVisitor($namingStrategy, $accessor), + 'yml' => new YamlSerializationVisitor($namingStrategy, $accessor), + )); + + $serializer = new Serializer($this->factory, $this->handlerRegistry, $this->objectConstructor, $this->serializationVisitors, $this->deserializationVisitors, $this->dispatcher, null, $evaluator); + + $author = new AuthorExpressionAccess(123, "Ruud", "Kamphuis"); + $this->assertEquals($this->getContent('author_expression'), $serializer->serialize($author, $this->getFormat())); + } + + /** + * @expectedException \JMS\Serializer\Exception\ExpressionLanguageRequiredException + * @expectedExceptionMessage The property firstName on JMS\Serializer\Tests\Fixtures\AuthorExpressionAccess requires the expression accessor strategy to be enabled. + */ + public function testExpressionAccessorStrategNotEnabled() + { + $author = new AuthorExpressionAccess(123, "Ruud", "Kamphuis"); + $this->assertEquals($this->getContent('author_expression'), $this->serialize($author)); + } + + public function testReadOnly() + { + $author = new AuthorReadOnly(123, 'Ruud Kamphuis'); + $this->assertEquals($this->getContent('readonly'), $this->serialize($author)); + + if ($this->hasDeserializer()) { + $deserialized = $this->deserialize($this->getContent('readonly'), get_class($author)); + $this->assertNull($this->getField($deserialized, 'id')); + $this->assertEquals('Ruud Kamphuis', $this->getField($deserialized, 'name')); + } + } + + public function testReadOnlyClass() + { + $author = new AuthorReadOnlyPerClass(123, 'Ruud Kamphuis'); + $this->assertEquals($this->getContent('readonly'), $this->serialize($author)); + + if ($this->hasDeserializer()) { + $deserialized = $this->deserialize($this->getContent('readonly'), get_class($author)); + $this->assertNull($this->getField($deserialized, 'id')); + $this->assertEquals('Ruud Kamphuis', $this->getField($deserialized, 'name')); + } + } + + public function testPrice() + { + $price = new Price(3); + $this->assertEquals($this->getContent('price'), $this->serialize($price)); + + if ($this->hasDeserializer()) { + $deserialized = $this->deserialize($this->getContent('price'), get_class($price)); + $this->assertEquals(3, $this->getField($deserialized, 'price')); + } + } + + public function testOrder() + { + $order = new Order(new Price(12.34)); + $this->assertEquals($this->getContent('order'), $this->serialize($order)); + + if ($this->hasDeserializer()) { + $this->assertEquals($order, $this->deserialize($this->getContent('order'), get_class($order))); + } + } + + public function testCurrencyAwarePrice() + { + $price = new CurrencyAwarePrice(2.34); + $this->assertEquals($this->getContent('currency_aware_price'), $this->serialize($price)); + + if ($this->hasDeserializer()) { + $this->assertEquals($price, $this->deserialize($this->getContent('currency_aware_price'), get_class($price))); + } + } + + public function testOrderWithCurrencyAwarePrice() + { + $order = new CurrencyAwareOrder(new CurrencyAwarePrice(1.23)); + $this->assertEquals($this->getContent('order_with_currency_aware_price'), $this->serialize($order)); + + if ($this->hasDeserializer()) { + $this->assertEquals($order, $this->deserialize($this->getContent('order_with_currency_aware_price'), get_class($order))); + } + } + + /** + * @group handlerCallback + */ + public function testArticle() + { + $article = new Article(); + $article->element = 'custom'; + $article->value = 'serialized'; + + $result = $this->serialize($article); + $this->assertEquals($this->getContent('article'), $result); + + if ($this->hasDeserializer()) { + $this->assertEquals($article, $this->deserialize($result, 'JMS\Serializer\Tests\Fixtures\Article')); + } + } + + public function testInline() + { + $inline = new InlineParent(); + + $result = $this->serialize($inline); + $this->assertEquals($this->getContent('inline'), $result); + + // no deserialization support + } + + public function testInlineEmptyChild() + { + $inline = new InlineParent(new InlineChildEmpty()); + + $result = $this->serialize($inline); + $this->assertEquals($this->getContent('inline_child_empty'), $result); + + // no deserialization support + } + + public function testEmptyChild() + { + // by empty object + $inline = new ParentDoNotSkipWithEmptyChild(new InlineChildEmpty()); + $this->assertEquals($this->getContent('empty_child'), $this->serialize($inline)); + + // by nulls + $inner = new InlineChild(); + $inner->a = null; + $inner->b = null; + $inline = new ParentDoNotSkipWithEmptyChild($inner); + $this->assertEquals($this->getContent('empty_child'), $this->serialize($inline)); + + // by exclusion strategy + $context = SerializationContext::create()->setGroups(['Default']); + $inline = new ParentDoNotSkipWithEmptyChild(new InlineChildWithGroups()); + $this->assertEquals($this->getContent('empty_child'), $this->serialize($inline, $context)); + } + + public function testSkipEmptyChild() + { + // by empty object + $inline = new ParentSkipWithEmptyChild(new InlineChildEmpty()); + $this->assertEquals($this->getContent('empty_child_skip'), $this->serialize($inline)); + + // by nulls + $inner = new InlineChild(); + $inner->a = null; + $inner->b = null; + $inline = new ParentSkipWithEmptyChild($inner); + $this->assertEquals($this->getContent('empty_child_skip'), $this->serialize($inline)); + + // by exclusion strategy + $context = SerializationContext::create()->setGroups(['Default']); + $inline = new ParentSkipWithEmptyChild(new InlineChildWithGroups()); + $this->assertEquals($this->getContent('empty_child_skip'), $this->serialize($inline, $context)); + } + + /** + * @group log + */ + public function testLog() + { + $this->assertEquals($this->getContent('log'), $this->serialize($log = new Log())); + + if ($this->hasDeserializer()) { + $deserialized = $this->deserialize($this->getContent('log'), get_class($log)); + $this->assertEquals($log, $deserialized); + } + } + + public function testCircularReference() + { + $object = new CircularReferenceParent(); + $this->assertEquals($this->getContent('circular_reference'), $this->serialize($object)); + + if ($this->hasDeserializer()) { + $deserialized = $this->deserialize($this->getContent('circular_reference'), get_class($object)); + + $col = $this->getField($deserialized, 'collection'); + $this->assertEquals(2, count($col)); + $this->assertEquals('child1', $col[0]->getName()); + $this->assertEquals('child2', $col[1]->getName()); + $this->assertSame($deserialized, $col[0]->getParent()); + $this->assertSame($deserialized, $col[1]->getParent()); + + $col = $this->getField($deserialized, 'anotherCollection'); + $this->assertEquals(2, count($col)); + $this->assertEquals('child1', $col[0]->getName()); + $this->assertEquals('child2', $col[1]->getName()); + $this->assertSame($deserialized, $col[0]->getParent()); + $this->assertSame($deserialized, $col[1]->getParent()); + } + } + + public function testLifecycleCallbacks() + { + $object = new ObjectWithLifecycleCallbacks(); + $this->assertEquals($this->getContent('lifecycle_callbacks'), $this->serialize($object)); + $this->assertAttributeSame(null, 'name', $object); + + if ($this->hasDeserializer()) { + $deserialized = $this->deserialize($this->getContent('lifecycle_callbacks'), get_class($object)); + $this->assertEquals($object, $deserialized); + } + } + + public function testFormErrors() + { + $errors = array( + new FormError('This is the form error'), + new FormError('Another error') + ); + + $this->assertEquals($this->getContent('form_errors'), $this->serialize($errors)); + } + + public function testNestedFormErrors() + { + $dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface'); + + $formConfigBuilder = new \Symfony\Component\Form\FormConfigBuilder('foo', null, $dispatcher); + $formConfigBuilder->setCompound(true); + $formConfigBuilder->setDataMapper($this->getMock('Symfony\Component\Form\DataMapperInterface')); + $fooConfig = $formConfigBuilder->getFormConfig(); + + $form = new Form($fooConfig); + $form->addError(new FormError('This is the form error')); + + $formConfigBuilder = new \Symfony\Component\Form\FormConfigBuilder('bar', null, $dispatcher); + $barConfig = $formConfigBuilder->getFormConfig(); + $child = new Form($barConfig); + $child->addError(new FormError('Error of the child form')); + $form->add($child); + + $this->assertEquals($this->getContent('nested_form_errors'), $this->serialize($form)); + } + + public function testFormErrorsWithNonFormComponents() + { + if (!class_exists('Symfony\Component\Form\Extension\Core\Type\SubmitType')) { + $this->markTestSkipped('Not using Symfony Form >= 2.3 with submit type'); + } + + $dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface'); + + $factoryBuilder = new FormFactoryBuilder(); + $factoryBuilder->addType(new \Symfony\Component\Form\Extension\Core\Type\SubmitType); + $factoryBuilder->addType(new \Symfony\Component\Form\Extension\Core\Type\ButtonType); + $factory = $factoryBuilder->getFormFactory(); + + $formConfigBuilder = new \Symfony\Component\Form\FormConfigBuilder('foo', null, $dispatcher); + $formConfigBuilder->setFormFactory($factory); + $formConfigBuilder->setCompound(true); + $formConfigBuilder->setDataMapper($this->getMock('Symfony\Component\Form\DataMapperInterface')); + $fooConfig = $formConfigBuilder->getFormConfig(); + + $form = new Form($fooConfig); + $form->add('save', \Symfony\Component\Form\Extension\Core\Type\SubmitType::class); + + try { + $this->serialize($form); + } catch (\Exception $e) { + $this->assertTrue(false, 'Serialization should not throw an exception'); + } + } + + public function testConstraintViolation() + { + $violation = new ConstraintViolation('Message of violation', 'Message of violation', array(), null, 'foo', null); + + $this->assertEquals($this->getContent('constraint_violation'), $this->serialize($violation)); + } + + public function testConstraintViolationList() + { + $violations = new ConstraintViolationList(); + $violations->add(new ConstraintViolation('Message of violation', 'Message of violation', array(), null, 'foo', null)); + $violations->add(new ConstraintViolation('Message of another violation', 'Message of another violation', array(), null, 'bar', null)); + + $this->assertEquals($this->getContent('constraint_violation_list'), $this->serialize($violations)); + } + + public function testDoctrineProxy() + { + if (!class_exists('Doctrine\ORM\Version')) { + $this->markTestSkipped('Doctrine is not available.'); + } + + $object = new SimpleObjectProxy('foo', 'bar'); + + $this->assertEquals($this->getContent('orm_proxy'), $this->serialize($object)); + } + + public function testInitializedDoctrineProxy() + { + if (!class_exists('Doctrine\ORM\Version')) { + $this->markTestSkipped('Doctrine is not available.'); + } + + $object = new SimpleObjectProxy('foo', 'bar'); + $object->__load(); + + $this->assertEquals($this->getContent('orm_proxy'), $this->serialize($object)); + } + + public function testCustomAccessor() + { + $post = new IndexedCommentsBlogPost(); + + $this->assertEquals($this->getContent('custom_accessor'), $this->serialize($post)); + } + + public function testMixedAccessTypes() + { + $object = new GetSetObject(); + + $this->assertEquals($this->getContent('mixed_access_types'), $this->serialize($object)); + + if ($this->hasDeserializer()) { + $object = $this->deserialize($this->getContent('mixed_access_types'), 'JMS\Serializer\Tests\Fixtures\GetSetObject'); + $this->assertAttributeEquals(1, 'id', $object); + $this->assertAttributeEquals('Johannes', 'name', $object); + $this->assertAttributeEquals(42, 'readOnlyProperty', $object); + } + } + + public function testAccessorOrder() + { + $this->assertEquals($this->getContent('accessor_order_child'), $this->serialize(new AccessorOrderChild())); + $this->assertEquals($this->getContent('accessor_order_parent'), $this->serialize(new AccessorOrderParent())); + $this->assertEquals($this->getContent('accessor_order_methods'), $this->serialize(new AccessorOrderMethod())); + } + + public function testGroups() + { + $groupsObject = new GroupsObject(); + + $this->assertEquals($this->getContent('groups_all'), $this->serializer->serialize($groupsObject, $this->getFormat())); + + $this->assertEquals( + $this->getContent('groups_foo'), + $this->serializer->serialize($groupsObject, $this->getFormat(), SerializationContext::create()->setGroups(array('foo'))) + ); + + $this->assertEquals( + $this->getContent('groups_foobar'), + $this->serializer->serialize($groupsObject, $this->getFormat(), SerializationContext::create()->setGroups(array('foo', 'bar'))) + ); + + $this->assertEquals( + $this->getContent('groups_all'), + $this->serializer->serialize($groupsObject, $this->getFormat()) + ); + + $this->assertEquals( + $this->getContent('groups_default'), + $this->serializer->serialize($groupsObject, $this->getFormat(), SerializationContext::create()->setGroups(array(GroupsExclusionStrategy::DEFAULT_GROUP))) + ); + + $this->assertEquals( + $this->getContent('groups_default'), + $this->serializer->serialize($groupsObject, $this->getFormat(), SerializationContext::create()->setGroups(array(GroupsExclusionStrategy::DEFAULT_GROUP))) + ); + } + + public function testAdvancedGroups() + { + $adrien = new GroupsUser( + 'John', + new GroupsUser( + 'John Manager', + null, + array( + new GroupsUser( + 'John Manager friend 1', + new GroupsUser('John Manager friend 1 manager') + ), + new GroupsUser('John Manager friend 2'), + ) + ), + array( + new GroupsUser( + 'John friend 1', + new GroupsUser('John friend 1 manager') + ), + new GroupsUser( + 'John friend 2', + new GroupsUser('John friend 2 manager') + ) + ) + ); + + $this->assertEquals( + $this->getContent('groups_advanced'), + $this->serializer->serialize( + $adrien, + $this->getFormat(), + SerializationContext::create()->setGroups(array( + GroupsExclusionStrategy::DEFAULT_GROUP, + 'manager_group', + 'friends_group', + + 'manager' => array( + GroupsExclusionStrategy::DEFAULT_GROUP, + 'friends_group', + + 'friends' => array('nickname_group'), + ), + 'friends' => array( + 'manager_group' + ) + )) + ) + ); + } + + /** + * @expectedException JMS\Serializer\Exception\InvalidArgumentException + * @expectedExceptionMessage Invalid group name "foo, bar" on "JMS\Serializer\Tests\Fixtures\InvalidGroupsObject->foo", did you mean to create multiple groups? + */ + public function testInvalidGroupName() + { + $groupsObject = new InvalidGroupsObject(); + + $this->serializer->serialize($groupsObject, $this->getFormat()); + } + + public function testVirtualProperty() + { + $this->assertEquals($this->getContent('virtual_properties'), $this->serialize(new ObjectWithVirtualProperties())); + } + + public function testVirtualVersions() + { + $this->assertEquals( + $this->getContent('virtual_properties_low'), + $this->serialize(new ObjectWithVersionedVirtualProperties(), SerializationContext::create()->setVersion(2)) + ); + + $this->assertEquals( + $this->getContent('virtual_properties_all'), + $this->serialize(new ObjectWithVersionedVirtualProperties(), SerializationContext::create()->setVersion(7)) + ); + + $this->assertEquals( + $this->getContent('virtual_properties_high'), + $this->serialize(new ObjectWithVersionedVirtualProperties(), SerializationContext::create()->setVersion(9)) + ); + } + + public function testCustomHandler() + { + if ( ! $this->hasDeserializer()) { + return; + } + + $handler = function() { + return new CustomDeserializationObject('customly_unserialized_value'); + }; + + $this->handlerRegistry->registerHandler(GraphNavigator::DIRECTION_DESERIALIZATION, 'CustomDeserializationObject', $this->getFormat(), $handler); + + $serialized = $this->serializer->serialize(new CustomDeserializationObject('sometext'), $this->getFormat()); + $object = $this->serializer->deserialize($serialized, 'CustomDeserializationObject', $this->getFormat()); + $this->assertEquals('customly_unserialized_value', $object->someProperty); + } + + public function testInput() + { + $this->assertEquals($this->getContent('input'), $this->serializer->serialize(new Input(), $this->getFormat())); + } + + public function testObjectWithEmptyHash() + { + $this->assertEquals($this->getContent('hash_empty'), $this->serializer->serialize(new ObjectWithEmptyHash(), $this->getFormat())); + } + + /** + * @group null + */ + public function testSerializeObjectWhenNull() + { + $this->assertEquals( + $this->getContent('object_when_null'), + $this->serialize(new Comment(null, 'foo'), SerializationContext::create()->setSerializeNull(false)) + ); + + $this->assertEquals( + $this->getContent('object_when_null_and_serialized'), + $this->serialize(new Comment(null, 'foo'), SerializationContext::create()->setSerializeNull(true)) + ); + } + + /** + * @group polymorphic + */ + public function testPolymorphicObjectsWithGroup() + { + $context = SerializationContext::create(); + $context->setGroups(array("foo")); + + $this->assertEquals( + $this->getContent('car'), + $this->serialize(new \JMS\Serializer\Tests\Fixtures\DiscriminatorGroup\Car(5), $context) + ); + } + + /** + * @group polymorphic + */ + public function testPolymorphicObjects() + { + $this->assertEquals( + $this->getContent('car'), + $this->serialize(new Car(5)) + ); + + if ($this->hasDeserializer()) { + $this->assertEquals( + new Car(5), + $this->deserialize( + $this->getContent('car'), + 'JMS\Serializer\Tests\Fixtures\Discriminator\Car' + ), + 'Class is resolved correctly when concrete sub-class is used.' + ); + + $this->assertEquals( + new Car(5), + $this->deserialize( + $this->getContent('car'), + 'JMS\Serializer\Tests\Fixtures\Discriminator\Vehicle' + ), + 'Class is resolved correctly when least supertype is used.' + ); + + $this->assertEquals( + new Car(5), + $this->deserialize( + $this->getContent('car_without_type'), + 'JMS\Serializer\Tests\Fixtures\Discriminator\Car' + ), + 'Class is resolved correctly when concrete sub-class is used and no type is defined.' + ); + } + } + + /** + * @group polymorphic + */ + public function testNestedPolymorphicObjects() + { + $garage = new Garage(array(new Car(3), new Moped(1))); + $this->assertEquals( + $this->getContent('garage'), + $this->serialize($garage) + ); + + if ($this->hasDeserializer()) { + $this->assertEquals( + $garage, + $this->deserialize( + $this->getContent('garage'), + 'JMS\Serializer\Tests\Fixtures\Garage' + ) + ); + } + } + + /** + * @group polymorphic + */ + public function testNestedPolymorphicInterfaces() + { + $garage = new VehicleInterfaceGarage(array(new Car(3), new Moped(1))); + $this->assertEquals( + $this->getContent('garage'), + $this->serialize($garage) + ); + + if ($this->hasDeserializer()) { + $this->assertEquals( + $garage, + $this->deserialize( + $this->getContent('garage'), + 'JMS\Serializer\Tests\Fixtures\VehicleInterfaceGarage' + ) + ); + } + } + + /** + * @group polymorphic + * @expectedException LogicException + */ + public function testPolymorphicObjectsInvalidDeserialization() + { + if (!$this->hasDeserializer()) { + throw new \LogicException('No deserializer'); + } + + $this->deserialize( + $this->getContent('car_without_type'), + 'JMS\Serializer\Tests\Fixtures\Discriminator\Vehicle' + ); + } + + public function testDepthExclusionStrategy() + { + $context = SerializationContext::create() + ->addExclusionStrategy(new DepthExclusionStrategy()) + ; + + $data = new Tree( + new Node(array( + new Node(array( + new Node(array( + new Node(array( + new Node(), + )), + )), + )), + )) + ); + + $this->assertEquals($this->getContent('tree'), $this->serializer->serialize($data, $this->getFormat(), $context)); + } + + public function testMaxDepthWithSkippableObject() + { + $data = new Gh236Foo(); + + $context = SerializationContext::create()->enableMaxDepthChecks(); + $serialized = $this->serialize($data, $context); + + $this->assertEquals($this->getContent('maxdepth_skippabe_object'), $serialized); + } + + public function testDeserializingIntoExistingObject() + { + if (!$this->hasDeserializer()) { + return; + } + + $objectConstructor = new InitializedObjectConstructor(new UnserializeObjectConstructor()); + $serializer = new Serializer( + $this->factory, $this->handlerRegistry, $objectConstructor, + $this->serializationVisitors, $this->deserializationVisitors, $this->dispatcher + ); + + $order = new Order(new Price(12)); + + $context = new DeserializationContext(); + $context->attributes->set('target', $order); + + $deseralizedOrder = $serializer->deserialize( + $this->getContent('order'), + get_class($order), + $this->getFormat(), + $context + ); + + $this->assertSame($order, $deseralizedOrder); + $this->assertEquals(new Order(new Price(12.34)), $deseralizedOrder); + $this->assertAttributeInstanceOf('JMS\Serializer\Tests\Fixtures\Price', 'cost', $deseralizedOrder); + } + + public function testObjectWithNullableArrays() + { + $object = new ObjectWithEmptyNullableAndEmptyArrays(); + $this->assertEquals($this->getContent('nullable_arrays'), $this->serializer->serialize($object, $this->getFormat())); + } + + abstract protected function getContent($key); + abstract protected function getFormat(); + + protected function hasDeserializer() + { + return true; + } + + protected function serialize($data, Context $context = null) + { + return $this->serializer->serialize($data, $this->getFormat(), $context); + } + + protected function deserialize($content, $type, Context $context = null) + { + return $this->serializer->deserialize($content, $type, $this->getFormat(), $context); + } + + protected function setUp() + { + $this->factory = new MetadataFactory(new AnnotationDriver(new AnnotationReader())); + + $this->handlerRegistry = new HandlerRegistry(); + $this->handlerRegistry->registerSubscribingHandler(new ConstraintViolationHandler()); + $this->handlerRegistry->registerSubscribingHandler(new StdClassHandler()); + $this->handlerRegistry->registerSubscribingHandler(new DateHandler()); + $this->handlerRegistry->registerSubscribingHandler(new FormErrorHandler(new IdentityTranslator(new MessageSelector()))); + $this->handlerRegistry->registerSubscribingHandler(new PhpCollectionHandler()); + $this->handlerRegistry->registerSubscribingHandler(new ArrayCollectionHandler()); + $this->handlerRegistry->registerHandler(GraphNavigator::DIRECTION_SERIALIZATION, 'AuthorList', $this->getFormat(), + function(VisitorInterface $visitor, $object, array $type, Context $context) { + return $visitor->visitArray(iterator_to_array($object), $type, $context); + } + ); + $this->handlerRegistry->registerHandler(GraphNavigator::DIRECTION_DESERIALIZATION, 'AuthorList', $this->getFormat(), + function(VisitorInterface $visitor, $data, $type, Context $context) { + $type = array( + 'name' => 'array', + 'params' => array( + array('name' => 'integer', 'params' => array()), + array('name' => 'JMS\Serializer\Tests\Fixtures\Author', 'params' => array()), + ), + ); + + $elements = $visitor->getNavigator()->accept($data, $type, $context); + $list = new AuthorList(); + foreach ($elements as $author) { + $list->add($author); + } + + return $list; + } + ); + + $this->dispatcher = new EventDispatcher(); + $this->dispatcher->addSubscriber(new DoctrineProxySubscriber()); + + $namingStrategy = new SerializedNameAnnotationStrategy(new CamelCaseNamingStrategy()); + $this->objectConstructor = new UnserializeObjectConstructor(); + $this->serializationVisitors = new Map(array( + 'json' => new JsonSerializationVisitor($namingStrategy), + 'xml' => new XmlSerializationVisitor($namingStrategy), + 'yml' => new YamlSerializationVisitor($namingStrategy), + )); + $this->deserializationVisitors = new Map(array( + 'json' => new JsonDeserializationVisitor($namingStrategy), + 'xml' => new XmlDeserializationVisitor($namingStrategy), + )); + + $this->serializer = new Serializer($this->factory, $this->handlerRegistry, $this->objectConstructor, $this->serializationVisitors, $this->deserializationVisitors, $this->dispatcher); + } + + protected function getField($obj, $name) + { + $ref = new \ReflectionProperty($obj, $name); + $ref->setAccessible(true); + + return $ref->getValue($obj); + } + + private function setField($obj, $name, $value) + { + $ref = new \ReflectionProperty($obj, $name); + $ref->setAccessible(true); + $ref->setValue($obj, $value); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/ContextTest.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/ContextTest.php new file mode 100644 index 0000000000..2b7d6fb1b6 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/ContextTest.php @@ -0,0 +1,202 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Serializer; + +use JMS\Serializer\Context; +use JMS\Serializer\Metadata\ClassMetadata; +use JMS\Serializer\Metadata\PropertyMetadata; +use JMS\Serializer\SerializationContext; +use JMS\Serializer\Tests\Fixtures\InlineChild; +use JMS\Serializer\Tests\Fixtures\Node; +use JMS\Serializer\SerializerBuilder; + +class ContextTest extends \PHPUnit_Framework_TestCase +{ + public function testSerializationContextPathAndDepth() + { + $object = new Node(array( + new Node(), + new Node(array( + new Node() + )), + )); + $objects = array($object, $object->children[0], $object->children[1], $object->children[1]->children[0]); + + $self = $this; + + $exclusionStrategy = $this->getMock('JMS\Serializer\Exclusion\ExclusionStrategyInterface'); + $exclusionStrategy->expects($this->any()) + ->method('shouldSkipClass') + ->with($this->anything(), $this->callback(function (SerializationContext $context) use ($self, $objects) { + $expectedDepth = $expectedPath = null; + + if ($context->getObject() === $objects[0]) { + $expectedDepth = 1; + $expectedPath = 'JMS\Serializer\Tests\Fixtures\Node'; + } elseif ($context->getObject() === $objects[1]) { + $expectedDepth = 2; + $expectedPath = 'JMS\Serializer\Tests\Fixtures\Node -> JMS\Serializer\Tests\Fixtures\Node'; + } elseif ($context->getObject() === $objects[2]) { + $expectedDepth = 2; + $expectedPath = 'JMS\Serializer\Tests\Fixtures\Node -> JMS\Serializer\Tests\Fixtures\Node'; + } elseif ($context->getObject() === $objects[3]) { + $expectedDepth = 3; + $expectedPath = 'JMS\Serializer\Tests\Fixtures\Node -> JMS\Serializer\Tests\Fixtures\Node -> JMS\Serializer\Tests\Fixtures\Node'; + } + + $self->assertEquals($expectedDepth, $context->getDepth(), 'shouldSkipClass depth'); + $self->assertEquals($expectedPath, $context->getPath(), 'shouldSkipClass path'); + + return true; + })) + ->will($this->returnValue(false)); + + $exclusionStrategy->expects($this->any()) + ->method('shouldSkipProperty') + ->with($this->anything(), $this->callback(function (SerializationContext $context) use ($self, $objects) { + $expectedDepth = $expectedPath = null; + + if ($context->getObject() === $objects[0]) { + $expectedDepth = 1; + $expectedPath = 'JMS\Serializer\Tests\Fixtures\Node'; + } elseif ($context->getObject() === $objects[1]) { + $expectedDepth = 2; + $expectedPath = 'JMS\Serializer\Tests\Fixtures\Node -> JMS\Serializer\Tests\Fixtures\Node'; + } elseif ($context->getObject() === $objects[2]) { + $expectedDepth = 2; + $expectedPath = 'JMS\Serializer\Tests\Fixtures\Node -> JMS\Serializer\Tests\Fixtures\Node'; + } elseif ($context->getObject() === $objects[3]) { + $expectedDepth = 3; + $expectedPath = 'JMS\Serializer\Tests\Fixtures\Node -> JMS\Serializer\Tests\Fixtures\Node -> JMS\Serializer\Tests\Fixtures\Node'; + } + + $self->assertEquals($expectedDepth, $context->getDepth(), 'shouldSkipProperty depth'); + $self->assertEquals($expectedPath, $context->getPath(), 'shouldSkipProperty path'); + + return true; + })) + ->will($this->returnValue(false)); + + $serializer = SerializerBuilder::create()->build(); + + $serializer->serialize($object, 'json', SerializationContext::create()->addExclusionStrategy($exclusionStrategy)); + } + + public function testSerializationMetadataStack() + { + $object = new Node(array( + $child = new InlineChild(), + )); + $self = $this; + + $exclusionStrategy = $this->getMock('JMS\Serializer\Exclusion\ExclusionStrategyInterface'); + $exclusionStrategy->expects($this->any()) + ->method('shouldSkipClass') + ->will($this->returnCallback(function (ClassMetadata $classMetadata, SerializationContext $context) use ($self, $object, $child) { + $stack = $context->getMetadataStack(); + + if ($object === $context->getObject()) { + $self->assertEquals(0, $stack->count()); + } + + if ($child === $context->getObject()) { + $self->assertEquals(2, $stack->count()); + $self->assertEquals('JMS\Serializer\Tests\Fixtures\Node', $stack[1]->name); + $self->assertEquals('children', $stack[0]->name); + } + + return false; + })); + + $exclusionStrategy->expects($this->any()) + ->method('shouldSkipProperty') + ->will($this->returnCallback(function (PropertyMetadata $propertyMetadata, SerializationContext $context) use ($self, $object, $child) { + $stack = $context->getMetadataStack(); + + if ('JMS\Serializer\Tests\Fixtures\Node' === $propertyMetadata->class && $propertyMetadata->name === 'children') { + $self->assertEquals(1, $stack->count()); + $self->assertEquals('JMS\Serializer\Tests\Fixtures\Node', $stack[0]->name); + } + + if ('JMS\Serializer\Tests\Fixtures\InlineChild' === $propertyMetadata->class) { + $self->assertEquals(3, $stack->count()); + $self->assertEquals('JMS\Serializer\Tests\Fixtures\Node', $stack[2]->name); + $self->assertEquals('children', $stack[1]->name); + $self->assertEquals('JMS\Serializer\Tests\Fixtures\InlineChild', $stack[0]->name); + } + + return false; + })); + + $serializer = SerializerBuilder::create()->build(); + $serializer->serialize($object, 'json', SerializationContext::create()->addExclusionStrategy($exclusionStrategy)); + } + + public function getScalars() + { + return array( + array("string"), + array(5), + array(5.5), + array(array()) + ); + } + + /** + * @dataProvider getScalars + */ + public function testCanVisitScalars($scalar) + { + $context = SerializationContext::create(); + + $context->startVisiting($scalar); + $this->assertFalse($context->isVisiting($scalar)); + $context->stopVisiting($scalar); + } + + public function testInitialTypeCompatibility() + { + $context = SerializationContext::create(); + $context->setInitialType('foo'); + $this->assertEquals('foo', $context->getInitialType()); + $this->assertEquals('foo', $context->attributes->get('initial_type')->get()); + + $context = SerializationContext::create(); + $context->attributes->set('initial_type', 'foo'); + $this->assertEquals('foo', $context->getInitialType()); + } + + public function testSerializeNullOption() + { + $context = SerializationContext::create(); + $this->assertNull($context->shouldSerializeNull()); + + $context->setSerializeNull(false); + $this->assertFalse($context->shouldSerializeNull()); + + $context->setSerializeNull(true); + $this->assertTrue($context->shouldSerializeNull()); + + $context->setSerializeNull("foo"); + $this->assertTrue($context->shouldSerializeNull()); + + $context->setSerializeNull("0"); + $this->assertFalse($context->shouldSerializeNull()); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/DateIntervalFormatTest.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/DateIntervalFormatTest.php new file mode 100644 index 0000000000..1a624ac7d9 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/DateIntervalFormatTest.php @@ -0,0 +1,47 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Serializer; + +use JMS\Serializer\Handler\DateHandler; + +class DateIntervalFormatTest extends \PHPUnit_Framework_TestCase +{ + public function testFormat() + { + $dtf = new DateHandler(); + + $iso8601DateIntervalString = $dtf->format(new \DateInterval('P0D')); + $this->assertEquals($iso8601DateIntervalString, 'P0DT0S'); + + $iso8601DateIntervalString = $dtf->format(new \DateInterval('P0DT0S')); + $this->assertEquals($iso8601DateIntervalString, 'P0DT0S'); + + $iso8601DateIntervalString = $dtf->format(new \DateInterval('PT45M')); + + $this->assertEquals($iso8601DateIntervalString, 'PT45M'); + + $iso8601DateIntervalString = $dtf->format(new \DateInterval('P2YT45M')); + + $this->assertEquals($iso8601DateIntervalString, 'P2YT45M'); + + $iso8601DateIntervalString = $dtf->format(new \DateInterval('P2Y4DT6H8M16S')); + + $this->assertEquals($iso8601DateIntervalString, 'P2Y4DT6H8M16S'); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/Doctrine/IntegrationTest.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/Doctrine/IntegrationTest.php new file mode 100644 index 0000000000..c497a56e36 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/Doctrine/IntegrationTest.php @@ -0,0 +1,204 @@ +serializer->serialize($school, 'json'); + $this->assertEquals('{"type":"school"}', $json); + + $deserialized = $this->serializer->deserialize($json, Organization::class, 'json'); + $this->assertEquals($school, $deserialized); + } + + public function testDiscriminatorIsInferredForGenericBaseClass() + { + $student = new Student(); + $json = $this->serializer->serialize($student, 'json'); + $this->assertEquals('{"type":"student"}', $json); + + $deserialized = $this->serializer->deserialize($json, Person::class, 'json'); + $this->assertEquals($student, $deserialized); + } + + public function testDiscriminatorIsInferredFromDoctrine() + { + /** @var EntityManager $em */ + $em = $this->registry->getManager(); + + $student1 = new Student(); + $student2 = new Student(); + $teacher = new Teacher(); + $class = new Clazz($teacher, array($student1, $student2)); + + $em->persist($student1); + $em->persist($student2); + $em->persist($teacher); + $em->persist($class); + $em->flush(); + $em->clear(); + + $reloadedClass = $em->find(get_class($class), $class->getId()); + $this->assertNotSame($class, $reloadedClass); + + $json = $this->serializer->serialize($reloadedClass, 'json'); + $this->assertEquals('{"id":1,"teacher":{"id":1,"type":"teacher"},"students":[{"id":2,"type":"student"},{"id":3,"type":"student"}]}', $json); + } + + protected function setUp() + { + $connection = $this->createConnection(); + $entityManager = $this->createEntityManager($connection); + + $this->registry = $registry = new SimpleManagerRegistry( + function($id) use($connection, $entityManager) { + switch ($id) { + case 'default_connection': + return $connection; + + case 'default_manager': + return $entityManager; + + default: + throw new \RuntimeException(sprintf('Unknown service id "%s".', $id)); + } + } + ); + + $this->serializer = SerializerBuilder::create() + ->setMetadataDriverFactory(new CallbackDriverFactory( + function(array $metadataDirs, Reader $annotationReader) use($registry) { + $defaultFactory = new DefaultDriverFactory(); + + return new DoctrineTypeDriver($defaultFactory->createDriver($metadataDirs, $annotationReader), $registry); + } + )) + ->build() + ; + + $this->prepareDatabase(); + } + + private function prepareDatabase() + { + /** @var EntityManager $em */ + $em = $this->registry->getManager(); + + $tool = new SchemaTool($em); + $tool->createSchema($em->getMetadataFactory()->getAllMetadata()); + } + + private function createConnection() + { + $con = DriverManager::getConnection(array( + 'driver' => 'pdo_sqlite', + 'memory' => true, + )); + + return $con; + } + + private function createEntityManager(Connection $con) + { + $cfg = new Configuration(); + $cfg->setMetadataDriverImpl(new AnnotationDriver(new AnnotationReader(), array( + __DIR__.'/../../Fixtures/Doctrine/SingleTableInheritance', + ))); + $cfg->setAutoGenerateProxyClasses(true); + $cfg->setProxyNamespace('JMS\Serializer\DoctrineProxy'); + $cfg->setProxyDir(sys_get_temp_dir().'/serializer-test-proxies'); + + $em = EntityManager::create($con, $cfg); + + return $em; + } +} + +class SimpleManagerRegistry extends AbstractManagerRegistry +{ + private $services = array(); + private $serviceCreator; + + public function __construct($serviceCreator, $name = 'anonymous', array $connections = array('default' => 'default_connection'), array $managers = array('default' => 'default_manager'), $defaultConnection = null, $defaultManager = null, $proxyInterface = 'Doctrine\Common\Persistence\Proxy') + { + if (null === $defaultConnection) { + list($defaultConnection, ) = each($connections); + } + if (null === $defaultManager) { + list($defaultManager, ) = each($managers); + } + + parent::__construct($name, $connections, $managers, $defaultConnection, $defaultManager, $proxyInterface); + + if ( ! is_callable($serviceCreator)) { + throw new \InvalidArgumentException('$serviceCreator must be a valid callable.'); + } + $this->serviceCreator = $serviceCreator; + } + + public function getService($name) + { + if (isset($this->services[$name])) { + return $this->services[$name]; + } + + return $this->services[$name] = call_user_func($this->serviceCreator, $name); + } + + public function resetService($name) + { + unset($this->services[$name]); + } + + public function getAliasNamespace($alias) + { + foreach (array_keys($this->getManagers()) as $name) { + $manager = $this->getManager($name); + + if ($manager instanceof EntityManager) { + try { + return $manager->getConfiguration()->getEntityNamespace($alias); + } catch (ORMException $ex) { + // Probably mapped by another entity manager, or invalid, just ignore this here. + } + } else { + throw new \LogicException(sprintf('Unsupported manager type "%s".', get_class($manager))); + } + } + + throw new \RuntimeException(sprintf('The namespace alias "%s" is not known to any manager.', $alias)); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/Doctrine/ObjectConstructorTest.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/Doctrine/ObjectConstructorTest.php new file mode 100644 index 0000000000..774501b5b6 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/Doctrine/ObjectConstructorTest.php @@ -0,0 +1,313 @@ +registry->getManager(); + + $author = new Author('John', 5); + $em->persist($author); + $em->flush(); + $em->clear(); + + $fallback = $this->getMockBuilder(ObjectConstructorInterface::class)->getMock(); + + $type = array('name' => Author::class, 'params' => array()); + $class = new ClassMetadata(Author::class); + + $constructor = new DoctrineObjectConstructor($this->registry, $fallback); + $authorFetched = $constructor->construct($this->visitor, $class, ['id' => 5], $type, $this->context); + + $this->assertEquals($author, $authorFetched); + } + + public function testFindManagedEntity() + { + $em = $this->registry->getManager(); + + $author = new Author('John', 5); + $em->persist($author); + $em->flush(); + + $fallback = $this->getMockBuilder(ObjectConstructorInterface::class)->getMock(); + + $type = array('name' => Author::class, 'params' => array()); + $class = new ClassMetadata(Author::class); + + $constructor = new DoctrineObjectConstructor($this->registry, $fallback); + $authorFetched = $constructor->construct($this->visitor, $class, ['id' => 5], $type, $this->context); + + $this->assertSame($author, $authorFetched); + } + + public function testMissingAuthor() + { + $fallback = $this->getMockBuilder(ObjectConstructorInterface::class)->getMock(); + + $type = array('name' => Author::class, 'params' => array()); + $class = new ClassMetadata(Author::class); + + $constructor = new DoctrineObjectConstructor($this->registry, $fallback); + $author = $constructor->construct($this->visitor, $class, ['id' => 5], $type, $this->context); + $this->assertNull($author); + } + + public function testMissingAuthorFallback() + { + $author = new Author('John'); + + $fallback = $this->getMockBuilder(ObjectConstructorInterface::class)->getMock(); + $fallback->expects($this->once())->method('construct')->willReturn($author); + + $type = array('name' => Author::class, 'params' => array()); + $class = new ClassMetadata(Author::class); + + $constructor = new DoctrineObjectConstructor($this->registry, $fallback, DoctrineObjectConstructor::ON_MISSING_FALLBACK); + $authorFetched = $constructor->construct($this->visitor, $class, ['id' => 5], $type, $this->context); + $this->assertSame($author, $authorFetched); + } + + public function testMissingNotManaged() + { + $author = new \JMS\Serializer\Tests\Fixtures\DoctrinePHPCR\Author('foo'); + + $fallback = $this->getMockBuilder(ObjectConstructorInterface::class)->getMock(); + $fallback->expects($this->once())->method('construct')->willReturn($author); + + $type = array('name' => Author::class, 'params' => array()); + $class = new ClassMetadata(Author::class); + + $constructor = new DoctrineObjectConstructor($this->registry, $fallback, DoctrineObjectConstructor::ON_MISSING_FALLBACK); + $authorFetched = $constructor->construct($this->visitor, $class, ['id' => 5], $type, $this->context); + $this->assertSame($author, $authorFetched); + } + + public function testReference() + { + $em = $this->registry->getManager(); + + $author = new Author('John', 5); + $em->persist($author); + $em->flush(); + + $fallback = $this->getMockBuilder(ObjectConstructorInterface::class)->getMock(); + + $type = array('name' => Author::class, 'params' => array()); + $class = new ClassMetadata(Author::class); + + $constructor = new DoctrineObjectConstructor($this->registry, $fallback, DoctrineObjectConstructor::ON_MISSING_FALLBACK); + $authorFetched = $constructor->construct($this->visitor, $class, 5, $type, $this->context); + $this->assertSame($author, $authorFetched); + } + + /** + * @expectedException \JMS\Serializer\Exception\ObjectConstructionException + */ + public function testMissingAuthorException() + { + $fallback = $this->getMockBuilder(ObjectConstructorInterface::class)->getMock(); + + $type = array('name' => Author::class, 'params' => array()); + $class = new ClassMetadata(Author::class); + + $constructor = new DoctrineObjectConstructor($this->registry, $fallback, DoctrineObjectConstructor::ON_MISSING_EXCEPTION); + $constructor->construct($this->visitor, $class, ['id' => 5], $type, $this->context); + } + + /** + * @expectedException \JMS\Serializer\Exception\InvalidArgumentException + */ + public function testInvalidArg() + { + $fallback = $this->getMockBuilder(ObjectConstructorInterface::class)->getMock(); + + $type = array('name' => Author::class, 'params' => array()); + $class = new ClassMetadata(Author::class); + + $constructor = new DoctrineObjectConstructor($this->registry, $fallback, 'foo'); + $constructor->construct($this->visitor, $class, ['id' => 5], $type, $this->context); + } + + public function testMissingData() + { + $author = new Author('John'); + + $fallback = $this->getMockBuilder(ObjectConstructorInterface::class)->getMock(); + $fallback->expects($this->once())->method('construct')->willReturn($author); + + $type = array('name' => Author::class, 'params' => array()); + $class = new ClassMetadata(Author::class); + + $constructor = new DoctrineObjectConstructor($this->registry, $fallback, 'foo'); + $authorFetched = $constructor->construct($this->visitor, $class, ['foo' => 5], $type, $this->context); + $this->assertSame($author, $authorFetched); + } + + protected function setUp() + { + $this->visitor = $this->getMockBuilder('JMS\Serializer\VisitorInterface')->getMock(); + $this->context = $this->getMockBuilder('JMS\Serializer\DeserializationContext')->getMock(); + + $connection = $this->createConnection(); + $entityManager = $this->createEntityManager($connection); + + $this->registry = $registry = new SimpleBaseManagerRegistry( + function ($id) use ($connection, $entityManager) { + switch ($id) { + case 'default_connection': + return $connection; + + case 'default_manager': + return $entityManager; + + default: + throw new \RuntimeException(sprintf('Unknown service id "%s".', $id)); + } + } + ); + + $this->serializer = SerializerBuilder::create() + ->setMetadataDriverFactory(new CallbackDriverFactory( + function (array $metadataDirs, Reader $annotationReader) use ($registry) { + $defaultFactory = new DefaultDriverFactory(); + + return new DoctrineTypeDriver($defaultFactory->createDriver($metadataDirs, $annotationReader), $registry); + } + )) + ->build(); + + $this->prepareDatabase(); + } + + private function prepareDatabase() + { + /** @var EntityManager $em */ + $em = $this->registry->getManager(); + + $tool = new SchemaTool($em); + $tool->createSchema($em->getMetadataFactory()->getAllMetadata()); + } + + private function createConnection() + { + $con = DriverManager::getConnection(array( + 'driver' => 'pdo_sqlite', + 'memory' => true, + )); + + return $con; + } + + private function createEntityManager(Connection $con) + { + $cfg = new Configuration(); + $cfg->setMetadataDriverImpl(new AnnotationDriver(new AnnotationReader(), array( + __DIR__ . '/../../Fixtures/Doctrine', + ))); + $cfg->setAutoGenerateProxyClasses(true); + $cfg->setProxyNamespace('JMS\Serializer\DoctrineProxy'); + $cfg->setProxyDir(sys_get_temp_dir() . '/serializer-test-proxies'); + + $em = EntityManager::create($con, $cfg); + + return $em; + } +} + +\Doctrine\DBAL\Types\Type::addType('Author', 'Doctrine\DBAL\Types\StringType'); +\Doctrine\DBAL\Types\Type::addType('some_custom_type', 'Doctrine\DBAL\Types\StringType'); + +class SimpleBaseManagerRegistry extends AbstractManagerRegistry +{ + private $services = array(); + private $serviceCreator; + + public function __construct($serviceCreator, $name = 'anonymous', array $connections = array('default' => 'default_connection'), array $managers = array('default' => 'default_manager'), $defaultConnection = null, $defaultManager = null, $proxyInterface = 'Doctrine\Common\Persistence\Proxy') + { + if (null === $defaultConnection) { + list($defaultConnection,) = each($connections); + } + if (null === $defaultManager) { + list($defaultManager,) = each($managers); + } + + parent::__construct($name, $connections, $managers, $defaultConnection, $defaultManager, $proxyInterface); + + if (!is_callable($serviceCreator)) { + throw new \InvalidArgumentException('$serviceCreator must be a valid callable.'); + } + $this->serviceCreator = $serviceCreator; + } + + public function getService($name) + { + if (isset($this->services[$name])) { + return $this->services[$name]; + } + + return $this->services[$name] = call_user_func($this->serviceCreator, $name); + } + + public function resetService($name) + { + unset($this->services[$name]); + } + + public function getAliasNamespace($alias) + { + foreach (array_keys($this->getManagers()) as $name) { + $manager = $this->getManager($name); + + if ($manager instanceof EntityManager) { + try { + return $manager->getConfiguration()->getEntityNamespace($alias); + } catch (ORMException $ex) { + // Probably mapped by another entity manager, or invalid, just ignore this here. + } + } else { + throw new \LogicException(sprintf('Unsupported manager type "%s".', get_class($manager))); + } + } + + throw new \RuntimeException(sprintf('The namespace alias "%s" is not known to any manager.', $alias)); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/EventDispatcher/EventDispatcherTest.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/EventDispatcher/EventDispatcherTest.php new file mode 100644 index 0000000000..c130462fe1 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/EventDispatcher/EventDispatcherTest.php @@ -0,0 +1,202 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Serializer\EventDispatcher; + +use JMS\Serializer\EventDispatcher\Event; +use JMS\Serializer\EventDispatcher\EventDispatcher; +use JMS\Serializer\EventDispatcher\EventDispatcherInterface; +use JMS\Serializer\EventDispatcher\EventSubscriberInterface; +use JMS\Serializer\EventDispatcher\ObjectEvent; + +class EventDispatcherTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var EventDispatcher + */ + private $dispatcher; + private $event; + + public function testHasListeners() + { + $this->assertFalse($this->dispatcher->hasListeners('foo', 'Foo', 'json')); + $this->dispatcher->addListener('foo', function() { }); + $this->assertTrue($this->dispatcher->hasListeners('foo', 'Foo', 'json')); + + $this->assertFalse($this->dispatcher->hasListeners('bar', 'Bar', 'json')); + $this->dispatcher->addListener('bar', function() { }, 'Foo'); + $this->assertFalse($this->dispatcher->hasListeners('bar', 'Bar', 'json')); + $this->dispatcher->addListener('bar', function() { }, 'Bar', 'xml'); + $this->assertFalse($this->dispatcher->hasListeners('bar', 'Bar', 'json')); + $this->dispatcher->addListener('bar', function() { }, null, 'json'); + $this->assertTrue($this->dispatcher->hasListeners('bar', 'Baz', 'json')); + $this->assertTrue($this->dispatcher->hasListeners('bar', 'Bar', 'json')); + + $this->assertFalse($this->dispatcher->hasListeners('baz', 'Bar', 'xml')); + $this->dispatcher->addListener('baz', function() { }, 'Bar'); + $this->assertTrue($this->dispatcher->hasListeners('baz', 'Bar', 'xml')); + $this->assertTrue($this->dispatcher->hasListeners('baz', 'bAr', 'xml')); + } + + public function testDispatch() + { + $a = new MockListener(); + $this->dispatcher->addListener('foo', array($a, 'foo')); + $this->dispatch('bar'); + $a->_verify('Listener is not called for other event.'); + + $b = new MockListener(); + $this->dispatcher->addListener('pre', array($b, 'bar'), 'Bar'); + $this->dispatcher->addListener('pre', array($b, 'foo'), 'Foo'); + $this->dispatcher->addListener('pre', array($b, 'all')); + + $b->bar($this->event, 'pre', 'bar', 'json', $this->dispatcher); + $b->all($this->event, 'pre', 'bar', 'json', $this->dispatcher); + $b->foo($this->event, 'pre', 'foo', 'json', $this->dispatcher); + $b->all($this->event, 'pre', 'foo', 'json', $this->dispatcher); + $b->_replay(); + $this->dispatch('pre', 'Bar'); + $this->dispatch('pre', 'Foo'); + $b->_verify(); + } + + public function testListenerCanStopPropagation() + { + $listener1 = false; + $listener2 = false; + + $this->dispatcher->addListener('pre', function (Event $event) use(&$listener1) { + $event->stopPropagation(); + $listener1 = true; + }); + + $this->dispatcher->addListener('pre', function () use(&$listener2) { + $listener2 = true; + }); + + $this->dispatch('pre'); + + $this->assertTrue($listener1); + $this->assertFalse($listener2); + } + + public function testListenerCanDispatchEvent() + { + $listener1 = false; + $listener2 = false; + $listener3 = false; + + $this->dispatcher->addListener('pre', function (Event $event, $eventName, $loweredClass, $format, EventDispatcherInterface $dispatcher) use(&$listener1) { + $listener1 = true; + + $event = new Event($event->getContext(), $event->getType()); + + $this->assertSame('pre', $eventName); + $this->assertSame('json', $format); + $this->assertSame('foo', $loweredClass); + + $dispatcher->dispatch('post', 'Blah', 'xml', $event); + }); + + $this->dispatcher->addListener('pre', function () use(&$listener2) { + $listener2 = true; + }); + + $this->dispatcher->addListener('post', function (Event $event, $eventName, $loweredClass, $format, EventDispatcherInterface $dispatcher) use(&$listener3) { + $listener3 = true; + + $this->assertSame('post', $eventName); + $this->assertSame('xml', $format); + $this->assertSame('blah', $loweredClass); + }); + + $this->dispatch('pre'); + + $this->assertTrue($listener1); + $this->assertTrue($listener2); + $this->assertTrue($listener3); + } + + public function testAddSubscriber() + { + $subscriber = new MockSubscriber(); + MockSubscriber::$events = array( + array('event' => 'foo.bar_baz', 'format' => 'foo'), + array('event' => 'bar', 'method' => 'bar', 'class' => 'foo'), + ); + + $this->dispatcher->addSubscriber($subscriber); + $this->assertAttributeEquals(array( + 'foo.bar_baz' => array( + array(array($subscriber, 'onfoobarbaz'), null, 'foo'), + ), + 'bar' => array( + array(array($subscriber, 'bar'), 'foo', null), + ), + ), 'listeners', $this->dispatcher); + } + + protected function setUp() + { + $this->dispatcher = new EventDispatcher(); + $this->event = new ObjectEvent($this->getMock('JMS\Serializer\Context'), new \stdClass(), array('name' => 'foo', 'params' => array())); + } + + private function dispatch($eventName, $class = 'Foo', $format = 'json', Event $event = null) + { + $this->dispatcher->dispatch($eventName, $class, $format, $event ?: $this->event); + } +} + +class MockSubscriber implements EventSubscriberInterface +{ + public static $events = array(); + + public static function getSubscribedEvents() + { + return self::$events; + } +} + +class MockListener +{ + private $expected = array(); + private $actual = array(); + private $wasReplayed = false; + + public function __call($method, array $args = array()) + { + if ( ! $this->wasReplayed) { + $this->expected[] = array($method, $args); + + return; + } + + $this->actual[] = array($method, $args); + } + + public function _replay() + { + $this->wasReplayed = true; + } + + public function _verify($message = null) + { + \PHPUnit_Framework_Assert::assertSame($this->expected, $this->actual, $message); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/EventDispatcher/Subscriber/DoctrineProxySubscriberTest.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/EventDispatcher/Subscriber/DoctrineProxySubscriberTest.php new file mode 100644 index 0000000000..fae03c4c05 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/EventDispatcher/Subscriber/DoctrineProxySubscriberTest.php @@ -0,0 +1,146 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Serializer\EventDispatcher\Subscriber; + +use JMS\Serializer\EventDispatcher\EventDispatcher; +use JMS\Serializer\EventDispatcher\PreSerializeEvent; +use JMS\Serializer\EventDispatcher\Subscriber\DoctrineProxySubscriber; +use JMS\Serializer\Tests\Fixtures\SimpleObjectProxy; +use JMS\Serializer\VisitorInterface; +use JMS\Serializer\Metadata\ClassMetadata; +use JMS\Serializer\Tests\Fixtures\ExclusionStrategy\AlwaysExcludeExclusionStrategy; +use JMS\Serializer\Tests\Fixtures\SimpleObject; +use Metadata\MetadataFactoryInterface; + +class DoctrineProxySubscriberTest extends \PHPUnit_Framework_TestCase +{ + /** @var VisitorInterface */ + private $visitor; + + /** @var DoctrineProxySubscriber */ + private $subscriber; + + /** + * @var EventDispatcher + */ + private $dispatcher; + + public function testRewritesProxyClassName() + { + $event = $this->createEvent($obj = new SimpleObjectProxy('a', 'b'), array('name' => get_class($obj), 'params' => array())); + $this->subscriber->onPreSerialize($event); + + $this->assertEquals(array('name' => get_parent_class($obj), 'params' => array()), $event->getType()); + $this->assertTrue($obj->__isInitialized()); + } + + public function testDoesNotRewriteCustomType() + { + $event = $this->createEvent($obj = new SimpleObjectProxy('a', 'b'), array('name' => 'FakedName', 'params' => array())); + $this->subscriber->onPreSerialize($event); + + $this->assertEquals(array('name' => 'FakedName', 'params' => array()), $event->getType()); + $this->assertTrue($obj->__isInitialized()); + } + + public function testProxyLoadingCanBeSkippedForVirtualTypes() + { + $subscriber = new DoctrineProxySubscriber(true); + + $event = $this->createEvent($obj = new SimpleObjectProxy('a', 'b'), array('name' => 'FakedName', 'params' => array())); + $subscriber->onPreSerialize($event); + + $this->assertEquals(array('name' => 'FakedName', 'params' => array()), $event->getType()); + $this->assertFalse($obj->__isInitialized()); + } + + public function testProxyLoadingCanBeSkippedByExclusionStrategy() + { + $subscriber = new DoctrineProxySubscriber(false, false); + + $factoryMock = $this->getMockBuilder(MetadataFactoryInterface::class)->getMock(); + $factoryMock->method('getMetadataForClass')->willReturn(new ClassMetadata(SimpleObject::class)); + + $this->visitor->method('getExclusionStrategy')->willReturn(new AlwaysExcludeExclusionStrategy()); + $this->visitor->method('getMetadataFactory')->willReturn($factoryMock); + + $event = $this->createEvent($obj = new SimpleObjectProxy('a', 'b'), array('name' => SimpleObjectProxy::class, 'params' => array())); + $subscriber->onPreSerialize($event); + $this->assertFalse($obj->__isInitialized()); + + // virtual types are still initialized + $event = $this->createEvent($obj = new SimpleObjectProxy('a', 'b'), array('name' => 'FakeName', 'params' => array())); + $subscriber->onPreSerialize($event); + $this->assertTrue($obj->__isInitialized()); + } + + public function testEventTriggeredOnRealClassName() + { + $proxy = new SimpleObjectProxy('foo', 'bar'); + + $realClassEventTriggered1 = false; + $this->dispatcher->addListener('serializer.pre_serialize', function () use (&$realClassEventTriggered1) { + $realClassEventTriggered1 = true; + }, get_parent_class($proxy)); + + $event = $this->createEvent($proxy, array('name' => get_class($proxy), 'params' => array())); + $this->dispatcher->dispatch('serializer.pre_serialize', get_class($proxy), 'json', $event); + + $this->assertTrue($realClassEventTriggered1); + } + + public function testListenersCanChangeType() + { + $proxy = new SimpleObjectProxy('foo', 'bar'); + + $realClassEventTriggered1 = false; + $this->dispatcher->addListener('serializer.pre_serialize', function (PreSerializeEvent $event) use (&$realClassEventTriggered1) { + $event->setType('foo', ['bar']); + }, get_parent_class($proxy)); + + $event = $this->createEvent($proxy, array('name' => get_class($proxy), 'params' => array())); + $this->dispatcher->dispatch('serializer.pre_serialize', get_class($proxy), 'json', $event); + + $this->assertSame(['name' => 'foo', 'params' => ['bar']], $event->getType()); + } + + public function testListenersDoNotChangeTypeOnProxiesAndVirtualTypes() + { + $proxy = new SimpleObjectProxy('foo', 'bar'); + + $event = $this->createEvent($proxy, ['name' => 'foo', 'params' => []]); + $this->dispatcher->dispatch('serializer.pre_serialize', get_class($proxy), 'json', $event); + + $this->assertSame(['name' => 'foo', 'params' => []], $event->getType()); + } + + protected function setUp() + { + $this->subscriber = new DoctrineProxySubscriber(); + $this->visitor = $this->getMock('JMS\Serializer\Context'); + + $this->dispatcher = new EventDispatcher(); + $this->dispatcher->addSubscriber($this->subscriber); + } + + private function createEvent($object, array $type) + { + return new PreSerializeEvent($this->visitor, $object, $type); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/EventDispatcher/Subscriber/SymfonyValidatorSubscriberTest.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/EventDispatcher/Subscriber/SymfonyValidatorSubscriberTest.php new file mode 100644 index 0000000000..b49b80164a --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/EventDispatcher/Subscriber/SymfonyValidatorSubscriberTest.php @@ -0,0 +1,110 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Serializer\EventDispatcher\Subscriber; + +use JMS\Serializer\Context; +use JMS\Serializer\DeserializationContext; +use JMS\Serializer\EventDispatcher\EventDispatcher; +use JMS\Serializer\EventDispatcher\ObjectEvent; +use JMS\Serializer\EventDispatcher\Subscriber\SymfonyValidatorSubscriber; +use JMS\Serializer\SerializerBuilder; +use JMS\Serializer\Tests\Fixtures\AuthorList; +use Symfony\Component\Validator\ConstraintViolation; +use Symfony\Component\Validator\ConstraintViolationList; + +class SymfonyValidatorSubscriberTest extends \PHPUnit_Framework_TestCase +{ + private $validator; + + /** @var SymfonyValidatorSubscriber */ + private $subscriber; + + public function testValidate() + { + $obj = new \stdClass; + + $this->validator->expects($this->once()) + ->method('validate') + ->with($obj, array('foo')) + ->will($this->returnValue(new ConstraintViolationList())); + + $context = DeserializationContext::create()->setAttribute('validation_groups', array('foo')); + + $this->subscriber->onPostDeserialize(new ObjectEvent($context, $obj, array())); + } + + /** + * @expectedException JMS\Serializer\Exception\ValidationFailedException + * @expectedExceptionMessage Validation failed with 1 error(s). + */ + public function testValidateThrowsExceptionWhenListIsNotEmpty() + { + $obj = new \stdClass; + + $this->validator->expects($this->once()) + ->method('validate') + ->with($obj, array('foo')) + ->will($this->returnValue(new ConstraintViolationList(array(new ConstraintViolation('foo', 'foo', array(), 'a', 'b', 'c'))))); + + $context = DeserializationContext::create()->setAttribute('validation_groups', array('foo')); + + $this->subscriber->onPostDeserialize(new ObjectEvent($context, $obj, array())); + } + + public function testValidatorIsNotCalledWhenNoGroupsAreSet() + { + $this->validator->expects($this->never()) + ->method('validate'); + + $this->subscriber->onPostDeserialize(new ObjectEvent(DeserializationContext::create(), new \stdClass, array())); + } + + public function testValidationIsOnlyPerformedOnRootObject() + { + $this->validator->expects($this->once()) + ->method('validate') + ->with($this->isInstanceOf('JMS\Serializer\Tests\Fixtures\AuthorList'), array('Foo')) + ->will($this->returnValue(new ConstraintViolationList())); + + $subscriber = $this->subscriber; + $list = SerializerBuilder::create() + ->configureListeners(function(EventDispatcher $dispatcher) use ($subscriber) { + $dispatcher->addSubscriber($subscriber); + }) + ->build() + ->deserialize( + '{"authors":[{"full_name":"foo"},{"full_name":"bar"}]}', + 'JMS\Serializer\Tests\Fixtures\AuthorList', + 'json', + DeserializationContext::create()->setAttribute('validation_groups', array('Foo')) + ); + + $this->assertCount(2, $list); + } + + protected function setUp() + { + if (!interface_exists('Symfony\Component\Validator\ValidatorInterface')) { + $this->markTestSkipped('Symfony\Component\Validator\ValidatorInterface is not available'); + } + + $this->validator = $this->getMock('Symfony\Component\Validator\ValidatorInterface'); + $this->subscriber = new SymfonyValidatorSubscriber($this->validator); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/EventDispatcher/Subscriber/SymfonyValidatorValidatorSubscriberTest.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/EventDispatcher/Subscriber/SymfonyValidatorValidatorSubscriberTest.php new file mode 100644 index 0000000000..03e90cc3d4 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/EventDispatcher/Subscriber/SymfonyValidatorValidatorSubscriberTest.php @@ -0,0 +1,109 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Serializer\EventDispatcher\Subscriber; + +use JMS\Serializer\DeserializationContext; +use JMS\Serializer\EventDispatcher\EventDispatcher; +use JMS\Serializer\EventDispatcher\ObjectEvent; +use JMS\Serializer\EventDispatcher\Subscriber\SymfonyValidatorSubscriber; +use JMS\Serializer\EventDispatcher\Subscriber\SymfonyValidatorValidatorSubscriber; +use JMS\Serializer\SerializerBuilder; +use Symfony\Component\Validator\ConstraintViolation; +use Symfony\Component\Validator\ConstraintViolationList; + +class SymfonyValidatorValidatorSubscriberTest extends \PHPUnit_Framework_TestCase +{ + private $validator; + + /** @var SymfonyValidatorSubscriber */ + private $subscriber; + + public function testValidate() + { + $obj = new \stdClass; + + $this->validator->expects($this->once()) + ->method('validate') + ->with($obj, null, array('foo')) + ->will($this->returnValue(new ConstraintViolationList())); + + $context = DeserializationContext::create()->setAttribute('validation_groups', array('foo')); + + $this->subscriber->onPostDeserialize(new ObjectEvent($context, $obj, array())); + } + + /** + * @expectedException \JMS\Serializer\Exception\ValidationFailedException + * @expectedExceptionMessage Validation failed with 1 error(s). + */ + public function testValidateThrowsExceptionWhenListIsNotEmpty() + { + $obj = new \stdClass; + + $this->validator->expects($this->once()) + ->method('validate') + ->with($obj, null, array('foo')) + ->will($this->returnValue(new ConstraintViolationList(array(new ConstraintViolation('foo', 'foo', array(), 'a', 'b', 'c'))))); + + $context = DeserializationContext::create()->setAttribute('validation_groups', array('foo')); + + $this->subscriber->onPostDeserialize(new ObjectEvent($context, $obj, array())); + } + + public function testValidatorIsNotCalledWhenNoGroupsAreSet() + { + $this->validator->expects($this->never()) + ->method('validate'); + + $this->subscriber->onPostDeserialize(new ObjectEvent(DeserializationContext::create(), new \stdClass, array())); + } + + public function testValidationIsOnlyPerformedOnRootObject() + { + $this->validator->expects($this->once()) + ->method('validate') + ->with($this->isInstanceOf('JMS\Serializer\Tests\Fixtures\AuthorList'), null, array('Foo')) + ->will($this->returnValue(new ConstraintViolationList())); + + $subscriber = $this->subscriber; + $list = SerializerBuilder::create() + ->configureListeners(function (EventDispatcher $dispatcher) use ($subscriber) { + $dispatcher->addSubscriber($subscriber); + }) + ->build() + ->deserialize( + '{"authors":[{"full_name":"foo"},{"full_name":"bar"}]}', + 'JMS\Serializer\Tests\Fixtures\AuthorList', + 'json', + DeserializationContext::create()->setAttribute('validation_groups', array('Foo')) + ); + + $this->assertCount(2, $list); + } + + protected function setUp() + { + if (!interface_exists('Symfony\Component\Validator\Validator\ValidatorInterface')) { + $this->markTestSkipped('Symfony\Component\Validator\Validator\ValidatorInterface ^2.6|^3.0 is not available'); + } + + $this->validator = $this->getMock('Symfony\Component\Validator\Validator\ValidatorInterface'); + $this->subscriber = new SymfonyValidatorValidatorSubscriber($this->validator); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/GraphNavigatorTest.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/GraphNavigatorTest.php new file mode 100644 index 0000000000..b179dc03ef --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/GraphNavigatorTest.php @@ -0,0 +1,177 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Serializer; + +use JMS\Serializer\Construction\UnserializeObjectConstructor; +use JMS\Serializer\Handler\HandlerRegistry; +use JMS\Serializer\EventDispatcher\EventDispatcher; +use Doctrine\Common\Annotations\AnnotationReader; +use JMS\Serializer\Handler\SubscribingHandlerInterface; +use JMS\Serializer\Metadata\Driver\AnnotationDriver; +use JMS\Serializer\GraphNavigator; +use Metadata\MetadataFactory; + +class GraphNavigatorTest extends \PHPUnit_Framework_TestCase +{ + private $metadataFactory; + private $handlerRegistry; + private $objectConstructor; + private $dispatcher; + private $navigator; + private $context; + + /** + * @expectedException JMS\Serializer\Exception\RuntimeException + * @expectedExceptionMessage Resources are not supported in serialized data. + */ + public function testResourceThrowsException() + { + $this->context->expects($this->any()) + ->method('getDirection') + ->will($this->returnValue(GraphNavigator::DIRECTION_SERIALIZATION)); + + $this->navigator->accept(STDIN, null, $this->context); + } + + public function testNavigatorPassesInstanceOnSerialization() + { + $object = new SerializableClass; + $metadata = $this->metadataFactory->getMetadataForClass(get_class($object)); + + $self = $this; + $context = $this->context; + $exclusionStrategy = $this->getMock('JMS\Serializer\Exclusion\ExclusionStrategyInterface'); + $exclusionStrategy->expects($this->once()) + ->method('shouldSkipClass') + ->will($this->returnCallback(function($passedMetadata, $passedContext) use ($metadata, $context, $self) { + $self->assertSame($metadata, $passedMetadata); + $self->assertSame($context, $passedContext); + })); + $exclusionStrategy->expects($this->once()) + ->method('shouldSkipProperty') + ->will($this->returnCallback(function($propertyMetadata, $passedContext) use ($context, $metadata, $self) { + $self->assertSame($metadata->propertyMetadata['foo'], $propertyMetadata); + $self->assertSame($context, $passedContext); + })); + + $this->context->expects($this->once()) + ->method('getExclusionStrategy') + ->will($this->returnValue($exclusionStrategy)); + + $this->context->expects($this->any()) + ->method('getDirection') + ->will($this->returnValue(GraphNavigator::DIRECTION_SERIALIZATION)); + + $this->context->expects($this->any()) + ->method('getVisitor') + ->will($this->returnValue($this->getMock('JMS\Serializer\VisitorInterface'))); + + $this->navigator = new GraphNavigator($this->metadataFactory, $this->handlerRegistry, $this->objectConstructor, $this->dispatcher); + $this->navigator->accept($object, null, $this->context); + } + + public function testNavigatorPassesNullOnDeserialization() + { + $class = __NAMESPACE__.'\SerializableClass'; + $metadata = $this->metadataFactory->getMetadataForClass($class); + + $context = $this->context; + $exclusionStrategy = $this->getMock('JMS\Serializer\Exclusion\ExclusionStrategyInterface'); + $exclusionStrategy->expects($this->once()) + ->method('shouldSkipClass') + ->with($metadata, $this->callback(function ($navigatorContext) use ($context) { + return $navigatorContext === $context; + })); + + $exclusionStrategy->expects($this->once()) + ->method('shouldSkipProperty') + ->with($metadata->propertyMetadata['foo'], $this->callback(function ($navigatorContext) use ($context) { + return $navigatorContext === $context; + })); + + $this->context->expects($this->once()) + ->method('getExclusionStrategy') + ->will($this->returnValue($exclusionStrategy)); + + $this->context->expects($this->any()) + ->method('getDirection') + ->will($this->returnValue(GraphNavigator::DIRECTION_DESERIALIZATION)); + + $this->context->expects($this->any()) + ->method('getVisitor') + ->will($this->returnValue($this->getMock('JMS\Serializer\VisitorInterface'))); + + $this->navigator = new GraphNavigator($this->metadataFactory, $this->handlerRegistry, $this->objectConstructor, $this->dispatcher); + $this->navigator->accept('random', array('name' => $class, 'params' => array()), $this->context); + } + + public function testNavigatorChangeTypeOnSerialization() + { + $object = new SerializableClass; + $typeName = 'JsonSerializable'; + + $this->dispatcher->addListener('serializer.pre_serialize', function($event) use ($typeName) { + $type = $event->getType(); + $type['name'] = $typeName; + $event->setType($type['name'], $type['params']); + }); + + $this->handlerRegistry->registerSubscribingHandler(new TestSubscribingHandler()); + + $this->context->expects($this->any()) + ->method('getDirection') + ->will($this->returnValue(GraphNavigator::DIRECTION_SERIALIZATION)); + + $this->context->expects($this->any()) + ->method('getVisitor') + ->will($this->returnValue($this->getMock('JMS\Serializer\VisitorInterface'))); + + $this->navigator = new GraphNavigator($this->metadataFactory, $this->handlerRegistry, $this->objectConstructor, $this->dispatcher); + $this->navigator->accept($object, null, $this->context); + } + + protected function setUp() + { + $this->context = $this->getMock('JMS\Serializer\Context'); + $this->dispatcher = new EventDispatcher(); + $this->handlerRegistry = new HandlerRegistry(); + $this->objectConstructor = new UnserializeObjectConstructor(); + + $this->metadataFactory = new MetadataFactory(new AnnotationDriver(new AnnotationReader())); + $this->navigator = new GraphNavigator($this->metadataFactory, $this->handlerRegistry, $this->objectConstructor, $this->dispatcher); + } +} + +class SerializableClass +{ + public $foo = 'bar'; +} + +class TestSubscribingHandler implements SubscribingHandlerInterface +{ + public static function getSubscribingMethods() + { + return array(array( + 'type' => 'JsonSerializable', + 'format' => 'foo', + 'direction' => GraphNavigator::DIRECTION_SERIALIZATION, + 'method' => 'serialize' + )); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/JsonSerializationTest.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/JsonSerializationTest.php new file mode 100644 index 0000000000..4077a80680 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/JsonSerializationTest.php @@ -0,0 +1,429 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Serializer; + +use JMS\Serializer\Context; +use JMS\Serializer\Exception\RuntimeException; +use JMS\Serializer\EventDispatcher\Event; +use JMS\Serializer\EventDispatcher\EventSubscriberInterface; +use JMS\Serializer\GraphNavigator; +use JMS\Serializer\Tests\Fixtures\ObjectWithEmptyArrayAndHash; +use JMS\Serializer\Tests\Fixtures\Tag; +use JMS\Serializer\VisitorInterface; +use JMS\Serializer\Tests\Fixtures\Author; +use JMS\Serializer\Tests\Fixtures\AuthorList; +use JMS\Serializer\SerializationContext; + +class JsonSerializationTest extends BaseSerializationTest +{ + protected function getContent($key) + { + static $outputs = array(); + + if (!$outputs) { + $outputs['readonly'] = '{"id":123,"full_name":"Ruud Kamphuis"}'; + $outputs['string'] = '"foo"'; + $outputs['boolean_true'] = 'true'; + $outputs['boolean_false'] = 'false'; + $outputs['integer'] = '1'; + $outputs['float'] = '4.533'; + $outputs['float_trailing_zero'] = '1'; + $outputs['simple_object'] = '{"foo":"foo","moo":"bar","camel_case":"boo"}'; + $outputs['circular_reference'] = '{"collection":[{"name":"child1"},{"name":"child2"}],"another_collection":[{"name":"child1"},{"name":"child2"}]}'; + $outputs['array_strings'] = '["foo","bar"]'; + $outputs['array_booleans'] = '[true,false]'; + $outputs['array_integers'] = '[1,3,4]'; + $outputs['array_empty'] = '{"array":[]}'; + $outputs['array_floats'] = '[1.34,3,6.42]'; + $outputs['array_objects'] = '[{"foo":"foo","moo":"bar","camel_case":"boo"},{"foo":"baz","moo":"boo","camel_case":"boo"}]'; + $outputs['array_list_and_map_difference'] = '{"list":[1,2,3],"map":{"0":1,"2":2,"3":3}}'; + $outputs['array_mixed'] = '["foo",1,true,{"foo":"foo","moo":"bar","camel_case":"boo"},[1,3,true]]'; + $outputs['array_datetimes_object'] = '{"array_with_default_date_time":["2047-01-01T12:47:47+0000","2016-12-05T00:00:00+0000"],"array_with_formatted_date_time":["01.01.2047 12:47:47","05.12.2016 00:00:00"]}'; + $outputs['array_named_datetimes_object'] = '{"named_array_with_formatted_date":{"testdate1":"01.01.2047 12:47:47","testdate2":"05.12.2016 00:00:00"}}'; + $outputs['array_datetimes_object'] = '{"array_with_default_date_time":["2047-01-01T12:47:47+0000","2016-12-05T00:00:00+0000"],"array_with_formatted_date_time":["01.01.2047 12:47:47","05.12.2016 00:00:00"]}'; + $outputs['array_named_datetimes_object'] = '{"named_array_with_formatted_date":{"testdate1":"01.01.2047 12:47:47","testdate2":"05.12.2016 00:00:00"}}'; + $outputs['array_named_datetimeimmutables_object'] = '{"named_array_with_formatted_date":{"testdate1":"01.01.2047 12:47:47","testdate2":"05.12.2016 00:00:00"}}'; + $outputs['blog_post'] = '{"id":"what_a_nice_id","title":"This is a nice title.","created_at":"2011-07-30T00:00:00+0000","is_published":false,"etag":"1edf9bf60a32d89afbb85b2be849e3ceed5f5b10","comments":[{"author":{"full_name":"Foo Bar"},"text":"foo"}],"comments2":[{"author":{"full_name":"Foo Bar"},"text":"foo"}],"metadata":{"foo":"bar"},"author":{"full_name":"Foo Bar"},"publisher":{"pub_name":"Bar Foo"},"tag":[{"name":"tag1"},{"name":"tag2"}]}'; + $outputs['blog_post_unauthored'] = '{"id":"what_a_nice_id","title":"This is a nice title.","created_at":"2011-07-30T00:00:00+0000","is_published":false,"etag":"1edf9bf60a32d89afbb85b2be849e3ceed5f5b10","comments":[],"comments2":[],"metadata":{"foo":"bar"},"author":null,"publisher":null,"tag":null}'; + $outputs['price'] = '{"price":3}'; + $outputs['currency_aware_price'] = '{"currency":"EUR","amount":2.34}'; + $outputs['order'] = '{"cost":{"price":12.34}}'; + $outputs['order_with_currency_aware_price'] = '{"cost":{"currency":"EUR","amount":1.23}}'; + $outputs['log'] = '{"author_list":[{"full_name":"Johannes Schmitt"},{"full_name":"John Doe"}],"comments":[{"author":{"full_name":"Foo Bar"},"text":"foo"},{"author":{"full_name":"Foo Bar"},"text":"bar"},{"author":{"full_name":"Foo Bar"},"text":"baz"}]}'; + $outputs['lifecycle_callbacks'] = '{"name":"Foo Bar"}'; + $outputs['form_errors'] = '["This is the form error","Another error"]'; + $outputs['nested_form_errors'] = '{"errors":["This is the form error"],"children":{"bar":{"errors":["Error of the child form"]}}}'; + $outputs['constraint_violation'] = '{"property_path":"foo","message":"Message of violation"}'; + $outputs['constraint_violation_list'] = '[{"property_path":"foo","message":"Message of violation"},{"property_path":"bar","message":"Message of another violation"}]'; + $outputs['article'] = '{"custom":"serialized"}'; + $outputs['orm_proxy'] = '{"foo":"foo","moo":"bar","camel_case":"proxy-boo"}'; + $outputs['custom_accessor'] = '{"comments":{"Foo":{"comments":[{"author":{"full_name":"Foo"},"text":"foo"},{"author":{"full_name":"Foo"},"text":"bar"}],"count":2}}}'; + $outputs['mixed_access_types'] = '{"id":1,"name":"Johannes","read_only_property":42}'; + $outputs['accessor_order_child'] = '{"c":"c","d":"d","a":"a","b":"b"}'; + $outputs['accessor_order_parent'] = '{"a":"a","b":"b"}'; + $outputs['accessor_order_methods'] = '{"foo":"c","b":"b","a":"a"}'; + $outputs['inline'] = '{"c":"c","a":"a","b":"b","d":"d"}'; + $outputs['inline_child_empty'] = '{"c":"c","d":"d"}'; + $outputs['empty_child'] = '{"c":"c","d":"d","child":{}}'; + $outputs['empty_child_skip'] = '{"c":"c","d":"d"}'; + $outputs['groups_all'] = '{"foo":"foo","foobar":"foobar","bar":"bar","none":"none"}'; + $outputs['groups_foo'] = '{"foo":"foo","foobar":"foobar"}'; + $outputs['groups_foobar'] = '{"foo":"foo","foobar":"foobar","bar":"bar"}'; + $outputs['groups_default'] = '{"bar":"bar","none":"none"}'; + $outputs['groups_advanced'] = '{"name":"John","manager":{"name":"John Manager","friends":[{"nickname":"nickname"},{"nickname":"nickname"}]},"friends":[{"manager":{"name":"John friend 1 manager"}},{"manager":{"name":"John friend 2 manager"}}]}'; + $outputs['virtual_properties'] = '{"exist_field":"value","virtual_value":"value","test":"other-name","typed_virtual_property":1}'; + $outputs['virtual_properties_low'] = '{"low":1}'; + $outputs['virtual_properties_high'] = '{"high":8}'; + $outputs['virtual_properties_all'] = '{"low":1,"high":8}'; + $outputs['nullable'] = '{"foo":"bar","baz":null,"0":null}'; + $outputs['nullable_skip'] = '{"foo":"bar"}'; + $outputs['person_secret_show'] = '{"name":"mike","gender":"f"}'; + $outputs['person_secret_hide'] = '{"name":"mike"}'; + $outputs['null'] = 'null'; + $outputs['simple_object_nullable'] = '{"foo":"foo","moo":"bar","camel_case":"boo","null_property":null}'; + $outputs['input'] = '{"attributes":{"type":"text","name":"firstname","value":"Adrien"}}'; + $outputs['hash_empty'] = '{"hash":{}}'; + $outputs['object_when_null'] = '{"text":"foo"}'; + $outputs['object_when_null_and_serialized'] = '{"author":null,"text":"foo"}'; + $outputs['date_time'] = '"2011-08-30T00:00:00+0000"'; + $outputs['date_time_immutable'] = '"2011-08-30T00:00:00+0000"'; + $outputs['timestamp'] = '{"timestamp":1455148800}'; + $outputs['timestamp_prev'] = '{"timestamp":"1455148800"}'; + $outputs['date_interval'] = '"PT45M"'; + $outputs['car'] = '{"km":5,"type":"car"}'; + $outputs['car_without_type'] = '{"km":5}'; + $outputs['garage'] = '{"vehicles":[{"km":3,"type":"car"},{"km":1,"type":"moped"}]}'; + $outputs['tree'] = '{"tree":{"children":[{"children":[{"children":[],"foo":"bar"}],"foo":"bar"}],"foo":"bar"}}'; + $outputs['nullable_arrays'] = '{"empty_inline":[],"not_empty_inline":["not_empty_inline"],"empty_not_inline":[],"not_empty_not_inline":["not_empty_not_inline"],"empty_not_inline_skip":[],"not_empty_not_inline_skip":["not_empty_not_inline_skip"]}'; + $outputs['object_with_object_property_no_array_to_author'] = '{"foo": "bar", "author": "baz"}'; + $outputs['object_with_object_property'] = '{"foo": "bar", "author": {"full_name": "baz"}}'; + $outputs['author_expression'] = '{"my_first_name":"Ruud","last_name":"Kamphuis","id":123}'; + $outputs['maxdepth_skippabe_object'] = '{"a":{"xxx":"yyy"}}'; + } + + if (!isset($outputs[$key])) { + throw new RuntimeException(sprintf('The key "%s" is not supported.', $key)); + } + + return $outputs[$key]; + } + + public function testSkipEmptyArrayAndHash() + { + $object = new ObjectWithEmptyArrayAndHash(); + + $this->assertEquals('{}', $this->serialize($object)); + } + + public function testAddLinksToOutput() + { + $this->dispatcher->addListener('serializer.post_serialize', function (Event $event) { + $this->assertFalse($event->getVisitor()->hasData('_links')); + }, 'JMS\Serializer\Tests\Fixtures\Author', 'json'); + + $this->dispatcher->addSubscriber(new LinkAddingSubscriber()); + + $this->dispatcher->addListener('serializer.post_serialize', function (Event $event) { + $this->assertTrue($event->getVisitor()->hasData('_links')); + }, 'JMS\Serializer\Tests\Fixtures\Author', 'json'); + + $this->handlerRegistry->registerHandler(GraphNavigator::DIRECTION_SERIALIZATION, 'JMS\Serializer\Tests\Fixtures\AuthorList', 'json', + function(VisitorInterface $visitor, AuthorList $data, array $type, Context $context) { + return $visitor->visitArray(iterator_to_array($data), $type, $context); + } + ); + + $list = new AuthorList(); + $list->add(new Author('foo')); + $list->add(new Author('bar')); + + $this->assertEquals('[{"full_name":"foo","_links":{"details":"http:\/\/foo.bar\/details\/foo","comments":"http:\/\/foo.bar\/details\/foo\/comments"}},{"full_name":"bar","_links":{"details":"http:\/\/foo.bar\/details\/bar","comments":"http:\/\/foo.bar\/details\/bar\/comments"}}]', $this->serialize($list)); + } + + public function testReplaceNameInOutput() + { + $this->dispatcher->addSubscriber(new ReplaceNameSubscriber()); + $this->handlerRegistry->registerHandler(GraphNavigator::DIRECTION_SERIALIZATION, 'JMS\Serializer\Tests\Fixtures\AuthorList', 'json', + function(VisitorInterface $visitor, AuthorList $data, array $type, Context $context) { + return $visitor->visitArray(iterator_to_array($data), $type, $context); + } + ); + + $list = new AuthorList(); + $list->add(new Author('foo')); + $list->add(new Author('bar')); + + $this->assertEquals('[{"full_name":"new name"},{"full_name":"new name"}]', $this->serialize($list)); + } + + /** + * @expectedException RuntimeException + * @expectedExceptionMessage Invalid data "baz"(string), expected "JMS\Serializer\Tests\Fixtures\Author". + */ + public function testDeserializingObjectWithObjectPropertyWithNoArrayToObject() + { + $content = $this->getContent('object_with_object_property_no_array_to_author'); + $object = $this->deserialize($content, 'JMS\Serializer\Tests\Fixtures\ObjectWithObjectProperty'); + $this->assertEquals('bar', $object->getFoo()); + $this->assertInstanceOf('JMS\Serializer\Tests\Fixtures\Author', $object->getAuthor()); + } + + public function testDeserializingObjectWithObjectProperty() + { + $content = $this->getContent('object_with_object_property'); + $object = $this->deserialize($content, 'JMS\Serializer\Tests\Fixtures\ObjectWithObjectProperty'); + $this->assertEquals('bar', $object->getFoo()); + $this->assertInstanceOf('JMS\Serializer\Tests\Fixtures\Author', $object->getAuthor()); + $this->assertEquals('baz', $object->getAuthor()->getName()); + } + + public function getPrimitiveTypes() + { + return array( + array( + 'type' => 'boolean', + 'data' => true, + ), + array( + 'type' => 'boolean', + 'data' => 1, + ), + array( + 'type' => 'integer', + 'data' => 123, + ), + array( + 'type' => 'integer', + 'data' => "123", + ), + array( + 'type' => 'string', + 'data' => "hello", + ), + array( + 'type' => 'string', + 'data' => 123, + ), + array( + 'type' => 'double', + 'data' => 0.1234, + ), + array( + 'type' => 'double', + 'data' => "0.1234", + ), + ); + } + + /** + * @dataProvider getPrimitiveTypes + */ + public function testPrimitiveTypes($primitiveType, $data) + { + $visitor = $this->serializationVisitors->get('json')->get(); + $functionToCall = 'visit' . ucfirst($primitiveType); + $result = $visitor->$functionToCall($data, array(), $this->getMock('JMS\Serializer\Context')); + if ($primitiveType == 'double') { + $primitiveType = 'float'; + } + $this->assertInternalType($primitiveType, $result); + } + + /** + * @group empty-object + */ + public function testSerializeEmptyObject() + { + $this->assertEquals('{}', $this->serialize(new Author(null))); + } + + /** + * @group encoding + * @expectedException RuntimeException + * @expectedExceptionMessage Your data could not be encoded because it contains invalid UTF8 characters. + */ + public function testSerializeWithNonUtf8EncodingWhenDisplayErrorsOff() + { + ini_set('display_errors', 1); + $this->serialize(array('foo' => 'bar', 'bar' => pack("H*" ,'c32e'))); + } + + /** + * @group encoding + * @expectedException RuntimeException + * @expectedExceptionMessage Your data could not be encoded because it contains invalid UTF8 characters. + */ + public function testSerializeWithNonUtf8EncodingWhenDisplayErrorsOn() + { + ini_set('display_errors', 0); + $this->serialize(array('foo' => 'bar', 'bar' => pack("H*" ,'c32e'))); + } + + public function testSerializeArrayWithEmptyObject() + { + $this->assertEquals('[{}]', $this->serialize(array(new \stdClass()))); + } + + public function testSerializeRootArrayWithDefinedKeys() + { + $author1 = new Author("Jim"); + $author2 = new Author("Mark"); + + $data = array( + 'jim' => $author1, + 'mark' => $author2, + ); + + $this->assertEquals('{"jim":{"full_name":"Jim"},"mark":{"full_name":"Mark"}}', $this->serializer->serialize($data, $this->getFormat(), SerializationContext::create()->setInitialType('array'))); + $this->assertEquals('[{"full_name":"Jim"},{"full_name":"Mark"}]', $this->serializer->serialize($data, $this->getFormat(), SerializationContext::create()->setInitialType('array'))); + $this->assertEquals('{"jim":{"full_name":"Jim"},"mark":{"full_name":"Mark"}}', $this->serializer->serialize($data, $this->getFormat(), SerializationContext::create()->setInitialType('array'))); + + $data = array( + $author1, + $author2, + ); + $this->assertEquals('[{"full_name":"Jim"},{"full_name":"Mark"}]', $this->serializer->serialize($data, $this->getFormat(), SerializationContext::create()->setInitialType('array'))); + $this->assertEquals('{"0":{"full_name":"Jim"},"1":{"full_name":"Mark"}}', $this->serializer->serialize($data, $this->getFormat(), SerializationContext::create()->setInitialType('array'))); + $this->assertEquals('{"0":{"full_name":"Jim"},"1":{"full_name":"Mark"}}', $this->serializer->serialize($data, $this->getFormat(), SerializationContext::create()->setInitialType('array'))); + } + + public function getTypeHintedArrays() + { + return [ + + [[1, 2], '[1,2]', null], + [['a', 'b'], '["a","b"]', null], + [['a' => 'a', 'b' => 'b'], '{"a":"a","b":"b"}', null], + + [[], '[]', null], + [[], '[]', SerializationContext::create()->setInitialType('array')], + [[], '[]', SerializationContext::create()->setInitialType('array')], + [[], '{}', SerializationContext::create()->setInitialType('array')], + + + [[1, 2], '[1,2]', SerializationContext::create()->setInitialType('array')], + [[1 => 1, 2 => 2], '{"1":1,"2":2}', SerializationContext::create()->setInitialType('array')], + [[1 => 1, 2 => 2], '[1,2]', SerializationContext::create()->setInitialType('array')], + [['a', 'b'], '["a","b"]', SerializationContext::create()->setInitialType('array')], + + [[1 => 'a', 2 => 'b'], '["a","b"]', SerializationContext::create()->setInitialType('array')], + [['a' => 'a', 'b' => 'b'], '["a","b"]', SerializationContext::create()->setInitialType('array')], + + + [[1,2], '{"0":1,"1":2}', SerializationContext::create()->setInitialType('array')], + [[1,2], '{"0":1,"1":2}', SerializationContext::create()->setInitialType('array')], + [[1,2], '{"0":"1","1":"2"}', SerializationContext::create()->setInitialType('array')], + + + [['a', 'b'], '{"0":"a","1":"b"}', SerializationContext::create()->setInitialType('array')], + [['a' => 'a', 'b' => 'b'], '{"a":"a","b":"b"}', SerializationContext::create()->setInitialType('array')], + ]; + } + + /** + * @dataProvider getTypeHintedArrays + * @param array $array + * @param string $expected + * @param SerializationContext|null $context + */ + public function testTypeHintedArraySerialization(array $array, $expected, $context = null) + { + $this->assertEquals($expected, $this->serialize($array, $context)); + } + + public function getTypeHintedArraysAndStdClass() + { + $c1 = new \stdClass(); + $c2 = new \stdClass(); + $c2->foo = 'bar'; + + $tag = new Tag("tag"); + + $c3 = new \stdClass(); + $c3->foo = $tag; + + return [ + + [[$c1], '[{}]', SerializationContext::create()->setInitialType('array')], + + [[$c2], '[{"foo":"bar"}]', SerializationContext::create()->setInitialType('array')], + + [[$tag], '[{"name":"tag"}]', SerializationContext::create()->setInitialType('array')], + + [[$c1], '{"0":{}}', SerializationContext::create()->setInitialType('array')], + [[$c2], '{"0":{"foo":"bar"}}', SerializationContext::create()->setInitialType('array')], + + [[$c3], '{"0":{"foo":{"name":"tag"}}}', SerializationContext::create()->setInitialType('array')], + [[$c3], '[{"foo":{"name":"tag"}}]', SerializationContext::create()->setInitialType('array')], + + [[$tag], '{"0":{"name":"tag"}}', SerializationContext::create()->setInitialType('array')], + ]; + } + + /** + * @dataProvider getTypeHintedArraysAndStdClass + * @param array $array + * @param string $expected + * @param SerializationContext|null $context + */ + public function testTypeHintedArrayAndStdClassSerialization(array $array, $expected, $context = null) + { + $this->assertEquals($expected, $this->serialize($array, $context)); + } + + protected function getFormat() + { + return 'json'; + } +} + +class LinkAddingSubscriber implements EventSubscriberInterface +{ + public function onPostSerialize(Event $event) + { + $author = $event->getObject(); + + $event->getVisitor()->addData('_links', array( + 'details' => 'http://foo.bar/details/'.$author->getName(), + 'comments' => 'http://foo.bar/details/'.$author->getName().'/comments', + )); + } + + public static function getSubscribedEvents() + { + return array( + array('event' => 'serializer.post_serialize', 'method' => 'onPostSerialize', 'format' => 'json', 'class' => 'JMS\Serializer\Tests\Fixtures\Author'), + ); + } +} + +class ReplaceNameSubscriber implements EventSubscriberInterface +{ + public function onPostSerialize(Event $event) + { + $event->getVisitor()->setData('full_name', 'new name'); + } + + public static function getSubscribedEvents() + { + return array( + array('event' => 'serializer.post_serialize', 'method' => 'onPostSerialize', 'format' => 'json', 'class' => 'JMS\Serializer\Tests\Fixtures\Author'), + ); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/Naming/IdenticalPropertyNamingStrategyTest.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/Naming/IdenticalPropertyNamingStrategyTest.php new file mode 100644 index 0000000000..b36cb315b1 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/Naming/IdenticalPropertyNamingStrategyTest.php @@ -0,0 +1,45 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Serializer\Naming; + +use JMS\Serializer\Naming\IdenticalPropertyNamingStrategy; + +class IdenticalPropertyNamingStrategyTest extends \PHPUnit_Framework_TestCase +{ + public function providePropertyNames() + { + return array( + array('createdAt'), + array('my_field'), + array('identical') + ); + } + + /** + * @dataProvider providePropertyNames + */ + public function testTranslateName($propertyName) + { + $mockProperty = $this->getMockBuilder('JMS\Serializer\Metadata\PropertyMetadata')->disableOriginalConstructor()->getMock(); + $mockProperty->name = $propertyName; + + $strategy = new IdenticalPropertyNamingStrategy(); + $this->assertEquals($propertyName, $strategy->translateName($mockProperty)); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/SerializationContextFactoryTest.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/SerializationContextFactoryTest.php new file mode 100644 index 0000000000..def0d0ec8f --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/SerializationContextFactoryTest.php @@ -0,0 +1,127 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Serializer; + +use JMS\Serializer\Handler\HandlerRegistry; +use PhpCollection\Map; +use JMS\Serializer\Naming\SerializedNameAnnotationStrategy; +use Metadata\MetadataFactory; +use JMS\Serializer\Metadata\Driver\AnnotationDriver; +use Doctrine\Common\Annotations\AnnotationReader; +use JMS\Serializer\Construction\UnserializeObjectConstructor; +use JMS\Serializer\JsonSerializationVisitor; +use JMS\Serializer\JsonDeserializationVisitor; +use JMS\Serializer\Serializer; +use JMS\Serializer\Naming\CamelCaseNamingStrategy; +use JMS\Serializer\SerializationContext; +use JMS\Serializer\DeserializationContext; + +class SerializationContextFactoryTest extends \PHPUnit_Framework_TestCase +{ + protected $serializer; + + public function setUp() + { + parent::setUp(); + + $namingStrategy = new SerializedNameAnnotationStrategy(new CamelCaseNamingStrategy()); + + $this->serializer = new Serializer( + new MetadataFactory(new AnnotationDriver(new AnnotationReader())), + new HandlerRegistry(), + new UnserializeObjectConstructor(), + new Map(array('json' => new JsonSerializationVisitor($namingStrategy))), + new Map(array('json' => new JsonDeserializationVisitor($namingStrategy))) + ); + } + + public function testSerializeUseProvidedSerializationContext() + { + $contextFactoryMock = $this->getMockForAbstractClass('JMS\\Serializer\\ContextFactory\\SerializationContextFactoryInterface'); + $context = new SerializationContext(); + $context->setSerializeNull(true); + + $contextFactoryMock + ->expects($this->once()) + ->method('createSerializationContext') + ->will($this->returnValue($context)) + ; + + $this->serializer->setSerializationContextFactory($contextFactoryMock); + + $result = $this->serializer->serialize(array('value' => null), 'json'); + + $this->assertEquals('{"value":null}', $result); + } + + public function testDeserializeUseProvidedDeserializationContext() + { + $contextFactoryMock = $this->getMockForAbstractClass('JMS\\Serializer\\ContextFactory\\DeserializationContextFactoryInterface'); + $context = new DeserializationContext(); + + $contextFactoryMock + ->expects($this->once()) + ->method('createDeserializationContext') + ->will($this->returnValue($context)) + ; + + $this->serializer->setDeserializationContextFactory($contextFactoryMock); + + $result = $this->serializer->deserialize('{"value":null}', 'array', 'json'); + + $this->assertEquals(array('value' => null), $result); + } + + public function testToArrayUseProvidedSerializationContext() + { + $contextFactoryMock = $this->getMockForAbstractClass('JMS\\Serializer\\ContextFactory\\SerializationContextFactoryInterface'); + $context = new SerializationContext(); + $context->setSerializeNull(true); + + $contextFactoryMock + ->expects($this->once()) + ->method('createSerializationContext') + ->will($this->returnValue($context)) + ; + + $this->serializer->setSerializationContextFactory($contextFactoryMock); + + $result = $this->serializer->toArray(array('value' => null)); + + $this->assertEquals(array('value' => null), $result); + } + + public function testFromArrayUseProvidedDeserializationContext() + { + $contextFactoryMock = $this->getMockForAbstractClass('JMS\\Serializer\\ContextFactory\\DeserializationContextFactoryInterface'); + $context = new DeserializationContext(); + + $contextFactoryMock + ->expects($this->once()) + ->method('createDeserializationContext') + ->will($this->returnValue($context)) + ; + + $this->serializer->setDeserializationContextFactory($contextFactoryMock); + + $result = $this->serializer->fromArray(array('value' => null), 'array'); + + $this->assertEquals(array('value' => null), $result); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/TypeParserTest.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/TypeParserTest.php new file mode 100644 index 0000000000..1572c25f62 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/TypeParserTest.php @@ -0,0 +1,99 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Serializer; + +use JMS\Serializer\TypeParser; + +class TypeParserTest extends \PHPUnit_Framework_TestCase +{ + private $parser; + + /** + * @dataProvider getTypes + */ + public function testParse($type, $name, array $params = array()) + { + $this->assertEquals(array('name' => $name, 'params' => $params), $this->parser->parse($type)); + } + + public function getTypes() + { + $types = array(); + $types[] = array('string', 'string'); + $types[] = array('array', 'array', array(array('name' => 'Foo', 'params' => array()))); + $types[] = array('array', 'array', array(array('name' => 'Foo', 'params' => array()), array('name' => 'Bar', 'params' => array()))); + $types[] = array('array', 'array', array(array('name' => 'Foo\Bar', 'params' => array()), array('name' => 'Baz\Boo', 'params' => array()))); + $types[] = array('a,e>', 'a', array(array('name' => 'b', 'params' => array(array('name' => 'c', 'params' => array()), array('name' => 'd', 'params' => array()))), array('name' => 'e', 'params' => array()))); + $types[] = array('Foo', 'Foo'); + $types[] = array('Foo\Bar', 'Foo\Bar'); + $types[] = array('Foo<"asdf asdf">', 'Foo', array('asdf asdf')); + + return $types; + } + + /** + * @expectedException \JMS\Parser\SyntaxErrorException + * @expectedExceptionMessage Expected T_CLOSE_BRACKET, but got end of input. + */ + public function testParamTypeMustEndWithBracket() + { + $this->parser->parse('Fooparser->parse(','); + } + + /** + * @expectedException \JMS\Parser\SyntaxErrorException + * @expectedExceptionMessage Expected any of T_NAME or T_STRING, but got ">" of type T_CLOSE_BRACKET at position 4 (0-based). + */ + public function testEmptyParams() + { + $this->parser->parse('Foo<>'); + } + + /** + * @expectedException \JMS\Parser\SyntaxErrorException + * @expectedExceptionMessage Expected any of T_NAME or T_STRING, but got ">" of type T_CLOSE_BRACKET at position 7 (0-based). + */ + public function testNoTrailingComma() + { + $this->parser->parse('Foo'); + } + + /** + * @expectedException \JMS\Parser\SyntaxErrorException + * @expectedExceptionMessage Expected any of T_NAME or T_STRING, but got "\" of type T_NONE at position 4 (0-based). + */ + public function testLeadingBackslash() + { + $this->parser->parse('Foo<\Bar>'); + } + + protected function setUp() + { + $this->parser = new TypeParser(); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/XmlSerializationTest.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/XmlSerializationTest.php new file mode 100644 index 0000000000..d9b7ada64d --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/XmlSerializationTest.php @@ -0,0 +1,513 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Serializer; + +use JMS\Serializer\Construction\UnserializeObjectConstructor; +use JMS\Serializer\Context; +use JMS\Serializer\GraphNavigator; +use JMS\Serializer\Handler\DateHandler; +use JMS\Serializer\Handler\HandlerRegistry; +use JMS\Serializer\Naming\CamelCaseNamingStrategy; +use JMS\Serializer\Naming\SerializedNameAnnotationStrategy; +use JMS\Serializer\Metadata\StaticPropertyMetadata; +use JMS\Serializer\SerializationContext; +use JMS\Serializer\Serializer; +use JMS\Serializer\Tests\Fixtures\Discriminator\ObjectWithXmlAttributeDiscriminatorParent; +use JMS\Serializer\Tests\Fixtures\Discriminator\ObjectWithXmlNamespaceDiscriminatorChild; +use JMS\Serializer\Tests\Fixtures\Discriminator\ObjectWithXmlNamespaceDiscriminatorParent; +use JMS\Serializer\Tests\Fixtures\Discriminator\ObjectWithXmlNotCDataDiscriminatorChild; +use JMS\Serializer\Tests\Fixtures\Discriminator\ObjectWithXmlNotCDataDiscriminatorParent; +use JMS\Serializer\Tests\Fixtures\InvalidUsageOfXmlValue; +use JMS\Serializer\Exception\InvalidArgumentException; +use JMS\Serializer\Tests\Fixtures\ObjectWithToString; +use JMS\Serializer\Tests\Fixtures\ObjectWithXmlNamespacesAndObjectProperty; +use JMS\Serializer\Tests\Fixtures\ObjectWithXmlNamespacesAndObjectPropertyAuthor; +use JMS\Serializer\Tests\Fixtures\ObjectWithXmlNamespacesAndObjectPropertyVirtual; +use JMS\Serializer\Tests\Fixtures\PersonCollection; +use JMS\Serializer\Tests\Fixtures\PersonLocation; +use JMS\Serializer\Tests\Fixtures\Person; +use JMS\Serializer\Tests\Fixtures\ObjectWithVirtualXmlProperties; +use JMS\Serializer\Tests\Fixtures\ObjectWithXmlKeyValuePairs; +use JMS\Serializer\Tests\Fixtures\ObjectWithXmlNamespaces; +use JMS\Serializer\Tests\Fixtures\ObjectWithXmlRootNamespace; +use JMS\Serializer\Tests\Fixtures\Input; +use JMS\Serializer\Tests\Fixtures\SimpleClassObject; +use JMS\Serializer\Tests\Fixtures\SimpleObject; +use JMS\Serializer\Tests\Fixtures\SimpleSubClassObject; +use JMS\Serializer\Tests\Fixtures\ObjectWithNamespacesAndList; +use JMS\Serializer\XmlSerializationVisitor; +use PhpCollection\Map; +use JMS\Serializer\Tests\Fixtures\Discriminator\ObjectWithXmlAttributeDiscriminatorChild; + +class XmlSerializationTest extends BaseSerializationTest +{ + /** + * @expectedException JMS\Serializer\Exception\RuntimeException + */ + public function testInvalidUsageOfXmlValue() + { + $obj = new InvalidUsageOfXmlValue(); + $this->serialize($obj); + } + + + /** + * @dataProvider getXMLBooleans + */ + public function testXMLBooleans($xmlBoolean, $boolean) + { + if ($this->hasDeserializer()) { + $this->assertSame($boolean, $this->deserialize(''.$xmlBoolean.'', 'boolean')); + } + } + + public function getXMLBooleans() + { + return array(array('true', true), array('false', false), array('1', true), array('0', false)); + } + + public function testAccessorSetterDeserialization() + { + /** @var \JMS\Serializer\Tests\Fixtures\AccessorSetter $object */ + $object = $this->deserialize(' + + element + + collectionEntry + + ', + 'JMS\Serializer\Tests\Fixtures\AccessorSetter' + ); + + $this->assertInstanceOf('stdClass', $object->getElement()); + $this->assertInstanceOf('JMS\Serializer\Tests\Fixtures\AccessorSetterElement', $object->getElement()->element); + $this->assertEquals('attribute-different', $object->getElement()->element->getAttribute()); + $this->assertEquals('element-different', $object->getElement()->element->getElement()); + $this->assertEquals(['collectionEntry' => 'collectionEntry'], $object->getCollection()); + } + + public function testPropertyIsObjectWithAttributeAndValue() + { + $personCollection = new PersonLocation; + $person = new Person; + $person->name = 'Matthias Noback'; + $person->age = 28; + $personCollection->person = $person; + $personCollection->location = 'The Netherlands'; + + $this->assertEquals($this->getContent('person_location'), $this->serialize($personCollection)); + } + + public function testPropertyIsCollectionOfObjectsWithAttributeAndValue() + { + $personCollection = new PersonCollection; + $person = new Person; + $person->name = 'Matthias Noback'; + $person->age = 28; + $personCollection->persons->add($person); + $personCollection->location = 'The Netherlands'; + + $this->assertEquals($this->getContent('person_collection'), $this->serialize($personCollection)); + } + + /** + * @expectedException JMS\Serializer\Exception\InvalidArgumentException + * @expectedExceptionMessage The document type "]>" is not allowed. If it is safe, you may add it to the whitelist configuration. + */ + public function testExternalEntitiesAreDisabledByDefault() + { + $this->deserialize(' + + ]> + + &foo; + ', 'stdClass'); + } + + /** + * @expectedException JMS\Serializer\Exception\InvalidArgumentException + * @expectedExceptionMessage The document type "" is not allowed. If it is safe, you may add it to the whitelist configuration. + */ + public function testDocumentTypesAreNotAllowed() + { + $this->deserialize('', 'stdClass'); + } + + public function testWhitelistedDocumentTypesAreAllowed() + { + $this->deserializationVisitors->get('xml')->get()->setDoctypeWhitelist(array( + '', + ']>')); + + $this->serializer->deserialize(' + + ', 'stdClass', 'xml'); + + $this->serializer->deserialize(' + + ]> + ', 'stdClass', 'xml'); + } + + public function testVirtualAttributes() + { + $this->assertEquals( + $this->getContent('virtual_attributes'), + $this->serialize(new ObjectWithVirtualXmlProperties(), SerializationContext::create()->setGroups(array('attributes'))) + ); + } + + public function testVirtualValues() + { + $this->assertEquals( + $this->getContent('virtual_values'), + $this->serialize(new ObjectWithVirtualXmlProperties(), SerializationContext::create()->setGroups(array('values'))) + ); + } + + public function testVirtualXmlList() + { + $this->assertEquals( + $this->getContent('virtual_properties_list'), + $this->serialize(new ObjectWithVirtualXmlProperties(), SerializationContext::create()->setGroups(array('list'))) + ); + } + + public function testVirtualXmlMap() + { + $this->assertEquals( + $this->getContent('virtual_properties_map'), + $this->serialize(new ObjectWithVirtualXmlProperties(), SerializationContext::create()->setGroups(array('map'))) + ); + } + + public function testUnserializeMissingArray() + { + $xml = ''; + $object = $this->serializer->deserialize($xml, 'JMS\Serializer\Tests\Fixtures\ObjectWithAbsentXmlListNode', 'xml'); + $this->assertEquals($object->absentAndNs, array()); + + $xml = ' + + foo + + '; + $object = $this->serializer->deserialize($xml, 'JMS\Serializer\Tests\Fixtures\ObjectWithAbsentXmlListNode', 'xml'); + $this->assertEquals($object->absentAndNs, array("foo")); + } + + public function testObjectWithNamespacesAndList() + { + $object = new ObjectWithNamespacesAndList(); + $object->name = 'name'; + $object->nameAlternativeB = 'nameB'; + + $object->phones = array('111', '222'); + $object->addresses = array('A'=>'Street 1', 'B'=>'Street 2'); + + $object->phonesAlternativeB = array('555', '666'); + $object->addressesAlternativeB = array('A'=>'Street 5', 'B'=>'Street 6'); + + $object->phonesAlternativeC = array('777', '888'); + $object->addressesAlternativeC = array('A'=>'Street 7', 'B'=>'Street 8'); + + $object->phonesAlternativeD = array('999', 'AAA'); + $object->addressesAlternativeD = array('A'=>'Street 9', 'B'=>'Street A'); + + $this->assertEquals( + $this->getContent('object_with_namespaces_and_list'), + $this->serialize($object, SerializationContext::create()) + ); + $this->assertEquals( + $object, + $this->deserialize($this->getContent('object_with_namespaces_and_list'), get_class($object)) + ); + } + + public function testArrayKeyValues() + { + $this->assertEquals($this->getContent('array_key_values'), $this->serializer->serialize(new ObjectWithXmlKeyValuePairs(), 'xml')); + } + + /** + * @dataProvider getDateTime + * @group datetime + */ + public function testDateTimeNoCData($key, $value, $type) + { + $handlerRegistry = new HandlerRegistry(); + $handlerRegistry->registerSubscribingHandler(new DateHandler(\DateTime::ISO8601, 'UTC', false)); + $objectConstructor = new UnserializeObjectConstructor(); + + $serializer = new Serializer($this->factory, $handlerRegistry, $objectConstructor, $this->serializationVisitors, $this->deserializationVisitors); + + $this->assertEquals($this->getContent($key . '_no_cdata'), $serializer->serialize($value, $this->getFormat())); + } + + /** + * @dataProvider getDateTimeImmutable + * @group datetime + */ + public function testDateTimeImmutableNoCData($key, $value, $type) + { + $handlerRegistry = new HandlerRegistry(); + $handlerRegistry->registerSubscribingHandler(new DateHandler(\DateTime::ISO8601, 'UTC', false)); + $objectConstructor = new UnserializeObjectConstructor(); + + $serializer = new Serializer($this->factory, $handlerRegistry, $objectConstructor, $this->serializationVisitors, $this->deserializationVisitors); + + $this->assertEquals($this->getContent($key . '_no_cdata'), $serializer->serialize($value, $this->getFormat())); + } + + /** + * @expectedException JMS\Serializer\Exception\RuntimeException + * @expectedExceptionMessage Unsupported value type for XML attribute map. Expected array but got object + */ + public function testXmlAttributeMapWithoutArray() + { + $attributes = new \ArrayObject(array( + 'type' => 'text', + )); + + $this->serializer->serialize(new Input($attributes), $this->getFormat()); + } + + public function testObjectWithOnlyNamespacesAndList() + { + $object = new ObjectWithNamespacesAndList(); + + $object->phones = array(); + $object->addresses = array(); + + $object->phonesAlternativeB = array(); + $object->addressesAlternativeB = array(); + + $object->phonesAlternativeC = array('777', '888'); + $object->addressesAlternativeC = array('A'=>'Street 7', 'B'=>'Street 8'); + + $object->phonesAlternativeD = array(); + $object->addressesAlternativeD = array(); + + $this->assertEquals( + $this->getContent('object_with_only_namespaces_and_list'), + $this->serialize($object, SerializationContext::create()) + ); + + $deserialized = $this->deserialize($this->getContent('object_with_only_namespaces_and_list'), get_class($object)); + $this->assertEquals($object, $deserialized); + } + + public function testDeserializingNull() + { + $this->markTestSkipped('Not supported in XML.'); + } + + public function testDeserializeWithObjectWithToStringMethod() + { + $input = new ObjectWithToString($this->getContent('simple_object')); + + $object = $this->deserialize($input, SimpleObject::class); + + $this->assertInstanceOf(SimpleObject::class, $object); + } + + public function testObjectWithXmlNamespaces() + { + $object = new ObjectWithXmlNamespaces('This is a nice title.', 'Foo Bar', new \DateTime('2011-07-30 00:00', new \DateTimeZone('UTC')), 'en'); + + $serialized = $this->serialize($object); + $this->assertEquals($this->getContent('object_with_xml_namespaces'), $this->serialize($object)); + + $xml = simplexml_load_string($this->serialize($object)); + $xml->registerXPathNamespace('ns1', "http://purl.org/dc/elements/1.1/"); + $xml->registerXPathNamespace('ns2', "http://schemas.google.com/g/2005"); + $xml->registerXPathNamespace('ns3', "http://www.w3.org/2005/Atom"); + + $this->assertEquals('2011-07-30T00:00:00+0000', $this->xpathFirstToString($xml, './@created_at')); + $this->assertEquals('1edf9bf60a32d89afbb85b2be849e3ceed5f5b10', $this->xpathFirstToString($xml, './@ns2:etag')); + $this->assertEquals('en', $this->xpathFirstToString($xml, './@ns1:language')); + $this->assertEquals('This is a nice title.', $this->xpathFirstToString($xml, './ns1:title')); + $this->assertEquals('Foo Bar', $this->xpathFirstToString($xml, './ns3:author')); + + $deserialized = $this->deserialize($this->getContent('object_with_xml_namespacesalias'), get_class($object)); + $this->assertEquals('2011-07-30T00:00:00+0000', $this->getField($deserialized, 'createdAt')->format(\DateTime::ISO8601)); + $this->assertAttributeEquals('This is a nice title.', 'title', $deserialized); + $this->assertAttributeSame('1edf9bf60a32d89afbb85b2be849e3ceed5f5b10', 'etag', $deserialized); + $this->assertAttributeSame('en', 'language', $deserialized); + $this->assertAttributeEquals('Foo Bar', 'author', $deserialized); + + } + + public function testObjectWithXmlNamespacesAndBackReferencedNamespaces() + { + $author = new ObjectWithXmlNamespacesAndObjectPropertyAuthor('mr', 'smith'); + $object = new ObjectWithXmlNamespacesAndObjectProperty('This is a nice title.', $author); + + $serialized = $this->serialize($object); + $this->assertEquals($this->getContent('object_with_xml_namespaces_and_object_property'), $serialized); + } + + public function testObjectWithXmlNamespacesAndBackReferencedNamespacesWithListeners() + { + $author = new ObjectWithXmlNamespacesAndObjectPropertyAuthor('mr', 'smith'); + $object = new ObjectWithXmlNamespacesAndObjectPropertyVirtual('This is a nice title.', new \stdClass()); + + $this->handlerRegistry->registerHandler(GraphNavigator::DIRECTION_SERIALIZATION, 'ObjectWithXmlNamespacesAndObjectPropertyAuthorVirtual', $this->getFormat(), + function(XmlSerializationVisitor $visitor, $data, $type, Context $context) use($author) { + $factory = $context->getMetadataFactory(get_class($author)); + $classMetadata = $factory->getMetadataForClass(get_class($author)); + + $metadata = new StaticPropertyMetadata(get_class($author), 'foo', $author); + $metadata->xmlNamespace = $classMetadata->xmlRootNamespace; + $metadata->xmlNamespace = $classMetadata->xmlRootNamespace; + + $visitor->visitProperty($metadata, $author, $context); + } + ); + + $serialized = $this->serialize($object); + $this->assertEquals($this->getContent('object_with_xml_namespaces_and_object_property_virtual'), $serialized); + } + + public function testObjectWithXmlRootNamespace() + { + $object = new ObjectWithXmlRootNamespace('This is a nice title.', 'Foo Bar', new \DateTime('2011-07-30 00:00', new \DateTimeZone('UTC')), 'en'); + $this->assertEquals($this->getContent('object_with_xml_root_namespace'), $this->serialize($object)); + } + + public function testXmlNamespacesInheritance() + { + $object = new SimpleClassObject(); + $object->foo = 'foo'; + $object->bar = 'bar'; + $object->moo = 'moo'; + + $this->assertEquals($this->getContent('simple_class_object'), $this->serialize($object)); + + $childObject = new SimpleSubClassObject(); + $childObject->foo = 'foo'; + $childObject->bar = 'bar'; + $childObject->moo = 'moo'; + $childObject->baz = 'baz'; + $childObject->qux = 'qux'; + + $this->assertEquals($this->getContent('simple_subclass_object'), $this->serialize($childObject)); + } + + public function testWithoutFormatedOutputByXmlSerializationVisitor() + { + $namingStrategy = new SerializedNameAnnotationStrategy(new CamelCaseNamingStrategy()); + $xmlVisitor = new XmlSerializationVisitor($namingStrategy); + $xmlVisitor->setFormatOutput(false); + + $visitors = new Map(array( + 'xml' => new XmlSerializationVisitor($namingStrategy), + )); + + $serializer = new Serializer( + $this->factory, + $this->handlerRegistry, + new UnserializeObjectConstructor(), + $visitors, + $this->deserializationVisitors, + $this->dispatcher + ); + + $object = new SimpleClassObject; + $object->foo = 'foo'; + $object->bar = 'bar'; + $object->moo = 'moo'; + + $stringXml = $serializer->serialize($object, $this->getFormat()); + $this->assertXmlStringEqualsXmlString($this->getContent('simple_class_object_minified'), $stringXml); + } + + public function testDiscriminatorAsXmlAttribute() + { + $xml = $this->serialize(new ObjectWithXmlAttributeDiscriminatorChild()); + $this->assertEquals($this->getContent('xml_discriminator_attribute'), $xml); + $this->assertInstanceOf( + ObjectWithXmlAttributeDiscriminatorChild::class, + $this->deserialize( + $xml, + ObjectWithXmlAttributeDiscriminatorParent::class + ) + ); + } + + public function testDiscriminatorAsNotCData() + { + $xml = $this->serialize(new ObjectWithXmlNotCDataDiscriminatorChild()); + $this->assertEquals($this->getContent('xml_discriminator_not_cdata'), $xml); + $this->assertInstanceOf( + ObjectWithXmlNotCDataDiscriminatorChild::class, + $this->deserialize( + $xml, + ObjectWithXmlNotCDataDiscriminatorParent::class + ) + ); + } + + public function testDiscriminatorWithNamespace() + { + $xml = $this->serialize(new ObjectWithXmlNamespaceDiscriminatorChild()); + $this->assertEquals($this->getContent('xml_discriminator_namespace'), $xml); + + $this->assertInstanceOf( + ObjectWithXmlNamespaceDiscriminatorChild::class, + $this->deserialize( + $xml, + ObjectWithXmlNamespaceDiscriminatorParent::class + ) + ); + } + + /** + * @expectedException \JMS\Serializer\Exception\XmlErrorException + */ + public function testDeserializeEmptyString() + { + $this->deserialize('', 'stdClass'); + } + + private function xpathFirstToString(\SimpleXMLElement $xml, $xpath) + { + $nodes = $xml->xpath($xpath); + return (string) reset($nodes); + } + + /** + * @param string $key + */ + protected function getContent($key) + { + if (!file_exists($file = __DIR__.'/xml/'.$key.'.xml')) { + throw new InvalidArgumentException(sprintf('The key "%s" is not supported.', $key)); + } + + return file_get_contents($file); + } + + protected function getFormat() + { + return 'xml'; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/YamlSerializationTest.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/YamlSerializationTest.php new file mode 100644 index 0000000000..5ba31b1324 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/YamlSerializationTest.php @@ -0,0 +1,124 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Serializer; + +use JMS\Serializer\Exception\RuntimeException; +use JMS\Serializer\SerializationContext; + +class YamlSerializationTest extends BaseSerializationTest +{ + public function testEmptyChild() + { + $this->markTestSkipped('This is not available for the YAML format.'); + } + + public function testSkipEmptyChild() + { + $this->markTestSkipped('This is not available for the YAML format.'); + } + + public function testConstraintViolation() + { + $this->markTestSkipped('This is not available for the YAML format.'); + } + + public function testConstraintViolationList() + { + $this->markTestSkipped('This is not available for the YAML format.'); + } + + public function testFormErrors() + { + $this->markTestSkipped('This is not available for the YAML format.'); + } + + public function testNestedFormErrors() + { + $this->markTestSkipped('This is not available for the YAML format.'); + } + + public function testFormErrorsWithNonFormComponents() + { + $this->markTestSkipped('This is not available for the YAML format.'); + } + + protected function getContent($key) + { + if (!file_exists($file = __DIR__.'/yml/'.$key.'.yml')) { + throw new RuntimeException(sprintf('The content with key "%s" does not exist.', $key)); + } + + return file_get_contents($file); + } + + public function getTypeHintedArrays() + { + return [ + + [[1, 2], "- 1\n- 2\n", null], + [['a', 'b'], "- a\n- b\n", null], + [['a' => 'a', 'b' => 'b'], "a: a\nb: b\n", null], + + [[], " []\n", null], + [[], " []\n", SerializationContext::create()->setInitialType('array')], + [[], " []\n", SerializationContext::create()->setInitialType('array')], + [[], " {}\n", SerializationContext::create()->setInitialType('array')], + + + [[1, 2], "- 1\n- 2\n", SerializationContext::create()->setInitialType('array')], + [[1 => 1, 2 => 2], "1: 1\n2: 2\n", SerializationContext::create()->setInitialType('array')], + [[1 => 1, 2 => 2], "- 1\n- 2\n", SerializationContext::create()->setInitialType('array')], + [['a', 'b'], "- a\n- b\n", SerializationContext::create()->setInitialType('array')], + + [[1 => 'a', 2 => 'b'], "- a\n- b\n", SerializationContext::create()->setInitialType('array')], + [['a' => 'a', 'b' => 'b'], "- a\n- b\n", SerializationContext::create()->setInitialType('array')], + + + [[1,2], "0: 1\n1: 2\n", SerializationContext::create()->setInitialType('array')], + [[1,2], "0: 1\n1: 2\n", SerializationContext::create()->setInitialType('array')], + [[1,2], "0: 1\n1: 2\n", SerializationContext::create()->setInitialType('array')], + + + [['a', 'b'], "0: a\n1: b\n", SerializationContext::create()->setInitialType('array')], + [['a' => 'a', 'b' => 'b'], "a: a\nb: b\n", SerializationContext::create()->setInitialType('array')], + ]; + } + + /** + * @dataProvider getTypeHintedArrays + * @param array $array + * @param string $expected + * @param SerializationContext|null $context + */ + public function testTypeHintedArraySerialization(array $array, $expected, $context = null) + { + $this->assertEquals($expected, $this->serialize($array, $context)); + } + + + protected function getFormat() + { + return 'yml'; + } + + protected function hasDeserializer() + { + return false; + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/accessor_order_child.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/accessor_order_child.xml new file mode 100644 index 0000000000..1dc3df941f --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/accessor_order_child.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/accessor_order_methods.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/accessor_order_methods.xml new file mode 100644 index 0000000000..0818c57351 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/accessor_order_methods.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/accessor_order_parent.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/accessor_order_parent.xml new file mode 100644 index 0000000000..1fe55f54f4 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/accessor_order_parent.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/array_booleans.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/array_booleans.xml new file mode 100644 index 0000000000..2bce4199a7 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/array_booleans.xml @@ -0,0 +1,5 @@ + + + true + false + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/array_datetimes_object.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/array_datetimes_object.xml new file mode 100644 index 0000000000..648ccbbf3b --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/array_datetimes_object.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/array_floats.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/array_floats.xml new file mode 100644 index 0000000000..8a111662eb --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/array_floats.xml @@ -0,0 +1,6 @@ + + + 1.34 + 3 + 6.42 + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/array_integers.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/array_integers.xml new file mode 100644 index 0000000000..9a9ca15c54 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/array_integers.xml @@ -0,0 +1,6 @@ + + + 1 + 3 + 4 + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/array_key_values.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/array_key_values.xml new file mode 100644 index 0000000000..91fdfb1553 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/array_key_values.xml @@ -0,0 +1,20 @@ + + + + + 1 + + + + + 1 + + + + + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/array_list_and_map_difference.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/array_list_and_map_difference.xml new file mode 100644 index 0000000000..557b0ad0ab --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/array_list_and_map_difference.xml @@ -0,0 +1,13 @@ + + + + 1 + 2 + 3 + + + 1 + 2 + 3 + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/array_mixed.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/array_mixed.xml new file mode 100644 index 0000000000..0a4ffa3269 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/array_mixed.xml @@ -0,0 +1,16 @@ + + + + 1 + true + + + + + + + 1 + 3 + true + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/array_named_datetimeimmutables_object.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/array_named_datetimeimmutables_object.xml new file mode 100644 index 0000000000..40c13c06f1 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/array_named_datetimeimmutables_object.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/array_named_datetimes_object.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/array_named_datetimes_object.xml new file mode 100644 index 0000000000..40c13c06f1 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/array_named_datetimes_object.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/array_objects.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/array_objects.xml new file mode 100644 index 0000000000..ffaf5a9b82 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/array_objects.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/array_strings.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/array_strings.xml new file mode 100644 index 0000000000..d51496aa7b --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/array_strings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/article.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/article.xml new file mode 100644 index 0000000000..a769bc02a5 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/article.xml @@ -0,0 +1,2 @@ + +serialized diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/author_expression.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/author_expression.xml new file mode 100644 index 0000000000..73068ceedc --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/author_expression.xml @@ -0,0 +1,6 @@ + + + + + 123 + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/blog_post.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/blog_post.xml new file mode 100644 index 0000000000..0efe2865c6 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/blog_post.xml @@ -0,0 +1,32 @@ + + + what_a_nice_id + + + + + + + + + + + + + + + + + + + + + + + + tag1 + + + tag2 + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/blog_post_unauthored.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/blog_post_unauthored.xml new file mode 100644 index 0000000000..5b5ba2b437 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/blog_post_unauthored.xml @@ -0,0 +1,5 @@ + + + <![CDATA[This is a nice title.]]> + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/boolean_false.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/boolean_false.xml new file mode 100644 index 0000000000..4eaf3156cc --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/boolean_false.xml @@ -0,0 +1,2 @@ + +false diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/boolean_true.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/boolean_true.xml new file mode 100644 index 0000000000..15bf5c438a --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/boolean_true.xml @@ -0,0 +1,2 @@ + +true diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/car.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/car.xml new file mode 100644 index 0000000000..de04116446 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/car.xml @@ -0,0 +1,5 @@ + + + 5 + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/car_without_type.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/car_without_type.xml new file mode 100644 index 0000000000..6ff670bdf8 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/car_without_type.xml @@ -0,0 +1,4 @@ + + + 5 + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/circular_reference.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/circular_reference.xml new file mode 100644 index 0000000000..8507eb4c81 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/circular_reference.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/constraint_violation.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/constraint_violation.xml new file mode 100644 index 0000000000..080578682d --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/constraint_violation.xml @@ -0,0 +1,4 @@ + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/constraint_violation_list.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/constraint_violation_list.xml new file mode 100644 index 0000000000..a5715a4139 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/constraint_violation_list.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/currency_aware_price.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/currency_aware_price.xml new file mode 100644 index 0000000000..e97a7561ea --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/currency_aware_price.xml @@ -0,0 +1,2 @@ + +2.34 diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/custom_accessor.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/custom_accessor.xml new file mode 100644 index 0000000000..614196d734 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/custom_accessor.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/date_interval.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/date_interval.xml new file mode 100644 index 0000000000..a564b6cfac --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/date_interval.xml @@ -0,0 +1,2 @@ + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/date_time.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/date_time.xml new file mode 100644 index 0000000000..00156d4617 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/date_time.xml @@ -0,0 +1,2 @@ + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/date_time_immutable.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/date_time_immutable.xml new file mode 100644 index 0000000000..00156d4617 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/date_time_immutable.xml @@ -0,0 +1,2 @@ + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/date_time_immutable_no_cdata.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/date_time_immutable_no_cdata.xml new file mode 100644 index 0000000000..b9c36c25a9 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/date_time_immutable_no_cdata.xml @@ -0,0 +1,2 @@ + +2011-08-30T00:00:00+0000 diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/date_time_no_cdata.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/date_time_no_cdata.xml new file mode 100644 index 0000000000..b9c36c25a9 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/date_time_no_cdata.xml @@ -0,0 +1,2 @@ + +2011-08-30T00:00:00+0000 diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/empty_child.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/empty_child.xml new file mode 100644 index 0000000000..c782346b6a --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/empty_child.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/empty_child_skip.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/empty_child_skip.xml new file mode 100644 index 0000000000..4ec8b62504 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/empty_child_skip.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/float.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/float.xml new file mode 100644 index 0000000000..70e02f42c9 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/float.xml @@ -0,0 +1,2 @@ + +4.533 diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/float_trailing_zero.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/float_trailing_zero.xml new file mode 100644 index 0000000000..5b5b635ea9 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/float_trailing_zero.xml @@ -0,0 +1,2 @@ + +1 diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/form_errors.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/form_errors.xml new file mode 100644 index 0000000000..78c8071e56 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/form_errors.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/garage.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/garage.xml new file mode 100644 index 0000000000..25f486ddff --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/garage.xml @@ -0,0 +1,13 @@ + + + + + 3 + + + + 1 + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/groups_advanced.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/groups_advanced.xml new file mode 100644 index 0000000000..d37c7d1401 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/groups_advanced.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/groups_all.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/groups_all.xml new file mode 100644 index 0000000000..4d8c74f3fe --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/groups_all.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/groups_default.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/groups_default.xml new file mode 100644 index 0000000000..2ec803abb9 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/groups_default.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/groups_foo.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/groups_foo.xml new file mode 100644 index 0000000000..93b4a0d097 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/groups_foo.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/groups_foobar.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/groups_foobar.xml new file mode 100644 index 0000000000..d922cb67c3 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/groups_foobar.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/hash_empty.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/hash_empty.xml new file mode 100644 index 0000000000..0ea94e970f --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/hash_empty.xml @@ -0,0 +1,4 @@ + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/inline.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/inline.xml new file mode 100644 index 0000000000..bccba876de --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/inline.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/inline_child_empty.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/inline_child_empty.xml new file mode 100644 index 0000000000..4ec8b62504 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/inline_child_empty.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/input.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/input.xml new file mode 100644 index 0000000000..3c3f7313d9 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/input.xml @@ -0,0 +1,2 @@ + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/integer.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/integer.xml new file mode 100644 index 0000000000..5b5b635ea9 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/integer.xml @@ -0,0 +1,2 @@ + +1 diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/lifecycle_callbacks.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/lifecycle_callbacks.xml new file mode 100644 index 0000000000..fe0501f532 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/lifecycle_callbacks.xml @@ -0,0 +1,4 @@ + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/log.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/log.xml new file mode 100644 index 0000000000..f4de81411f --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/log.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/maxdepth_skippabe_object.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/maxdepth_skippabe_object.xml new file mode 100644 index 0000000000..8d455af3e0 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/maxdepth_skippabe_object.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/mixed_access_types.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/mixed_access_types.xml new file mode 100644 index 0000000000..0badb579db --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/mixed_access_types.xml @@ -0,0 +1,6 @@ + + + 1 + + 42 + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/nested_form_errors.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/nested_form_errors.xml new file mode 100644 index 0000000000..75b467df7e --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/nested_form_errors.xml @@ -0,0 +1,11 @@ + +
+ + + + + + + +
+ diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/null.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/null.xml new file mode 100644 index 0000000000..36766ecd62 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/null.xml @@ -0,0 +1,2 @@ + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/nullable.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/nullable.xml new file mode 100644 index 0000000000..edc0833d59 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/nullable.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/nullable_arrays.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/nullable_arrays.xml new file mode 100644 index 0000000000..d8c16852b6 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/nullable_arrays.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/nullable_skip.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/nullable_skip.xml new file mode 100644 index 0000000000..8534731abb --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/nullable_skip.xml @@ -0,0 +1,4 @@ + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/object_when_null.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/object_when_null.xml new file mode 100644 index 0000000000..3132213433 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/object_when_null.xml @@ -0,0 +1,4 @@ + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/object_when_null_and_serialized.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/object_when_null_and_serialized.xml new file mode 100644 index 0000000000..bd83a5ce8a --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/object_when_null_and_serialized.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/object_with_namespaces_and_list.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/object_with_namespaces_and_list.xml new file mode 100644 index 0000000000..a3022bbd78 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/object_with_namespaces_and_list.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + +
+
+ + + + + + + + + +
+
+
+
diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/object_with_only_namespaces_and_list.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/object_with_only_namespaces_and_list.xml new file mode 100644 index 0000000000..0c0242e9b0 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/object_with_only_namespaces_and_list.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/object_with_xml_namespaces.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/object_with_xml_namespaces.xml new file mode 100644 index 0000000000..6ff33d9c69 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/object_with_xml_namespaces.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/object_with_xml_namespaces_and_object_property.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/object_with_xml_namespaces_and_object_property.xml new file mode 100644 index 0000000000..a6eb8057f4 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/object_with_xml_namespaces_and_object_property.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/object_with_xml_namespaces_and_object_property_virtual.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/object_with_xml_namespaces_and_object_property_virtual.xml new file mode 100644 index 0000000000..b1dadc1fe2 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/object_with_xml_namespaces_and_object_property_virtual.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/object_with_xml_namespacesalias.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/object_with_xml_namespacesalias.xml new file mode 100644 index 0000000000..63a8c74e17 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/object_with_xml_namespacesalias.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/object_with_xml_root_namespace.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/object_with_xml_root_namespace.xml new file mode 100644 index 0000000000..9d5cde47f8 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/object_with_xml_root_namespace.xml @@ -0,0 +1,5 @@ + + + <![CDATA[This is a nice title.]]> + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/order.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/order.xml new file mode 100644 index 0000000000..ca7c70b28a --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/order.xml @@ -0,0 +1,4 @@ + + + 12.34 + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/order_with_currency_aware_price.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/order_with_currency_aware_price.xml new file mode 100644 index 0000000000..3ab583f2c5 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/order_with_currency_aware_price.xml @@ -0,0 +1,4 @@ + + + 1.23 + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/orm_proxy.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/orm_proxy.xml new file mode 100644 index 0000000000..ecd8c13810 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/orm_proxy.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/person_collection.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/person_collection.xml new file mode 100644 index 0000000000..37654cc20e --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/person_collection.xml @@ -0,0 +1,5 @@ + + + Matthias Noback + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/person_location.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/person_location.xml new file mode 100644 index 0000000000..fa2aa87a6b --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/person_location.xml @@ -0,0 +1,5 @@ + + + Matthias Noback + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/person_secret_hide.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/person_secret_hide.xml new file mode 100644 index 0000000000..adf0737ac0 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/person_secret_hide.xml @@ -0,0 +1,4 @@ + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/person_secret_show.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/person_secret_show.xml new file mode 100644 index 0000000000..46fe167f8b --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/person_secret_show.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/price.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/price.xml new file mode 100644 index 0000000000..2ee2959d23 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/price.xml @@ -0,0 +1,2 @@ + +3 diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/readonly.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/readonly.xml new file mode 100644 index 0000000000..1c3ea3b3b5 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/readonly.xml @@ -0,0 +1,5 @@ + + + 123 + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/simple_class_object.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/simple_class_object.xml new file mode 100644 index 0000000000..d58fc7078b --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/simple_class_object.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/simple_class_object_minified.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/simple_class_object_minified.xml new file mode 100644 index 0000000000..ff4fbf5950 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/simple_class_object_minified.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/simple_object.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/simple_object.xml new file mode 100644 index 0000000000..84568d016e --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/simple_object.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/simple_object_nullable.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/simple_object_nullable.xml new file mode 100644 index 0000000000..32f07c22d4 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/simple_object_nullable.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/simple_subclass_object.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/simple_subclass_object.xml new file mode 100644 index 0000000000..6c0ff7db35 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/simple_subclass_object.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/string.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/string.xml new file mode 100644 index 0000000000..b18254042b --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/string.xml @@ -0,0 +1,2 @@ + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/timestamp.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/timestamp.xml new file mode 100644 index 0000000000..a9bf077fac --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/timestamp.xml @@ -0,0 +1,4 @@ + + + 1455148800 + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/timestamp_prev.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/timestamp_prev.xml new file mode 100644 index 0000000000..a9bf077fac --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/timestamp_prev.xml @@ -0,0 +1,4 @@ + + + 1455148800 + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/tree.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/tree.xml new file mode 100644 index 0000000000..5388f3dea8 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/tree.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/virtual_attributes.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/virtual_attributes.xml new file mode 100644 index 0000000000..072401318e --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/virtual_attributes.xml @@ -0,0 +1,2 @@ + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/virtual_properties.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/virtual_properties.xml new file mode 100644 index 0000000000..237655e831 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/virtual_properties.xml @@ -0,0 +1,7 @@ + + + + + + 1 + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/virtual_properties_all.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/virtual_properties_all.xml new file mode 100644 index 0000000000..6341cb48f6 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/virtual_properties_all.xml @@ -0,0 +1,5 @@ + + + 1 + 8 + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/virtual_properties_high.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/virtual_properties_high.xml new file mode 100644 index 0000000000..30632e862f --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/virtual_properties_high.xml @@ -0,0 +1,4 @@ + + + 8 + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/virtual_properties_list.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/virtual_properties_list.xml new file mode 100644 index 0000000000..06d9842577 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/virtual_properties_list.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/virtual_properties_low.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/virtual_properties_low.xml new file mode 100644 index 0000000000..5cce97a423 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/virtual_properties_low.xml @@ -0,0 +1,4 @@ + + + 1 + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/virtual_properties_map.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/virtual_properties_map.xml new file mode 100644 index 0000000000..f8518537fb --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/virtual_properties_map.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/virtual_values.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/virtual_values.xml new file mode 100644 index 0000000000..c37e7341ba --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/virtual_values.xml @@ -0,0 +1,2 @@ + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/xml_discriminator_attribute.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/xml_discriminator_attribute.xml new file mode 100644 index 0000000000..0deec455e9 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/xml_discriminator_attribute.xml @@ -0,0 +1,2 @@ + + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/xml_discriminator_namespace.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/xml_discriminator_namespace.xml new file mode 100644 index 0000000000..d312627715 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/xml_discriminator_namespace.xml @@ -0,0 +1,4 @@ + + + child + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/xml_discriminator_not_cdata.xml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/xml_discriminator_not_cdata.xml new file mode 100644 index 0000000000..7037d5208e --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/xml/xml_discriminator_not_cdata.xml @@ -0,0 +1,4 @@ + + + child + diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/accessor_order_child.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/accessor_order_child.yml new file mode 100644 index 0000000000..4e35702b45 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/accessor_order_child.yml @@ -0,0 +1,4 @@ +c: c +d: d +a: a +b: b diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/accessor_order_methods.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/accessor_order_methods.yml new file mode 100644 index 0000000000..ee822f27b8 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/accessor_order_methods.yml @@ -0,0 +1,3 @@ +foo: c +b: b +a: a diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/accessor_order_parent.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/accessor_order_parent.yml new file mode 100644 index 0000000000..5422ec2488 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/accessor_order_parent.yml @@ -0,0 +1,2 @@ +a: a +b: b diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/array_booleans.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/array_booleans.yml new file mode 100644 index 0000000000..5c72ab25db --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/array_booleans.yml @@ -0,0 +1,2 @@ +- true +- false diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/array_datetimes_object.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/array_datetimes_object.yml new file mode 100644 index 0000000000..c5f131d20d --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/array_datetimes_object.yml @@ -0,0 +1,6 @@ +array_with_default_date_time: + - '2047-01-01T12:47:47+0000' + - '2016-12-05T00:00:00+0000' +array_with_formatted_date_time: + - '01.01.2047 12:47:47' + - '05.12.2016 00:00:00' diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/array_empty.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/array_empty.yml new file mode 100644 index 0000000000..d4def9ae32 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/array_empty.yml @@ -0,0 +1 @@ +array: [] diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/array_floats.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/array_floats.yml new file mode 100644 index 0000000000..8255623e62 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/array_floats.yml @@ -0,0 +1,3 @@ +- 1.34 +- 3 +- 6.42 diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/array_integers.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/array_integers.yml new file mode 100644 index 0000000000..06c0e53ae0 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/array_integers.yml @@ -0,0 +1,3 @@ +- 1 +- 3 +- 4 diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/array_list_and_map_difference.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/array_list_and_map_difference.yml new file mode 100644 index 0000000000..05d6fde21d --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/array_list_and_map_difference.yml @@ -0,0 +1,8 @@ +list: + - 1 + - 2 + - 3 +map: + 0: 1 + 2: 2 + 3: 3 diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/array_mixed.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/array_mixed.yml new file mode 100644 index 0000000000..cd9b7f38f0 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/array_mixed.yml @@ -0,0 +1,11 @@ +- foo +- 1 +- true +- + foo: foo + moo: bar + camel_case: boo +- + - 1 + - 3 + - true diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/array_named_datetimeimmutables_object.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/array_named_datetimeimmutables_object.yml new file mode 100644 index 0000000000..287bcd97eb --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/array_named_datetimeimmutables_object.yml @@ -0,0 +1,3 @@ +named_array_with_formatted_date: + testdate1: '01.01.2047 12:47:47' + testdate2: '05.12.2016 00:00:00' diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/array_named_datetimes_object.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/array_named_datetimes_object.yml new file mode 100644 index 0000000000..287bcd97eb --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/array_named_datetimes_object.yml @@ -0,0 +1,3 @@ +named_array_with_formatted_date: + testdate1: '01.01.2047 12:47:47' + testdate2: '05.12.2016 00:00:00' diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/array_objects.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/array_objects.yml new file mode 100644 index 0000000000..b1609d4272 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/array_objects.yml @@ -0,0 +1,8 @@ +- + foo: foo + moo: bar + camel_case: boo +- + foo: baz + moo: boo + camel_case: boo diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/array_strings.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/array_strings.yml new file mode 100644 index 0000000000..59121da8a7 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/array_strings.yml @@ -0,0 +1,2 @@ +- foo +- bar diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/article.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/article.yml new file mode 100644 index 0000000000..267643d2c4 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/article.yml @@ -0,0 +1 @@ +custom: serialized diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/author_expression.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/author_expression.yml new file mode 100644 index 0000000000..335e87131d --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/author_expression.yml @@ -0,0 +1,3 @@ +my_first_name: Ruud +last_name: Kamphuis +id: 123 diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/blog_post.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/blog_post.yml new file mode 100644 index 0000000000..fd557c18f4 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/blog_post.yml @@ -0,0 +1,26 @@ +id: what_a_nice_id +title: 'This is a nice title.' +created_at: '2011-07-30T00:00:00+0000' +is_published: false +etag: 1edf9bf60a32d89afbb85b2be849e3ceed5f5b10 +comments: + - + author: + full_name: 'Foo Bar' + text: foo +comments2: + - + author: + full_name: 'Foo Bar' + text: foo +metadata: + foo: bar +author: + full_name: 'Foo Bar' +publisher: + pub_name: 'Bar Foo' +tag: + - + name: tag1 + - + name: tag2 diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/blog_post_unauthored.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/blog_post_unauthored.yml new file mode 100644 index 0000000000..5e080297a6 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/blog_post_unauthored.yml @@ -0,0 +1,12 @@ +id: what_a_nice_id +title: 'This is a nice title.' +created_at: '2011-07-30T00:00:00+0000' +is_published: false +etag: 1edf9bf60a32d89afbb85b2be849e3ceed5f5b10 +comments: [] +comments2: [] +metadata: + foo: bar +author: null +publisher: null +tag: null diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/boolean_false.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/boolean_false.yml new file mode 100644 index 0000000000..c508d5366f --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/boolean_false.yml @@ -0,0 +1 @@ +false diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/boolean_true.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/boolean_true.yml new file mode 100644 index 0000000000..27ba77ddaf --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/boolean_true.yml @@ -0,0 +1 @@ +true diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/car.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/car.yml new file mode 100644 index 0000000000..b2e9c9a097 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/car.yml @@ -0,0 +1,2 @@ +km: 5 +type: car diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/car_without_type.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/car_without_type.yml new file mode 100644 index 0000000000..886bbb9705 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/car_without_type.yml @@ -0,0 +1 @@ +km: 5 diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/circular_reference.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/circular_reference.yml new file mode 100644 index 0000000000..011b690d7c --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/circular_reference.yml @@ -0,0 +1,10 @@ +collection: + - + name: child1 + - + name: child2 +another_collection: + - + name: child1 + - + name: child2 diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/currency_aware_price.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/currency_aware_price.yml new file mode 100644 index 0000000000..66185f5fd9 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/currency_aware_price.yml @@ -0,0 +1,2 @@ +currency: EUR +amount: 2.34 diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/custom_accessor.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/custom_accessor.yml new file mode 100644 index 0000000000..5eeb1b2040 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/custom_accessor.yml @@ -0,0 +1,12 @@ +comments: + Foo: + comments: + - + author: + full_name: Foo + text: foo + - + author: + full_name: Foo + text: bar + count: 2 diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/date_interval.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/date_interval.yml new file mode 100644 index 0000000000..e8286c5b8b --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/date_interval.yml @@ -0,0 +1 @@ +PT45M diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/date_time.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/date_time.yml new file mode 100644 index 0000000000..a8f98ee452 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/date_time.yml @@ -0,0 +1 @@ +'2011-08-30T00:00:00+0000' diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/date_time_immutable.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/date_time_immutable.yml new file mode 100644 index 0000000000..a8f98ee452 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/date_time_immutable.yml @@ -0,0 +1 @@ +'2011-08-30T00:00:00+0000' diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/float.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/float.yml new file mode 100644 index 0000000000..a955e81fa0 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/float.yml @@ -0,0 +1 @@ +4.533 diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/float_trailing_zero.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/float_trailing_zero.yml new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/float_trailing_zero.yml @@ -0,0 +1 @@ +1 diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/garage.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/garage.yml new file mode 100644 index 0000000000..b32204dc30 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/garage.yml @@ -0,0 +1,7 @@ +vehicles: + - + km: 3 + type: car + - + km: 1 + type: moped diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/groups_advanced.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/groups_advanced.yml new file mode 100644 index 0000000000..fbd7c63f0b --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/groups_advanced.yml @@ -0,0 +1,15 @@ +name: John +manager: + name: 'John Manager' + friends: + - + nickname: nickname + - + nickname: nickname +friends: + - + manager: + name: 'John friend 1 manager' + - + manager: + name: 'John friend 2 manager' diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/groups_all.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/groups_all.yml new file mode 100644 index 0000000000..6504e203ef --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/groups_all.yml @@ -0,0 +1,4 @@ +foo: foo +foobar: foobar +bar: bar +none: none diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/groups_default.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/groups_default.yml new file mode 100644 index 0000000000..c34136a4d7 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/groups_default.yml @@ -0,0 +1,2 @@ +bar: bar +none: none diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/groups_foo.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/groups_foo.yml new file mode 100644 index 0000000000..58a24e6cc0 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/groups_foo.yml @@ -0,0 +1,2 @@ +foo: foo +foobar: foobar diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/groups_foobar.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/groups_foobar.yml new file mode 100644 index 0000000000..f50c43e478 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/groups_foobar.yml @@ -0,0 +1,3 @@ +foo: foo +foobar: foobar +bar: bar diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/hash_empty.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/hash_empty.yml new file mode 100644 index 0000000000..6ec4ff79d1 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/hash_empty.yml @@ -0,0 +1 @@ +hash: {} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/inline.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/inline.yml new file mode 100644 index 0000000000..5b6dfe9ea7 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/inline.yml @@ -0,0 +1,4 @@ +c: c +a: a +b: b +d: d diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/inline_child_empty.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/inline_child_empty.yml new file mode 100644 index 0000000000..606ed684cf --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/inline_child_empty.yml @@ -0,0 +1,2 @@ +c: c +d: d diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/input.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/input.yml new file mode 100644 index 0000000000..6df3ab090b --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/input.yml @@ -0,0 +1,4 @@ +attributes: + type: text + name: firstname + value: Adrien diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/integer.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/integer.yml new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/integer.yml @@ -0,0 +1 @@ +1 diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/lifecycle_callbacks.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/lifecycle_callbacks.yml new file mode 100644 index 0000000000..7c302c0fec --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/lifecycle_callbacks.yml @@ -0,0 +1 @@ +name: 'Foo Bar' diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/log.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/log.yml new file mode 100644 index 0000000000..99d4773596 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/log.yml @@ -0,0 +1,18 @@ +author_list: + - + full_name: 'Johannes Schmitt' + - + full_name: 'John Doe' +comments: + - + author: + full_name: 'Foo Bar' + text: foo + - + author: + full_name: 'Foo Bar' + text: bar + - + author: + full_name: 'Foo Bar' + text: baz diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/maxdepth_skippabe_object.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/maxdepth_skippabe_object.yml new file mode 100644 index 0000000000..4c0be60627 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/maxdepth_skippabe_object.yml @@ -0,0 +1,2 @@ +a: + xxx: yyy diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/mixed_access_types.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/mixed_access_types.yml new file mode 100644 index 0000000000..ef18306ba3 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/mixed_access_types.yml @@ -0,0 +1,3 @@ +id: 1 +name: Johannes +read_only_property: 42 diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/null.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/null.yml new file mode 100644 index 0000000000..19765bd501 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/null.yml @@ -0,0 +1 @@ +null diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/nullable.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/nullable.yml new file mode 100644 index 0000000000..acb6263fd6 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/nullable.yml @@ -0,0 +1,3 @@ +foo: bar +baz: null +0: null diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/nullable_arrays.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/nullable_arrays.yml new file mode 100644 index 0000000000..4454d39926 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/nullable_arrays.yml @@ -0,0 +1,9 @@ +empty_inline: [] +not_empty_inline: + - not_empty_inline +empty_not_inline: [] +not_empty_not_inline: + - not_empty_not_inline +empty_not_inline_skip: [] +not_empty_not_inline_skip: + - not_empty_not_inline_skip diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/nullable_skip.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/nullable_skip.yml new file mode 100644 index 0000000000..20e9ff3fea --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/nullable_skip.yml @@ -0,0 +1 @@ +foo: bar diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/object_when_null.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/object_when_null.yml new file mode 100644 index 0000000000..10d56bf3b2 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/object_when_null.yml @@ -0,0 +1 @@ +text: foo diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/object_when_null_and_serialized.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/object_when_null_and_serialized.yml new file mode 100644 index 0000000000..119ce0e2fa --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/object_when_null_and_serialized.yml @@ -0,0 +1,2 @@ +author: null +text: foo diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/order.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/order.yml new file mode 100644 index 0000000000..e25bd6bb14 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/order.yml @@ -0,0 +1,2 @@ +cost: + price: 12.34 diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/order_with_currency_aware_price.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/order_with_currency_aware_price.yml new file mode 100644 index 0000000000..4000322dfd --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/order_with_currency_aware_price.yml @@ -0,0 +1,3 @@ +cost: + currency: EUR + amount: 1.23 diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/orm_proxy.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/orm_proxy.yml new file mode 100644 index 0000000000..6f26058723 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/orm_proxy.yml @@ -0,0 +1,3 @@ +foo: foo +moo: bar +camel_case: proxy-boo diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/person_secret_hide.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/person_secret_hide.yml new file mode 100644 index 0000000000..710e7dc2f8 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/person_secret_hide.yml @@ -0,0 +1 @@ +name: mike diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/person_secret_show.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/person_secret_show.yml new file mode 100644 index 0000000000..f03db3ebde --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/person_secret_show.yml @@ -0,0 +1,2 @@ +name: mike +gender: f diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/price.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/price.yml new file mode 100644 index 0000000000..dc5a58b69f --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/price.yml @@ -0,0 +1 @@ +price: 3 diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/readonly.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/readonly.yml new file mode 100644 index 0000000000..3c428c3f8d --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/readonly.yml @@ -0,0 +1,2 @@ +id: 123 +full_name: 'Ruud Kamphuis' diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/simple_object.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/simple_object.yml new file mode 100644 index 0000000000..594b28959a --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/simple_object.yml @@ -0,0 +1,3 @@ +foo: foo +moo: bar +camel_case: boo diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/simple_object_nullable.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/simple_object_nullable.yml new file mode 100644 index 0000000000..126d625ab1 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/simple_object_nullable.yml @@ -0,0 +1,4 @@ +foo: foo +moo: bar +camel_case: boo +null_property: null diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/string.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/string.yml new file mode 100644 index 0000000000..257cc5642c --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/string.yml @@ -0,0 +1 @@ +foo diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/timestamp.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/timestamp.yml new file mode 100644 index 0000000000..b1c38be9d6 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/timestamp.yml @@ -0,0 +1 @@ +timestamp: 1455148800 diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/timestamp_prev.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/timestamp_prev.yml new file mode 100644 index 0000000000..3df27d67ac --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/timestamp_prev.yml @@ -0,0 +1 @@ +timestamp: "1455148800" diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/tree.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/tree.yml new file mode 100644 index 0000000000..01e838766e --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/tree.yml @@ -0,0 +1,10 @@ +tree: + children: + - + children: + - + children: + - + foo: bar + foo: bar + foo: bar diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/virtual_properties.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/virtual_properties.yml new file mode 100644 index 0000000000..7d1c0b2b54 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/virtual_properties.yml @@ -0,0 +1,4 @@ +exist_field: value +virtual_value: value +test: other-name +typed_virtual_property: 1 diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/virtual_properties_all.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/virtual_properties_all.yml new file mode 100644 index 0000000000..0bcf04b862 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/virtual_properties_all.yml @@ -0,0 +1,2 @@ +low: 1 +high: 8 diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/virtual_properties_high.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/virtual_properties_high.yml new file mode 100644 index 0000000000..2be358dd28 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/virtual_properties_high.yml @@ -0,0 +1 @@ +high: 8 diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/virtual_properties_low.yml b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/virtual_properties_low.yml new file mode 100644 index 0000000000..a021172b72 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Serializer/yml/virtual_properties_low.yml @@ -0,0 +1 @@ +low: 1 diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/SerializerBuilderTest.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/SerializerBuilderTest.php new file mode 100644 index 0000000000..70e6826ab6 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/SerializerBuilderTest.php @@ -0,0 +1,266 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests; + +use JMS\Serializer\Expression\ExpressionEvaluator; +use JMS\Serializer\SerializerBuilder; +use JMS\Serializer\Tests\Fixtures\PersonSecret; +use Symfony\Component\ExpressionLanguage\ExpressionFunction; +use Symfony\Component\ExpressionLanguage\ExpressionLanguage; +use Symfony\Component\Filesystem\Filesystem; +use JMS\Serializer\Handler\HandlerRegistry; +use JMS\Serializer\JsonSerializationVisitor; +use JMS\Serializer\Naming\CamelCaseNamingStrategy; +use JMS\Serializer\SerializationContext; +use JMS\Serializer\DeserializationContext; + +class SerializerBuilderTest extends \PHPUnit_Framework_TestCase +{ + /** @var SerializerBuilder */ + private $builder; + private $fs; + private $tmpDir; + + public function testBuildWithoutAnythingElse() + { + $serializer = $this->builder->build(); + + $this->assertEquals('"foo"', $serializer->serialize('foo', 'json')); + $this->assertEquals(' + +', $serializer->serialize('foo', 'xml')); + $this->assertEquals('foo +', $serializer->serialize('foo', 'yml')); + + $this->assertEquals('foo', $serializer->deserialize('"foo"', 'string', 'json')); + $this->assertEquals('foo', $serializer->deserialize('', 'string', 'xml')); + } + + public function testWithCache() + { + $this->assertFileNotExists($this->tmpDir); + + $this->assertSame($this->builder, $this->builder->setCacheDir($this->tmpDir)); + $serializer = $this->builder->build(); + + $this->assertFileExists($this->tmpDir); + $this->assertFileExists($this->tmpDir.'/annotations'); + $this->assertFileExists($this->tmpDir.'/metadata'); + + $factory = $this->getField($serializer, 'factory'); + $this->assertAttributeSame(false, 'debug', $factory); + $this->assertAttributeNotSame(null, 'cache', $factory); + } + + public function testDoesAddDefaultHandlers() + { + $serializer = $this->builder->build(); + + $this->assertEquals('"2020-04-16T00:00:00+0000"', $serializer->serialize(new \DateTime('2020-04-16', new \DateTimeZone('UTC')), 'json')); + } + + public function testDoesNotAddDefaultHandlersWhenExplicitlyConfigured() + { + $this->assertSame($this->builder, $this->builder->configureHandlers(function(HandlerRegistry $registry) { + })); + + $this->assertEquals('{}', $this->builder->build()->serialize(new \DateTime('2020-04-16'), 'json')); + } + + /** + * @expectedException JMS\Serializer\Exception\UnsupportedFormatException + * @expectedExceptionMessage The format "xml" is not supported for serialization. + */ + public function testDoesNotAddOtherVisitorsWhenConfiguredExplicitly() + { + $this->assertSame( + $this->builder, + $this->builder->setSerializationVisitor('json', new JsonSerializationVisitor(new CamelCaseNamingStrategy())) + ); + + $this->builder->build()->serialize('foo', 'xml'); + } + + public function testIncludeInterfaceMetadata() + { + $this->assertFalse( + $this->getIncludeInterfaces($this->builder), + 'Interface metadata are not included by default' + ); + + $this->assertTrue( + $this->getIncludeInterfaces($this->builder->includeInterfaceMetadata(true)), + 'Force including interface metadata' + ); + + $this->assertFalse( + $this->getIncludeInterfaces($this->builder->includeInterfaceMetadata(false)), + 'Force not including interface metadata' + ); + + $this->assertSame( + $this->builder, + $this->builder->includeInterfaceMetadata(true) + ); + } + + public function testSetSerializationContext() + { + $contextFactoryMock = $this->getMockForAbstractClass('JMS\\Serializer\\ContextFactory\\SerializationContextFactoryInterface'); + $context = new SerializationContext(); + $context->setSerializeNull(true); + + $contextFactoryMock + ->expects($this->once()) + ->method('createSerializationContext') + ->will($this->returnValue($context)) + ; + + $this->builder->setSerializationContextFactory($contextFactoryMock); + + $serializer = $this->builder->build(); + + $result = $serializer->serialize(array('value' => null), 'json'); + + $this->assertEquals('{"value":null}', $result); + } + + public function testSetDeserializationContext() + { + $contextFactoryMock = $this->getMockForAbstractClass('JMS\\Serializer\\ContextFactory\\DeserializationContextFactoryInterface'); + $context = new DeserializationContext(); + + $contextFactoryMock + ->expects($this->once()) + ->method('createDeserializationContext') + ->will($this->returnValue($context)) + ; + + $this->builder->setDeserializationContextFactory($contextFactoryMock); + + $serializer = $this->builder->build(); + + $result = $serializer->deserialize('{"value":null}', 'array', 'json'); + + $this->assertEquals(array('value' => null), $result); + } + + public function testSetCallbackSerializationContextWithSerializeNull() + { + $this->builder->setSerializationContextFactory(function () { + return SerializationContext::create() + ->setSerializeNull(true) + ; + }); + + $serializer = $this->builder->build(); + + $result = $serializer->serialize(array('value' => null), 'json'); + + $this->assertEquals('{"value":null}', $result); + } + + public function testSetCallbackSerializationContextWithNotSerializeNull() + { + $this->builder->setSerializationContextFactory(function () { + return SerializationContext::create() + ->setSerializeNull(false) + ; + }); + + $serializer = $this->builder->build(); + + $result = $serializer->serialize(array('value' => null, 'not_null' => 'ok'), 'json'); + + $this->assertEquals('{"not_null":"ok"}', $result); + } + + public function expressionFunctionProvider() + { + return [ + [ + new ExpressionFunction('show_data', function () { + return "true"; + }, function () { + return true; + }), + '{"name":"mike"}' + ], + [ + new ExpressionFunction('show_data', function () { + return "false"; + }, function () { + return false; + }), + '{"name":"mike","gender":"f"}' + ] + ]; + } + + /** + * @dataProvider expressionFunctionProvider + * @param ExpressionFunction $function + * @param $json + */ + public function testExpressionEngine(ExpressionFunction $function, $json) + { + $language = new ExpressionLanguage(); + $language->addFunction($function); + + $this->builder->setExpressionEvaluator(new ExpressionEvaluator($language)); + + $serializer = $this->builder->build(); + + $person = new PersonSecret(); + $person->gender = 'f'; + $person->name = 'mike'; + + $this->assertEquals($json, $serializer->serialize($person, 'json')); + } + + protected function setUp() + { + $this->builder = SerializerBuilder::create(); + $this->fs = new Filesystem(); + + $this->tmpDir = sys_get_temp_dir().'/serializer'; + $this->fs->remove($this->tmpDir); + clearstatcache(); + } + + protected function tearDown() + { + $this->fs->remove($this->tmpDir); + } + + private function getField($obj, $name) + { + $ref = new \ReflectionProperty($obj, $name); + $ref->setAccessible(true); + + return $ref->getValue($obj); + } + + private function getIncludeInterfaces(SerializerBuilder $builder) + { + $factory = $this->getField($builder->build(), 'factory'); + + return $this->getField($factory, 'includeInterfaces'); + } +} diff --git a/vendor/jms/serializer/tests/JMS/Serializer/Tests/Twig/SerializerExtensionTest.php b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Twig/SerializerExtensionTest.php new file mode 100644 index 0000000000..051294db26 --- /dev/null +++ b/vendor/jms/serializer/tests/JMS/Serializer/Tests/Twig/SerializerExtensionTest.php @@ -0,0 +1,78 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace JMS\Serializer\Tests\Twig; + +use JMS\Serializer\Twig\SerializerExtension; +use JMS\Serializer\Twig\SerializerRuntimeExtension; +use JMS\Serializer\Twig\SerializerRuntimeHelper; + +class SerializerExtensionTest extends \PHPUnit_Framework_TestCase +{ + public function testSerialize() + { + $mockSerializer = $this->getMock('JMS\Serializer\SerializerInterface'); + $obj = new \stdClass(); + $mockSerializer + ->expects($this->once()) + ->method('serialize') + ->with($this->equalTo($obj), $this->equalTo('json')); + $serializerExtension = new SerializerExtension($mockSerializer); + $serializerExtension->serialize($obj); + + $this->assertEquals('jms_serializer', $serializerExtension->getName()); + + $filters = $serializerExtension->getFilters(); + $this->assertInstanceOf('Twig_SimpleFilter', $filters[0]); + $this->assertSame(array($serializerExtension, 'serialize'), $filters[0]->getCallable()); + + $this->assertEquals( + array(new \Twig_SimpleFunction('serialization_context', '\JMS\Serializer\SerializationContext::create')), + $serializerExtension->getFunctions() + ); + } + + public function testRuntimeSerializerHelper() + { + $obj = new \stdClass(); + + $mockSerializer = $this->getMock('JMS\Serializer\SerializerInterface'); + $mockSerializer + ->expects($this->once()) + ->method('serialize') + ->with($this->equalTo($obj), $this->equalTo('json')); + + $serializerExtension = new SerializerRuntimeHelper($mockSerializer); + $serializerExtension->serialize($obj); + } + + public function testRuntimeSerializerExtension() + { + $serializerExtension = new SerializerRuntimeExtension(); + + $this->assertEquals('jms_serializer', $serializerExtension->getName()); + $this->assertEquals( + array(new \Twig_SimpleFilter('serialize', array(SerializerRuntimeHelper::class, 'serialize'))), + $serializerExtension->getFilters() + ); + $this->assertEquals( + array(new \Twig_SimpleFunction('serialization_context', '\JMS\Serializer\SerializationContext::create')), + $serializerExtension->getFunctions() + ); + } +} diff --git a/vendor/jms/serializer/tests/benchmark.php b/vendor/jms/serializer/tests/benchmark.php new file mode 100644 index 0000000000..f1c8d95f01 --- /dev/null +++ b/vendor/jms/serializer/tests/benchmark.php @@ -0,0 +1,63 @@ + [output-file]'.PHP_EOL; + exit(1); +} + +list(, $format, $iterations) = $_SERVER['argv']; + +require_once 'bootstrap.php'; + +function benchmark(\Closure $f, $times = 10) +{ + $time = microtime(true); + for ($i=0; $i<$times; $i++) { + $f(); + } + + return (microtime(true) - $time) / $times; +} + +function createCollection() +{ + $collection = array(); + for ($i=0; $i<50; $i++) { + $collection[] = createObject(); + } + + return $collection; +} + +function createObject() +{ + $p = new \JMS\Serializer\Tests\Fixtures\Publisher('bar'); + $post = new \JMS\Serializer\Tests\Fixtures\BlogPost('FooooooooooooooooooooooBAR', new \JMS\Serializer\Tests\Fixtures\Author('Foo'), new \DateTime, $p); + for ($i=0; $i<10; $i++) { + $post->addComment(new \JMS\Serializer\Tests\Fixtures\Comment(new \JMS\Serializer\Tests\Fixtures\Author('foo'), 'foobar')); + } + + return $post; +} + +$serializer = \JMS\Serializer\SerializerBuilder::create()->build(); +$collection = createCollection(); +$metrics = array(); +$f = function() use ($serializer, $collection, $format) { + $serializer->serialize($collection, $format); +}; + +// Load all necessary classes into memory. +benchmark($f, 1); + +printf('Benchmarking collection for format "%s".'.PHP_EOL, $format); +$metrics['benchmark-collection-'.$format] = benchmark($f, $iterations); + +$output = json_encode(array('metrics' => $metrics)); + +if (isset($_SERVER['argv'][3])) { + file_put_contents($_SERVER['argv'][3], $output); + echo "Done.".PHP_EOL; +} else { + echo $output.PHP_EOL; +} diff --git a/vendor/jms/serializer/tests/bootstrap.php b/vendor/jms/serializer/tests/bootstrap.php new file mode 100644 index 0000000000..71ce33a6b5 --- /dev/null +++ b/vendor/jms/serializer/tests/bootstrap.php @@ -0,0 +1,30 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +use Doctrine\Common\Annotations\AnnotationRegistry; + +call_user_func(function() { + if ( ! is_file($autoloadFile = __DIR__.'/../vendor/autoload.php')) { + throw new \RuntimeException('Did not find vendor/autoload.php. Did you run "composer install --dev"?'); + } + + $loader = require $autoloadFile; + $loader->add('JMS\Serializer\Tests', __DIR__); + + AnnotationRegistry::registerLoader('class_exists'); +}); diff --git a/vendor/monolog/monolog/CHANGELOG.md b/vendor/monolog/monolog/CHANGELOG.md new file mode 100644 index 0000000000..757643df9b --- /dev/null +++ b/vendor/monolog/monolog/CHANGELOG.md @@ -0,0 +1,415 @@ +### 1.25.5 (2020-07-23) + + * Fixed array access on null in RavenHandler + * Fixed unique_id in WebProcessor not being disableable + +### 1.25.4 (2020-05-22) + + * Fixed GitProcessor type error when there is no git repo present + * Fixed normalization of SoapFault objects containing deeply nested objects as "detail" + * Fixed support for relative paths in RotatingFileHandler + +### 1.25.3 (2019-12-20) + + * Fixed formatting of resources in JsonFormatter + * Fixed RedisHandler failing to use MULTI properly when passed a proxied Redis instance (e.g. in Symfony with lazy services) + * Fixed FilterHandler triggering a notice when handleBatch was filtering all records passed to it + * Fixed Turkish locale messing up the conversion of level names to their constant values + +### 1.25.2 (2019-11-13) + + * Fixed normalization of Traversables to avoid traversing them as not all of them are rewindable + * Fixed setFormatter/getFormatter to forward to the nested handler in FilterHandler, FingersCrossedHandler, BufferHandler and SamplingHandler + * Fixed BrowserConsoleHandler formatting when using multiple styles + * Fixed normalization of exception codes to be always integers even for PDOException which have them as numeric strings + * Fixed normalization of SoapFault objects containing non-strings as "detail" + * Fixed json encoding across all handlers to always attempt recovery of non-UTF-8 strings instead of failing the whole encoding + +### 1.25.1 (2019-09-06) + + * Fixed forward-compatible interfaces to be compatible with Monolog 1.x too. + +### 1.25.0 (2019-09-06) + + * Deprecated SlackbotHandler, use SlackWebhookHandler or SlackHandler instead + * Deprecated RavenHandler, use sentry/sentry 2.x and their Sentry\Monolog\Handler instead + * Deprecated HipChatHandler, migrate to Slack and use SlackWebhookHandler or SlackHandler instead + * Added forward-compatible interfaces and traits FormattableHandlerInterface, FormattableHandlerTrait, ProcessableHandlerInterface, ProcessableHandlerTrait. If you use modern PHP and want to make code compatible with Monolog 1 and 2 this can help. You will have to require at least Monolog 1.25 though. + * Added support for RFC3164 (outdated BSD syslog protocol) to SyslogUdpHandler + * Fixed issue in GroupHandler and WhatFailureGroupHandler where setting multiple processors would duplicate records + * Fixed issue in SignalHandler restarting syscalls functionality + * Fixed normalizers handling of exception backtraces to avoid serializing arguments in some cases + * Fixed ZendMonitorHandler to work with the latest Zend Server versions + * Fixed ChromePHPHandler to avoid sending more data than latest Chrome versions allow in headers (4KB down from 256KB). + +### 1.24.0 (2018-11-05) + + * BC Notice: If you are extending any of the Monolog's Formatters' `normalize` method, make sure you add the new `$depth = 0` argument to your function signature to avoid strict PHP warnings. + * Added a `ResettableInterface` in order to reset/reset/clear/flush handlers and processors + * Added a `ProcessorInterface` as an optional way to label a class as being a processor (mostly useful for autowiring dependency containers) + * Added a way to log signals being received using Monolog\SignalHandler + * Added ability to customize error handling at the Logger level using Logger::setExceptionHandler + * Added InsightOpsHandler to migrate users of the LogEntriesHandler + * Added protection to NormalizerHandler against circular and very deep structures, it now stops normalizing at a depth of 9 + * Added capture of stack traces to ErrorHandler when logging PHP errors + * Added RavenHandler support for a `contexts` context or extra key to forward that to Sentry's contexts + * Added forwarding of context info to FluentdFormatter + * Added SocketHandler::setChunkSize to override the default chunk size in case you must send large log lines to rsyslog for example + * Added ability to extend/override BrowserConsoleHandler + * Added SlackWebhookHandler::getWebhookUrl and SlackHandler::getToken to enable class extensibility + * Added SwiftMailerHandler::getSubjectFormatter to enable class extensibility + * Dropped official support for HHVM in test builds + * Fixed normalization of exception traces when call_user_func is used to avoid serializing objects and the data they contain + * Fixed naming of fields in Slack handler, all field names are now capitalized in all cases + * Fixed HipChatHandler bug where slack dropped messages randomly + * Fixed normalization of objects in Slack handlers + * Fixed support for PHP7's Throwable in NewRelicHandler + * Fixed race bug when StreamHandler sometimes incorrectly reported it failed to create a directory + * Fixed table row styling issues in HtmlFormatter + * Fixed RavenHandler dropping the message when logging exception + * Fixed WhatFailureGroupHandler skipping processors when using handleBatch + and implement it where possible + * Fixed display of anonymous class names + +### 1.23.0 (2017-06-19) + + * Improved SyslogUdpHandler's support for RFC5424 and added optional `$ident` argument + * Fixed GelfHandler truncation to be per field and not per message + * Fixed compatibility issue with PHP <5.3.6 + * Fixed support for headless Chrome in ChromePHPHandler + * Fixed support for latest Aws SDK in DynamoDbHandler + * Fixed support for SwiftMailer 6.0+ in SwiftMailerHandler + +### 1.22.1 (2017-03-13) + + * Fixed lots of minor issues in the new Slack integrations + * Fixed support for allowInlineLineBreaks in LineFormatter when formatting exception backtraces + +### 1.22.0 (2016-11-26) + + * Added SlackbotHandler and SlackWebhookHandler to set up Slack integration more easily + * Added MercurialProcessor to add mercurial revision and branch names to log records + * Added support for AWS SDK v3 in DynamoDbHandler + * Fixed fatal errors occuring when normalizing generators that have been fully consumed + * Fixed RollbarHandler to include a level (rollbar level), monolog_level (original name), channel and datetime (unix) + * Fixed RollbarHandler not flushing records automatically, calling close() explicitly is not necessary anymore + * Fixed SyslogUdpHandler to avoid sending empty frames + * Fixed a few PHP 7.0 and 7.1 compatibility issues + +### 1.21.0 (2016-07-29) + + * Break: Reverted the addition of $context when the ErrorHandler handles regular php errors from 1.20.0 as it was causing issues + * Added support for more formats in RotatingFileHandler::setFilenameFormat as long as they have Y, m and d in order + * Added ability to format the main line of text the SlackHandler sends by explictly setting a formatter on the handler + * Added information about SoapFault instances in NormalizerFormatter + * Added $handleOnlyReportedErrors option on ErrorHandler::registerErrorHandler (default true) to allow logging of all errors no matter the error_reporting level + +### 1.20.0 (2016-07-02) + + * Added FingersCrossedHandler::activate() to manually trigger the handler regardless of the activation policy + * Added StreamHandler::getUrl to retrieve the stream's URL + * Added ability to override addRow/addTitle in HtmlFormatter + * Added the $context to context information when the ErrorHandler handles a regular php error + * Deprecated RotatingFileHandler::setFilenameFormat to only support 3 formats: Y, Y-m and Y-m-d + * Fixed WhatFailureGroupHandler to work with PHP7 throwables + * Fixed a few minor bugs + +### 1.19.0 (2016-04-12) + + * Break: StreamHandler will not close streams automatically that it does not own. If you pass in a stream (not a path/url), then it will not close it for you. You can retrieve those using getStream() if needed + * Added DeduplicationHandler to remove duplicate records from notifications across multiple requests, useful for email or other notifications on errors + * Added ability to use `%message%` and other LineFormatter replacements in the subject line of emails sent with NativeMailHandler and SwiftMailerHandler + * Fixed HipChatHandler handling of long messages + +### 1.18.2 (2016-04-02) + + * Fixed ElasticaFormatter to use more precise dates + * Fixed GelfMessageFormatter sending too long messages + +### 1.18.1 (2016-03-13) + + * Fixed SlackHandler bug where slack dropped messages randomly + * Fixed RedisHandler issue when using with the PHPRedis extension + * Fixed AmqpHandler content-type being incorrectly set when using with the AMQP extension + * Fixed BrowserConsoleHandler regression + +### 1.18.0 (2016-03-01) + + * Added optional reduction of timestamp precision via `Logger->useMicrosecondTimestamps(false)`, disabling it gets you a bit of performance boost but reduces the precision to the second instead of microsecond + * Added possibility to skip some extra stack frames in IntrospectionProcessor if you have some library wrapping Monolog that is always adding frames + * Added `Logger->withName` to clone a logger (keeping all handlers) with a new name + * Added FluentdFormatter for the Fluentd unix socket protocol + * Added HandlerWrapper base class to ease the creation of handler wrappers, just extend it and override as needed + * Added support for replacing context sub-keys using `%context.*%` in LineFormatter + * Added support for `payload` context value in RollbarHandler + * Added setRelease to RavenHandler to describe the application version, sent with every log + * Added support for `fingerprint` context value in RavenHandler + * Fixed JSON encoding errors that would gobble up the whole log record, we now handle those more gracefully by dropping chars as needed + * Fixed write timeouts in SocketHandler and derivatives, set to 10sec by default, lower it with `setWritingTimeout()` + * Fixed PHP7 compatibility with regard to Exception/Throwable handling in a few places + +### 1.17.2 (2015-10-14) + + * Fixed ErrorHandler compatibility with non-Monolog PSR-3 loggers + * Fixed SlackHandler handling to use slack functionalities better + * Fixed SwiftMailerHandler bug when sending multiple emails they all had the same id + * Fixed 5.3 compatibility regression + +### 1.17.1 (2015-08-31) + + * Fixed RollbarHandler triggering PHP notices + +### 1.17.0 (2015-08-30) + + * Added support for `checksum` and `release` context/extra values in RavenHandler + * Added better support for exceptions in RollbarHandler + * Added UidProcessor::getUid + * Added support for showing the resource type in NormalizedFormatter + * Fixed IntrospectionProcessor triggering PHP notices + +### 1.16.0 (2015-08-09) + + * Added IFTTTHandler to notify ifttt.com triggers + * Added Logger::setHandlers() to allow setting/replacing all handlers + * Added $capSize in RedisHandler to cap the log size + * Fixed StreamHandler creation of directory to only trigger when the first log write happens + * Fixed bug in the handling of curl failures + * Fixed duplicate logging of fatal errors when both error and fatal error handlers are registered in monolog's ErrorHandler + * Fixed missing fatal errors records with handlers that need to be closed to flush log records + * Fixed TagProcessor::addTags support for associative arrays + +### 1.15.0 (2015-07-12) + + * Added addTags and setTags methods to change a TagProcessor + * Added automatic creation of directories if they are missing for a StreamHandler to open a log file + * Added retry functionality to Loggly, Cube and Mandrill handlers so they retry up to 5 times in case of network failure + * Fixed process exit code being incorrectly reset to 0 if ErrorHandler::registerExceptionHandler was used + * Fixed HTML/JS escaping in BrowserConsoleHandler + * Fixed JSON encoding errors being silently suppressed (PHP 5.5+ only) + +### 1.14.0 (2015-06-19) + + * Added PHPConsoleHandler to send record to Chrome's PHP Console extension and library + * Added support for objects implementing __toString in the NormalizerFormatter + * Added support for HipChat's v2 API in HipChatHandler + * Added Logger::setTimezone() to initialize the timezone monolog should use in case date.timezone isn't correct for your app + * Added an option to send formatted message instead of the raw record on PushoverHandler via ->useFormattedMessage(true) + * Fixed curl errors being silently suppressed + +### 1.13.1 (2015-03-09) + + * Fixed regression in HipChat requiring a new token to be created + +### 1.13.0 (2015-03-05) + + * Added Registry::hasLogger to check for the presence of a logger instance + * Added context.user support to RavenHandler + * Added HipChat API v2 support in the HipChatHandler + * Added NativeMailerHandler::addParameter to pass params to the mail() process + * Added context data to SlackHandler when $includeContextAndExtra is true + * Added ability to customize the Swift_Message per-email in SwiftMailerHandler + * Fixed SwiftMailerHandler to lazily create message instances if a callback is provided + * Fixed serialization of INF and NaN values in Normalizer and LineFormatter + +### 1.12.0 (2014-12-29) + + * Break: HandlerInterface::isHandling now receives a partial record containing only a level key. This was always the intent and does not break any Monolog handler but is strictly speaking a BC break and you should check if you relied on any other field in your own handlers. + * Added PsrHandler to forward records to another PSR-3 logger + * Added SamplingHandler to wrap around a handler and include only every Nth record + * Added MongoDBFormatter to support better storage with MongoDBHandler (it must be enabled manually for now) + * Added exception codes in the output of most formatters + * Added LineFormatter::includeStacktraces to enable exception stack traces in logs (uses more than one line) + * Added $useShortAttachment to SlackHandler to minify attachment size and $includeExtra to append extra data + * Added $host to HipChatHandler for users of private instances + * Added $transactionName to NewRelicHandler and support for a transaction_name context value + * Fixed MandrillHandler to avoid outputing API call responses + * Fixed some non-standard behaviors in SyslogUdpHandler + +### 1.11.0 (2014-09-30) + + * Break: The NewRelicHandler extra and context data are now prefixed with extra_ and context_ to avoid clashes. Watch out if you have scripts reading those from the API and rely on names + * Added WhatFailureGroupHandler to suppress any exception coming from the wrapped handlers and avoid chain failures if a logging service fails + * Added MandrillHandler to send emails via the Mandrillapp.com API + * Added SlackHandler to log records to a Slack.com account + * Added FleepHookHandler to log records to a Fleep.io account + * Added LogglyHandler::addTag to allow adding tags to an existing handler + * Added $ignoreEmptyContextAndExtra to LineFormatter to avoid empty [] at the end + * Added $useLocking to StreamHandler and RotatingFileHandler to enable flock() while writing + * Added support for PhpAmqpLib in the AmqpHandler + * Added FingersCrossedHandler::clear and BufferHandler::clear to reset them between batches in long running jobs + * Added support for adding extra fields from $_SERVER in the WebProcessor + * Fixed support for non-string values in PrsLogMessageProcessor + * Fixed SwiftMailer messages being sent with the wrong date in long running scripts + * Fixed minor PHP 5.6 compatibility issues + * Fixed BufferHandler::close being called twice + +### 1.10.0 (2014-06-04) + + * Added Logger::getHandlers() and Logger::getProcessors() methods + * Added $passthruLevel argument to FingersCrossedHandler to let it always pass some records through even if the trigger level is not reached + * Added support for extra data in NewRelicHandler + * Added $expandNewlines flag to the ErrorLogHandler to create multiple log entries when a message has multiple lines + +### 1.9.1 (2014-04-24) + + * Fixed regression in RotatingFileHandler file permissions + * Fixed initialization of the BufferHandler to make sure it gets flushed after receiving records + * Fixed ChromePHPHandler and FirePHPHandler's activation strategies to be more conservative + +### 1.9.0 (2014-04-20) + + * Added LogEntriesHandler to send logs to a LogEntries account + * Added $filePermissions to tweak file mode on StreamHandler and RotatingFileHandler + * Added $useFormatting flag to MemoryProcessor to make it send raw data in bytes + * Added support for table formatting in FirePHPHandler via the table context key + * Added a TagProcessor to add tags to records, and support for tags in RavenHandler + * Added $appendNewline flag to the JsonFormatter to enable using it when logging to files + * Added sound support to the PushoverHandler + * Fixed multi-threading support in StreamHandler + * Fixed empty headers issue when ChromePHPHandler received no records + * Fixed default format of the ErrorLogHandler + +### 1.8.0 (2014-03-23) + + * Break: the LineFormatter now strips newlines by default because this was a bug, set $allowInlineLineBreaks to true if you need them + * Added BrowserConsoleHandler to send logs to any browser's console via console.log() injection in the output + * Added FilterHandler to filter records and only allow those of a given list of levels through to the wrapped handler + * Added FlowdockHandler to send logs to a Flowdock account + * Added RollbarHandler to send logs to a Rollbar account + * Added HtmlFormatter to send prettier log emails with colors for each log level + * Added GitProcessor to add the current branch/commit to extra record data + * Added a Monolog\Registry class to allow easier global access to pre-configured loggers + * Added support for the new official graylog2/gelf-php lib for GelfHandler, upgrade if you can by replacing the mlehner/gelf-php requirement + * Added support for HHVM + * Added support for Loggly batch uploads + * Added support for tweaking the content type and encoding in NativeMailerHandler + * Added $skipClassesPartials to tweak the ignored classes in the IntrospectionProcessor + * Fixed batch request support in GelfHandler + +### 1.7.0 (2013-11-14) + + * Added ElasticSearchHandler to send logs to an Elastic Search server + * Added DynamoDbHandler and ScalarFormatter to send logs to Amazon's Dynamo DB + * Added SyslogUdpHandler to send logs to a remote syslogd server + * Added LogglyHandler to send logs to a Loggly account + * Added $level to IntrospectionProcessor so it only adds backtraces when needed + * Added $version to LogstashFormatter to allow using the new v1 Logstash format + * Added $appName to NewRelicHandler + * Added configuration of Pushover notification retries/expiry + * Added $maxColumnWidth to NativeMailerHandler to change the 70 chars default + * Added chainability to most setters for all handlers + * Fixed RavenHandler batch processing so it takes the message from the record with highest priority + * Fixed HipChatHandler batch processing so it sends all messages at once + * Fixed issues with eAccelerator + * Fixed and improved many small things + +### 1.6.0 (2013-07-29) + + * Added HipChatHandler to send logs to a HipChat chat room + * Added ErrorLogHandler to send logs to PHP's error_log function + * Added NewRelicHandler to send logs to NewRelic's service + * Added Monolog\ErrorHandler helper class to register a Logger as exception/error/fatal handler + * Added ChannelLevelActivationStrategy for the FingersCrossedHandler to customize levels by channel + * Added stack traces output when normalizing exceptions (json output & co) + * Added Monolog\Logger::API constant (currently 1) + * Added support for ChromePHP's v4.0 extension + * Added support for message priorities in PushoverHandler, see $highPriorityLevel and $emergencyLevel + * Added support for sending messages to multiple users at once with the PushoverHandler + * Fixed RavenHandler's support for batch sending of messages (when behind a Buffer or FingersCrossedHandler) + * Fixed normalization of Traversables with very large data sets, only the first 1000 items are shown now + * Fixed issue in RotatingFileHandler when an open_basedir restriction is active + * Fixed minor issues in RavenHandler and bumped the API to Raven 0.5.0 + * Fixed SyslogHandler issue when many were used concurrently with different facilities + +### 1.5.0 (2013-04-23) + + * Added ProcessIdProcessor to inject the PID in log records + * Added UidProcessor to inject a unique identifier to all log records of one request/run + * Added support for previous exceptions in the LineFormatter exception serialization + * Added Monolog\Logger::getLevels() to get all available levels + * Fixed ChromePHPHandler so it avoids sending headers larger than Chrome can handle + +### 1.4.1 (2013-04-01) + + * Fixed exception formatting in the LineFormatter to be more minimalistic + * Fixed RavenHandler's handling of context/extra data, requires Raven client >0.1.0 + * Fixed log rotation in RotatingFileHandler to work with long running scripts spanning multiple days + * Fixed WebProcessor array access so it checks for data presence + * Fixed Buffer, Group and FingersCrossed handlers to make use of their processors + +### 1.4.0 (2013-02-13) + + * Added RedisHandler to log to Redis via the Predis library or the phpredis extension + * Added ZendMonitorHandler to log to the Zend Server monitor + * Added the possibility to pass arrays of handlers and processors directly in the Logger constructor + * Added `$useSSL` option to the PushoverHandler which is enabled by default + * Fixed ChromePHPHandler and FirePHPHandler issue when multiple instances are used simultaneously + * Fixed header injection capability in the NativeMailHandler + +### 1.3.1 (2013-01-11) + + * Fixed LogstashFormatter to be usable with stream handlers + * Fixed GelfMessageFormatter levels on Windows + +### 1.3.0 (2013-01-08) + + * Added PSR-3 compliance, the `Monolog\Logger` class is now an instance of `Psr\Log\LoggerInterface` + * Added PsrLogMessageProcessor that you can selectively enable for full PSR-3 compliance + * Added LogstashFormatter (combine with SocketHandler or StreamHandler to send logs to Logstash) + * Added PushoverHandler to send mobile notifications + * Added CouchDBHandler and DoctrineCouchDBHandler + * Added RavenHandler to send data to Sentry servers + * Added support for the new MongoClient class in MongoDBHandler + * Added microsecond precision to log records' timestamps + * Added `$flushOnOverflow` param to BufferHandler to flush by batches instead of losing + the oldest entries + * Fixed normalization of objects with cyclic references + +### 1.2.1 (2012-08-29) + + * Added new $logopts arg to SyslogHandler to provide custom openlog options + * Fixed fatal error in SyslogHandler + +### 1.2.0 (2012-08-18) + + * Added AmqpHandler (for use with AMQP servers) + * Added CubeHandler + * Added NativeMailerHandler::addHeader() to send custom headers in mails + * Added the possibility to specify more than one recipient in NativeMailerHandler + * Added the possibility to specify float timeouts in SocketHandler + * Added NOTICE and EMERGENCY levels to conform with RFC 5424 + * Fixed the log records to use the php default timezone instead of UTC + * Fixed BufferHandler not being flushed properly on PHP fatal errors + * Fixed normalization of exotic resource types + * Fixed the default format of the SyslogHandler to avoid duplicating datetimes in syslog + +### 1.1.0 (2012-04-23) + + * Added Monolog\Logger::isHandling() to check if a handler will + handle the given log level + * Added ChromePHPHandler + * Added MongoDBHandler + * Added GelfHandler (for use with Graylog2 servers) + * Added SocketHandler (for use with syslog-ng for example) + * Added NormalizerFormatter + * Added the possibility to change the activation strategy of the FingersCrossedHandler + * Added possibility to show microseconds in logs + * Added `server` and `referer` to WebProcessor output + +### 1.0.2 (2011-10-24) + + * Fixed bug in IE with large response headers and FirePHPHandler + +### 1.0.1 (2011-08-25) + + * Added MemoryPeakUsageProcessor and MemoryUsageProcessor + * Added Monolog\Logger::getName() to get a logger's channel name + +### 1.0.0 (2011-07-06) + + * Added IntrospectionProcessor to get info from where the logger was called + * Fixed WebProcessor in CLI + +### 1.0.0-RC1 (2011-07-01) + + * Initial release diff --git a/vendor/monolog/monolog/LICENSE b/vendor/monolog/monolog/LICENSE new file mode 100644 index 0000000000..16473219bf --- /dev/null +++ b/vendor/monolog/monolog/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2011-2016 Jordi Boggiano + +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/monolog/monolog/README.md b/vendor/monolog/monolog/README.md new file mode 100644 index 0000000000..a578eb2289 --- /dev/null +++ b/vendor/monolog/monolog/README.md @@ -0,0 +1,94 @@ +# Monolog - Logging for PHP [![Build Status](https://img.shields.io/travis/Seldaek/monolog.svg)](https://travis-ci.org/Seldaek/monolog) + +[![Total Downloads](https://img.shields.io/packagist/dt/monolog/monolog.svg)](https://packagist.org/packages/monolog/monolog) +[![Latest Stable Version](https://img.shields.io/packagist/v/monolog/monolog.svg)](https://packagist.org/packages/monolog/monolog) + + +Monolog sends your logs to files, sockets, inboxes, databases and various +web services. See the complete list of handlers below. Special handlers +allow you to build advanced logging strategies. + +This library implements the [PSR-3](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md) +interface that you can type-hint against in your own libraries to keep +a maximum of interoperability. You can also use it in your applications to +make sure you can always use another compatible logger at a later time. +As of 1.11.0 Monolog public APIs will also accept PSR-3 log levels. +Internally Monolog still uses its own level scheme since it predates PSR-3. + +## Installation + +Install the latest version with + +```bash +$ composer require monolog/monolog +``` + +## Basic Usage + +```php +pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING)); + +// add records to the log +$log->addWarning('Foo'); +$log->addError('Bar'); +``` + +## Documentation + +- [Usage Instructions](doc/01-usage.md) +- [Handlers, Formatters and Processors](doc/02-handlers-formatters-processors.md) +- [Utility classes](doc/03-utilities.md) +- [Extending Monolog](doc/04-extending.md) + +## Third Party Packages + +Third party handlers, formatters and processors are +[listed in the wiki](https://github.com/Seldaek/monolog/wiki/Third-Party-Packages). You +can also add your own there if you publish one. + +## About + +### Requirements + +- Monolog works with PHP 5.3 or above, and is also tested to work with HHVM. + +### Submitting bugs and feature requests + +Bugs and feature request are tracked on [GitHub](https://github.com/Seldaek/monolog/issues) + +### Framework Integrations + +- Frameworks and libraries using [PSR-3](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md) + can be used very easily with Monolog since it implements the interface. +- [Symfony2](http://symfony.com) comes out of the box with Monolog. +- [Silex](http://silex.sensiolabs.org/) comes out of the box with Monolog. +- [Laravel 4 & 5](http://laravel.com/) come out of the box with Monolog. +- [Lumen](http://lumen.laravel.com/) comes out of the box with Monolog. +- [PPI](http://www.ppi.io/) comes out of the box with Monolog. +- [CakePHP](http://cakephp.org/) is usable with Monolog via the [cakephp-monolog](https://github.com/jadb/cakephp-monolog) plugin. +- [Slim](http://www.slimframework.com/) is usable with Monolog via the [Slim-Monolog](https://github.com/Flynsarmy/Slim-Monolog) log writer. +- [XOOPS 2.6](http://xoops.org/) comes out of the box with Monolog. +- [Aura.Web_Project](https://github.com/auraphp/Aura.Web_Project) comes out of the box with Monolog. +- [Nette Framework](http://nette.org/en/) can be used with Monolog via [Kdyby/Monolog](https://github.com/Kdyby/Monolog) extension. +- [Proton Micro Framework](https://github.com/alexbilbie/Proton) comes out of the box with Monolog. + +### Author + +Jordi Boggiano - -
+See also the list of [contributors](https://github.com/Seldaek/monolog/contributors) which participated in this project. + +### License + +Monolog is licensed under the MIT License - see the `LICENSE` file for details + +### Acknowledgements + +This library is heavily inspired by Python's [Logbook](https://logbook.readthedocs.io/en/stable/) +library, although most concepts have been adjusted to fit to the PHP world. diff --git a/vendor/monolog/monolog/composer.json b/vendor/monolog/monolog/composer.json new file mode 100644 index 0000000000..e171e20297 --- /dev/null +++ b/vendor/monolog/monolog/composer.json @@ -0,0 +1,65 @@ +{ + "name": "monolog/monolog", + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "keywords": ["log", "logging", "psr-3"], + "homepage": "http://github.com/Seldaek/monolog", + "type": "library", + "license": "MIT", + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "require": { + "php": ">=5.3.0", + "psr/log": "~1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.5", + "graylog2/gelf-php": "~1.0", + "sentry/sentry": "^0.13", + "ruflin/elastica": ">=0.90 <3.0", + "doctrine/couchdb": "~1.0@dev", + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "php-amqplib/php-amqplib": "~2.4", + "swiftmailer/swiftmailer": "^5.3|^6.0", + "php-console/php-console": "^3.1.3", + "php-parallel-lint/php-parallel-lint": "^1.0" + }, + "suggest": { + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "sentry/sentry": "Allow sending log messages to a Sentry server", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-mongo": "Allow sending log messages to a MongoDB server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver", + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "php-console/php-console": "Allow sending log messages to Google Chrome" + }, + "autoload": { + "psr-4": {"Monolog\\": "src/Monolog"} + }, + "autoload-dev": { + "psr-4": {"Monolog\\": "tests/Monolog"} + }, + "provide": { + "psr/log-implementation": "1.0.0" + }, + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "scripts": { + "test": [ + "parallel-lint . --exclude vendor --exclude src/Monolog/Handler/FormattableHandlerInterface.php --exclude src/Monolog/Handler/FormattableHandlerTrait.php --exclude src/Monolog/Handler/ProcessableHandlerInterface.php --exclude src/Monolog/Handler/ProcessableHandlerTrait.php", + "phpunit" + ] + }, + "lock": false +} diff --git a/vendor/monolog/monolog/src/Monolog/ErrorHandler.php b/vendor/monolog/monolog/src/Monolog/ErrorHandler.php new file mode 100644 index 0000000000..36ec0098fd --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/ErrorHandler.php @@ -0,0 +1,238 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog; + +use Psr\Log\LoggerInterface; +use Psr\Log\LogLevel; +use Monolog\Handler\AbstractHandler; + +/** + * Monolog error handler + * + * A facility to enable logging of runtime errors, exceptions and fatal errors. + * + * Quick setup: ErrorHandler::register($logger); + * + * @author Jordi Boggiano + */ +class ErrorHandler +{ + private $logger; + + private $previousExceptionHandler; + private $uncaughtExceptionLevel; + + private $previousErrorHandler; + private $errorLevelMap; + private $handleOnlyReportedErrors; + + private $hasFatalErrorHandler; + private $fatalLevel; + private $reservedMemory; + private $lastFatalTrace; + private static $fatalErrors = array(E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR); + + public function __construct(LoggerInterface $logger) + { + $this->logger = $logger; + } + + /** + * Registers a new ErrorHandler for a given Logger + * + * By default it will handle errors, exceptions and fatal errors + * + * @param LoggerInterface $logger + * @param array|false $errorLevelMap an array of E_* constant to LogLevel::* constant mapping, or false to disable error handling + * @param int|false $exceptionLevel a LogLevel::* constant, or false to disable exception handling + * @param int|false $fatalLevel a LogLevel::* constant, or false to disable fatal error handling + * @return ErrorHandler + */ + public static function register(LoggerInterface $logger, $errorLevelMap = array(), $exceptionLevel = null, $fatalLevel = null) + { + //Forces the autoloader to run for LogLevel. Fixes an autoload issue at compile-time on PHP5.3. See https://github.com/Seldaek/monolog/pull/929 + class_exists('\\Psr\\Log\\LogLevel', true); + + $handler = new static($logger); + if ($errorLevelMap !== false) { + $handler->registerErrorHandler($errorLevelMap); + } + if ($exceptionLevel !== false) { + $handler->registerExceptionHandler($exceptionLevel); + } + if ($fatalLevel !== false) { + $handler->registerFatalHandler($fatalLevel); + } + + return $handler; + } + + public function registerExceptionHandler($level = null, $callPrevious = true) + { + $prev = set_exception_handler(array($this, 'handleException')); + $this->uncaughtExceptionLevel = $level; + if ($callPrevious && $prev) { + $this->previousExceptionHandler = $prev; + } + } + + public function registerErrorHandler(array $levelMap = array(), $callPrevious = true, $errorTypes = -1, $handleOnlyReportedErrors = true) + { + $prev = set_error_handler(array($this, 'handleError'), $errorTypes); + $this->errorLevelMap = array_replace($this->defaultErrorLevelMap(), $levelMap); + if ($callPrevious) { + $this->previousErrorHandler = $prev ?: true; + } + + $this->handleOnlyReportedErrors = $handleOnlyReportedErrors; + } + + public function registerFatalHandler($level = null, $reservedMemorySize = 20) + { + register_shutdown_function(array($this, 'handleFatalError')); + + $this->reservedMemory = str_repeat(' ', 1024 * $reservedMemorySize); + $this->fatalLevel = $level; + $this->hasFatalErrorHandler = true; + } + + protected function defaultErrorLevelMap() + { + return array( + E_ERROR => LogLevel::CRITICAL, + E_WARNING => LogLevel::WARNING, + E_PARSE => LogLevel::ALERT, + E_NOTICE => LogLevel::NOTICE, + E_CORE_ERROR => LogLevel::CRITICAL, + E_CORE_WARNING => LogLevel::WARNING, + E_COMPILE_ERROR => LogLevel::ALERT, + E_COMPILE_WARNING => LogLevel::WARNING, + E_USER_ERROR => LogLevel::ERROR, + E_USER_WARNING => LogLevel::WARNING, + E_USER_NOTICE => LogLevel::NOTICE, + E_STRICT => LogLevel::NOTICE, + E_RECOVERABLE_ERROR => LogLevel::ERROR, + E_DEPRECATED => LogLevel::NOTICE, + E_USER_DEPRECATED => LogLevel::NOTICE, + ); + } + + /** + * @private + */ + public function handleException($e) + { + $this->logger->log( + $this->uncaughtExceptionLevel === null ? LogLevel::ERROR : $this->uncaughtExceptionLevel, + sprintf('Uncaught Exception %s: "%s" at %s line %s', Utils::getClass($e), $e->getMessage(), $e->getFile(), $e->getLine()), + array('exception' => $e) + ); + + if ($this->previousExceptionHandler) { + call_user_func($this->previousExceptionHandler, $e); + } + + exit(255); + } + + /** + * @private + */ + public function handleError($code, $message, $file = '', $line = 0, $context = array()) + { + if ($this->handleOnlyReportedErrors && !(error_reporting() & $code)) { + return; + } + + // fatal error codes are ignored if a fatal error handler is present as well to avoid duplicate log entries + if (!$this->hasFatalErrorHandler || !in_array($code, self::$fatalErrors, true)) { + $level = isset($this->errorLevelMap[$code]) ? $this->errorLevelMap[$code] : LogLevel::CRITICAL; + $this->logger->log($level, self::codeToString($code).': '.$message, array('code' => $code, 'message' => $message, 'file' => $file, 'line' => $line)); + } else { + // http://php.net/manual/en/function.debug-backtrace.php + // As of 5.3.6, DEBUG_BACKTRACE_IGNORE_ARGS option was added. + // Any version less than 5.3.6 must use the DEBUG_BACKTRACE_IGNORE_ARGS constant value '2'. + $trace = debug_backtrace((PHP_VERSION_ID < 50306) ? 2 : DEBUG_BACKTRACE_IGNORE_ARGS); + array_shift($trace); // Exclude handleError from trace + $this->lastFatalTrace = $trace; + } + + if ($this->previousErrorHandler === true) { + return false; + } elseif ($this->previousErrorHandler) { + return call_user_func($this->previousErrorHandler, $code, $message, $file, $line, $context); + } + } + + /** + * @private + */ + public function handleFatalError() + { + $this->reservedMemory = null; + + $lastError = error_get_last(); + if ($lastError && in_array($lastError['type'], self::$fatalErrors, true)) { + $this->logger->log( + $this->fatalLevel === null ? LogLevel::ALERT : $this->fatalLevel, + 'Fatal Error ('.self::codeToString($lastError['type']).'): '.$lastError['message'], + array('code' => $lastError['type'], 'message' => $lastError['message'], 'file' => $lastError['file'], 'line' => $lastError['line'], 'trace' => $this->lastFatalTrace) + ); + + if ($this->logger instanceof Logger) { + foreach ($this->logger->getHandlers() as $handler) { + if ($handler instanceof AbstractHandler) { + $handler->close(); + } + } + } + } + } + + private static function codeToString($code) + { + switch ($code) { + case E_ERROR: + return 'E_ERROR'; + case E_WARNING: + return 'E_WARNING'; + case E_PARSE: + return 'E_PARSE'; + case E_NOTICE: + return 'E_NOTICE'; + case E_CORE_ERROR: + return 'E_CORE_ERROR'; + case E_CORE_WARNING: + return 'E_CORE_WARNING'; + case E_COMPILE_ERROR: + return 'E_COMPILE_ERROR'; + case E_COMPILE_WARNING: + return 'E_COMPILE_WARNING'; + case E_USER_ERROR: + return 'E_USER_ERROR'; + case E_USER_WARNING: + return 'E_USER_WARNING'; + case E_USER_NOTICE: + return 'E_USER_NOTICE'; + case E_STRICT: + return 'E_STRICT'; + case E_RECOVERABLE_ERROR: + return 'E_RECOVERABLE_ERROR'; + case E_DEPRECATED: + return 'E_DEPRECATED'; + case E_USER_DEPRECATED: + return 'E_USER_DEPRECATED'; + } + + return 'Unknown PHP error'; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php new file mode 100644 index 0000000000..9beda1e763 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.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 Monolog\Formatter; + +use Monolog\Logger; + +/** + * Formats a log message according to the ChromePHP array format + * + * @author Christophe Coevoet + */ +class ChromePHPFormatter implements FormatterInterface +{ + /** + * Translates Monolog log levels to Wildfire levels. + */ + private $logLevels = array( + Logger::DEBUG => 'log', + Logger::INFO => 'info', + Logger::NOTICE => 'info', + Logger::WARNING => 'warn', + Logger::ERROR => 'error', + Logger::CRITICAL => 'error', + Logger::ALERT => 'error', + Logger::EMERGENCY => 'error', + ); + + /** + * {@inheritdoc} + */ + public function format(array $record) + { + // Retrieve the line and file if set and remove them from the formatted extra + $backtrace = 'unknown'; + if (isset($record['extra']['file'], $record['extra']['line'])) { + $backtrace = $record['extra']['file'].' : '.$record['extra']['line']; + unset($record['extra']['file'], $record['extra']['line']); + } + + $message = array('message' => $record['message']); + if ($record['context']) { + $message['context'] = $record['context']; + } + if ($record['extra']) { + $message['extra'] = $record['extra']; + } + if (count($message) === 1) { + $message = reset($message); + } + + return array( + $record['channel'], + $message, + $backtrace, + $this->logLevels[$record['level']], + ); + } + + public function formatBatch(array $records) + { + $formatted = array(); + + foreach ($records as $record) { + $formatted[] = $this->format($record); + } + + return $formatted; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php new file mode 100644 index 0000000000..4c556cf178 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php @@ -0,0 +1,89 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +use Elastica\Document; + +/** + * Format a log message into an Elastica Document + * + * @author Jelle Vink + */ +class ElasticaFormatter extends NormalizerFormatter +{ + /** + * @var string Elastic search index name + */ + protected $index; + + /** + * @var string Elastic search document type + */ + protected $type; + + /** + * @param string $index Elastic Search index name + * @param string $type Elastic Search document type + */ + public function __construct($index, $type) + { + // elasticsearch requires a ISO 8601 format date with optional millisecond precision. + parent::__construct('Y-m-d\TH:i:s.uP'); + + $this->index = $index; + $this->type = $type; + } + + /** + * {@inheritdoc} + */ + public function format(array $record) + { + $record = parent::format($record); + + return $this->getDocument($record); + } + + /** + * Getter index + * @return string + */ + public function getIndex() + { + return $this->index; + } + + /** + * Getter type + * @return string + */ + public function getType() + { + return $this->type; + } + + /** + * Convert a log message into an Elastica Document + * + * @param array $record Log message + * @return Document + */ + protected function getDocument($record) + { + $document = new Document(); + $document->setData($record); + $document->setType($this->type); + $document->setIndex($this->index); + + return $document; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php new file mode 100644 index 0000000000..5094af3c77 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php @@ -0,0 +1,116 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +/** + * formats the record to be used in the FlowdockHandler + * + * @author Dominik Liebler + */ +class FlowdockFormatter implements FormatterInterface +{ + /** + * @var string + */ + private $source; + + /** + * @var string + */ + private $sourceEmail; + + /** + * @param string $source + * @param string $sourceEmail + */ + public function __construct($source, $sourceEmail) + { + $this->source = $source; + $this->sourceEmail = $sourceEmail; + } + + /** + * {@inheritdoc} + */ + public function format(array $record) + { + $tags = array( + '#logs', + '#' . strtolower($record['level_name']), + '#' . $record['channel'], + ); + + foreach ($record['extra'] as $value) { + $tags[] = '#' . $value; + } + + $subject = sprintf( + 'in %s: %s - %s', + $this->source, + $record['level_name'], + $this->getShortMessage($record['message']) + ); + + $record['flowdock'] = array( + 'source' => $this->source, + 'from_address' => $this->sourceEmail, + 'subject' => $subject, + 'content' => $record['message'], + 'tags' => $tags, + 'project' => $this->source, + ); + + return $record; + } + + /** + * {@inheritdoc} + */ + public function formatBatch(array $records) + { + $formatted = array(); + + foreach ($records as $record) { + $formatted[] = $this->format($record); + } + + return $formatted; + } + + /** + * @param string $message + * + * @return string + */ + public function getShortMessage($message) + { + static $hasMbString; + + if (null === $hasMbString) { + $hasMbString = function_exists('mb_strlen'); + } + + $maxLength = 45; + + if ($hasMbString) { + if (mb_strlen($message, 'UTF-8') > $maxLength) { + $message = mb_substr($message, 0, $maxLength - 4, 'UTF-8') . ' ...'; + } + } else { + if (strlen($message) > $maxLength) { + $message = substr($message, 0, $maxLength - 4) . ' ...'; + } + } + + return $message; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php new file mode 100644 index 0000000000..f8ead47569 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php @@ -0,0 +1,88 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +use Monolog\Utils; + +/** + * Class FluentdFormatter + * + * Serializes a log message to Fluentd unix socket protocol + * + * Fluentd config: + * + * + * type unix + * path /var/run/td-agent/td-agent.sock + * + * + * Monolog setup: + * + * $logger = new Monolog\Logger('fluent.tag'); + * $fluentHandler = new Monolog\Handler\SocketHandler('unix:///var/run/td-agent/td-agent.sock'); + * $fluentHandler->setFormatter(new Monolog\Formatter\FluentdFormatter()); + * $logger->pushHandler($fluentHandler); + * + * @author Andrius Putna + */ +class FluentdFormatter implements FormatterInterface +{ + /** + * @var bool $levelTag should message level be a part of the fluentd tag + */ + protected $levelTag = false; + + public function __construct($levelTag = false) + { + if (!function_exists('json_encode')) { + throw new \RuntimeException('PHP\'s json extension is required to use Monolog\'s FluentdUnixFormatter'); + } + + $this->levelTag = (bool) $levelTag; + } + + public function isUsingLevelsInTag() + { + return $this->levelTag; + } + + public function format(array $record) + { + $tag = $record['channel']; + if ($this->levelTag) { + $tag .= '.' . strtolower($record['level_name']); + } + + $message = array( + 'message' => $record['message'], + 'context' => $record['context'], + 'extra' => $record['extra'], + ); + + if (!$this->levelTag) { + $message['level'] = $record['level']; + $message['level_name'] = $record['level_name']; + } + + return Utils::jsonEncode(array($tag, $record['datetime']->getTimestamp(), $message)); + } + + public function formatBatch(array $records) + { + $message = ''; + foreach ($records as $record) { + $message .= $this->format($record); + } + + return $message; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php b/vendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php new file mode 100644 index 0000000000..b5de751112 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +/** + * Interface for formatters + * + * @author Jordi Boggiano + */ +interface FormatterInterface +{ + /** + * Formats a log record. + * + * @param array $record A record to format + * @return mixed The formatted record + */ + public function format(array $record); + + /** + * Formats a set of log records. + * + * @param array $records A set of records to format + * @return mixed The formatted set of records + */ + public function formatBatch(array $records); +} diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php new file mode 100644 index 0000000000..2c1b0e86c5 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php @@ -0,0 +1,138 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +use Monolog\Logger; +use Gelf\Message; + +/** + * Serializes a log message to GELF + * @see http://www.graylog2.org/about/gelf + * + * @author Matt Lehner + */ +class GelfMessageFormatter extends NormalizerFormatter +{ + const DEFAULT_MAX_LENGTH = 32766; + + /** + * @var string the name of the system for the Gelf log message + */ + protected $systemName; + + /** + * @var string a prefix for 'extra' fields from the Monolog record (optional) + */ + protected $extraPrefix; + + /** + * @var string a prefix for 'context' fields from the Monolog record (optional) + */ + protected $contextPrefix; + + /** + * @var int max length per field + */ + protected $maxLength; + + /** + * Translates Monolog log levels to Graylog2 log priorities. + */ + private $logLevels = array( + Logger::DEBUG => 7, + Logger::INFO => 6, + Logger::NOTICE => 5, + Logger::WARNING => 4, + Logger::ERROR => 3, + Logger::CRITICAL => 2, + Logger::ALERT => 1, + Logger::EMERGENCY => 0, + ); + + public function __construct($systemName = null, $extraPrefix = null, $contextPrefix = 'ctxt_', $maxLength = null) + { + parent::__construct('U.u'); + + $this->systemName = $systemName ?: gethostname(); + + $this->extraPrefix = $extraPrefix; + $this->contextPrefix = $contextPrefix; + $this->maxLength = is_null($maxLength) ? self::DEFAULT_MAX_LENGTH : $maxLength; + } + + /** + * {@inheritdoc} + */ + public function format(array $record) + { + $record = parent::format($record); + + if (!isset($record['datetime'], $record['message'], $record['level'])) { + throw new \InvalidArgumentException('The record should at least contain datetime, message and level keys, '.var_export($record, true).' given'); + } + + $message = new Message(); + $message + ->setTimestamp($record['datetime']) + ->setShortMessage((string) $record['message']) + ->setHost($this->systemName) + ->setLevel($this->logLevels[$record['level']]); + + // message length + system name length + 200 for padding / metadata + $len = 200 + strlen((string) $record['message']) + strlen($this->systemName); + + if ($len > $this->maxLength) { + $message->setShortMessage(substr($record['message'], 0, $this->maxLength)); + } + + if (isset($record['channel'])) { + $message->setFacility($record['channel']); + } + if (isset($record['extra']['line'])) { + $message->setLine($record['extra']['line']); + unset($record['extra']['line']); + } + if (isset($record['extra']['file'])) { + $message->setFile($record['extra']['file']); + unset($record['extra']['file']); + } + + foreach ($record['extra'] as $key => $val) { + $val = is_scalar($val) || null === $val ? $val : $this->toJson($val); + $len = strlen($this->extraPrefix . $key . $val); + if ($len > $this->maxLength) { + $message->setAdditional($this->extraPrefix . $key, substr($val, 0, $this->maxLength)); + break; + } + $message->setAdditional($this->extraPrefix . $key, $val); + } + + foreach ($record['context'] as $key => $val) { + $val = is_scalar($val) || null === $val ? $val : $this->toJson($val); + $len = strlen($this->contextPrefix . $key . $val); + if ($len > $this->maxLength) { + $message->setAdditional($this->contextPrefix . $key, substr($val, 0, $this->maxLength)); + break; + } + $message->setAdditional($this->contextPrefix . $key, $val); + } + + if (null === $message->getFile() && isset($record['context']['exception']['file'])) { + if (preg_match("/^(.+):([0-9]+)$/", $record['context']['exception']['file'], $matches)) { + $message->setFile($matches[1]); + $message->setLine($matches[2]); + } + } + + return $message; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php new file mode 100644 index 0000000000..9e8d2d0188 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php @@ -0,0 +1,142 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +use Monolog\Logger; +use Monolog\Utils; + +/** + * Formats incoming records into an HTML table + * + * This is especially useful for html email logging + * + * @author Tiago Brito + */ +class HtmlFormatter extends NormalizerFormatter +{ + /** + * Translates Monolog log levels to html color priorities. + */ + protected $logLevels = array( + Logger::DEBUG => '#cccccc', + Logger::INFO => '#468847', + Logger::NOTICE => '#3a87ad', + Logger::WARNING => '#c09853', + Logger::ERROR => '#f0ad4e', + Logger::CRITICAL => '#FF7708', + Logger::ALERT => '#C12A19', + Logger::EMERGENCY => '#000000', + ); + + /** + * @param string $dateFormat The format of the timestamp: one supported by DateTime::format + */ + public function __construct($dateFormat = null) + { + parent::__construct($dateFormat); + } + + /** + * Creates an HTML table row + * + * @param string $th Row header content + * @param string $td Row standard cell content + * @param bool $escapeTd false if td content must not be html escaped + * @return string + */ + protected function addRow($th, $td = ' ', $escapeTd = true) + { + $th = htmlspecialchars($th, ENT_NOQUOTES, 'UTF-8'); + if ($escapeTd) { + $td = '
'.htmlspecialchars($td, ENT_NOQUOTES, 'UTF-8').'
'; + } + + return "\n$th:\n".$td."\n"; + } + + /** + * Create a HTML h1 tag + * + * @param string $title Text to be in the h1 + * @param int $level Error level + * @return string + */ + protected function addTitle($title, $level) + { + $title = htmlspecialchars($title, ENT_NOQUOTES, 'UTF-8'); + + return '

'.$title.'

'; + } + + /** + * Formats a log record. + * + * @param array $record A record to format + * @return mixed The formatted record + */ + public function format(array $record) + { + $output = $this->addTitle($record['level_name'], $record['level']); + $output .= ''; + + $output .= $this->addRow('Message', (string) $record['message']); + $output .= $this->addRow('Time', $record['datetime']->format($this->dateFormat)); + $output .= $this->addRow('Channel', $record['channel']); + if ($record['context']) { + $embeddedTable = '
'; + foreach ($record['context'] as $key => $value) { + $embeddedTable .= $this->addRow($key, $this->convertToString($value)); + } + $embeddedTable .= '
'; + $output .= $this->addRow('Context', $embeddedTable, false); + } + if ($record['extra']) { + $embeddedTable = ''; + foreach ($record['extra'] as $key => $value) { + $embeddedTable .= $this->addRow($key, $this->convertToString($value)); + } + $embeddedTable .= '
'; + $output .= $this->addRow('Extra', $embeddedTable, false); + } + + return $output.''; + } + + /** + * Formats a set of log records. + * + * @param array $records A set of records to format + * @return mixed The formatted set of records + */ + public function formatBatch(array $records) + { + $message = ''; + foreach ($records as $record) { + $message .= $this->format($record); + } + + return $message; + } + + protected function convertToString($data) + { + if (null === $data || is_scalar($data)) { + return (string) $data; + } + + $data = $this->normalize($data); + if (version_compare(PHP_VERSION, '5.4.0', '>=')) { + return Utils::jsonEncode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE, true); + } + + return str_replace('\\/', '/', Utils::jsonEncode($data, null, true)); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php new file mode 100644 index 0000000000..86966b079b --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php @@ -0,0 +1,212 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +use Exception; +use Monolog\Utils; +use Throwable; + +/** + * Encodes whatever record data is passed to it as json + * + * This can be useful to log to databases or remote APIs + * + * @author Jordi Boggiano + */ +class JsonFormatter extends NormalizerFormatter +{ + const BATCH_MODE_JSON = 1; + const BATCH_MODE_NEWLINES = 2; + + protected $batchMode; + protected $appendNewline; + + /** + * @var bool + */ + protected $includeStacktraces = false; + + /** + * @param int $batchMode + * @param bool $appendNewline + */ + public function __construct($batchMode = self::BATCH_MODE_JSON, $appendNewline = true) + { + $this->batchMode = $batchMode; + $this->appendNewline = $appendNewline; + } + + /** + * The batch mode option configures the formatting style for + * multiple records. By default, multiple records will be + * formatted as a JSON-encoded array. However, for + * compatibility with some API endpoints, alternative styles + * are available. + * + * @return int + */ + public function getBatchMode() + { + return $this->batchMode; + } + + /** + * True if newlines are appended to every formatted record + * + * @return bool + */ + public function isAppendingNewlines() + { + return $this->appendNewline; + } + + /** + * {@inheritdoc} + */ + public function format(array $record) + { + return $this->toJson($this->normalize($record), true) . ($this->appendNewline ? "\n" : ''); + } + + /** + * {@inheritdoc} + */ + public function formatBatch(array $records) + { + switch ($this->batchMode) { + case static::BATCH_MODE_NEWLINES: + return $this->formatBatchNewlines($records); + + case static::BATCH_MODE_JSON: + default: + return $this->formatBatchJson($records); + } + } + + /** + * @param bool $include + */ + public function includeStacktraces($include = true) + { + $this->includeStacktraces = $include; + } + + /** + * Return a JSON-encoded array of records. + * + * @param array $records + * @return string + */ + protected function formatBatchJson(array $records) + { + return $this->toJson($this->normalize($records), true); + } + + /** + * Use new lines to separate records instead of a + * JSON-encoded array. + * + * @param array $records + * @return string + */ + protected function formatBatchNewlines(array $records) + { + $instance = $this; + + $oldNewline = $this->appendNewline; + $this->appendNewline = false; + array_walk($records, function (&$value, $key) use ($instance) { + $value = $instance->format($value); + }); + $this->appendNewline = $oldNewline; + + return implode("\n", $records); + } + + /** + * Normalizes given $data. + * + * @param mixed $data + * + * @return mixed + */ + protected function normalize($data, $depth = 0) + { + if ($depth > 9) { + return 'Over 9 levels deep, aborting normalization'; + } + + if (is_array($data)) { + $normalized = array(); + + $count = 1; + foreach ($data as $key => $value) { + if ($count++ > 1000) { + $normalized['...'] = 'Over 1000 items ('.count($data).' total), aborting normalization'; + break; + } + + $normalized[$key] = $this->normalize($value, $depth+1); + } + + return $normalized; + } + + if ($data instanceof Exception || $data instanceof Throwable) { + return $this->normalizeException($data); + } + + if (is_resource($data)) { + return parent::normalize($data); + } + + return $data; + } + + /** + * Normalizes given exception with or without its own stack trace based on + * `includeStacktraces` property. + * + * @param Exception|Throwable $e + * + * @return array + */ + protected function normalizeException($e) + { + // TODO 2.0 only check for Throwable + if (!$e instanceof Exception && !$e instanceof Throwable) { + throw new \InvalidArgumentException('Exception/Throwable expected, got '.gettype($e).' / '.Utils::getClass($e)); + } + + $data = array( + 'class' => Utils::getClass($e), + 'message' => $e->getMessage(), + 'code' => (int) $e->getCode(), + 'file' => $e->getFile().':'.$e->getLine(), + ); + + if ($this->includeStacktraces) { + $trace = $e->getTrace(); + foreach ($trace as $frame) { + if (isset($frame['file'])) { + $data['trace'][] = $frame['file'].':'.$frame['line']; + } + } + } + + if ($previous = $e->getPrevious()) { + $data['previous'] = $this->normalizeException($previous); + } + + return $data; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php new file mode 100644 index 0000000000..acc1fd38f3 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.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 Monolog\Formatter; + +use Monolog\Utils; + +/** + * Formats incoming records into a one-line string + * + * This is especially useful for logging to files + * + * @author Jordi Boggiano + * @author Christophe Coevoet + */ +class LineFormatter extends NormalizerFormatter +{ + const SIMPLE_FORMAT = "[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n"; + + protected $format; + protected $allowInlineLineBreaks; + protected $ignoreEmptyContextAndExtra; + protected $includeStacktraces; + + /** + * @param string $format The format of the message + * @param string $dateFormat The format of the timestamp: one supported by DateTime::format + * @param bool $allowInlineLineBreaks Whether to allow inline line breaks in log entries + * @param bool $ignoreEmptyContextAndExtra + */ + public function __construct($format = null, $dateFormat = null, $allowInlineLineBreaks = false, $ignoreEmptyContextAndExtra = false) + { + $this->format = $format ?: static::SIMPLE_FORMAT; + $this->allowInlineLineBreaks = $allowInlineLineBreaks; + $this->ignoreEmptyContextAndExtra = $ignoreEmptyContextAndExtra; + parent::__construct($dateFormat); + } + + public function includeStacktraces($include = true) + { + $this->includeStacktraces = $include; + if ($this->includeStacktraces) { + $this->allowInlineLineBreaks = true; + } + } + + public function allowInlineLineBreaks($allow = true) + { + $this->allowInlineLineBreaks = $allow; + } + + public function ignoreEmptyContextAndExtra($ignore = true) + { + $this->ignoreEmptyContextAndExtra = $ignore; + } + + /** + * {@inheritdoc} + */ + public function format(array $record) + { + $vars = parent::format($record); + + $output = $this->format; + + foreach ($vars['extra'] as $var => $val) { + if (false !== strpos($output, '%extra.'.$var.'%')) { + $output = str_replace('%extra.'.$var.'%', $this->stringify($val), $output); + unset($vars['extra'][$var]); + } + } + + + foreach ($vars['context'] as $var => $val) { + if (false !== strpos($output, '%context.'.$var.'%')) { + $output = str_replace('%context.'.$var.'%', $this->stringify($val), $output); + unset($vars['context'][$var]); + } + } + + if ($this->ignoreEmptyContextAndExtra) { + if (empty($vars['context'])) { + unset($vars['context']); + $output = str_replace('%context%', '', $output); + } + + if (empty($vars['extra'])) { + unset($vars['extra']); + $output = str_replace('%extra%', '', $output); + } + } + + foreach ($vars as $var => $val) { + if (false !== strpos($output, '%'.$var.'%')) { + $output = str_replace('%'.$var.'%', $this->stringify($val), $output); + } + } + + // remove leftover %extra.xxx% and %context.xxx% if any + if (false !== strpos($output, '%')) { + $output = preg_replace('/%(?:extra|context)\..+?%/', '', $output); + } + + return $output; + } + + public function formatBatch(array $records) + { + $message = ''; + foreach ($records as $record) { + $message .= $this->format($record); + } + + return $message; + } + + public function stringify($value) + { + return $this->replaceNewlines($this->convertToString($value)); + } + + protected function normalizeException($e) + { + // TODO 2.0 only check for Throwable + if (!$e instanceof \Exception && !$e instanceof \Throwable) { + throw new \InvalidArgumentException('Exception/Throwable expected, got '.gettype($e).' / '.Utils::getClass($e)); + } + + $previousText = ''; + if ($previous = $e->getPrevious()) { + do { + $previousText .= ', '.Utils::getClass($previous).'(code: '.$previous->getCode().'): '.$previous->getMessage().' at '.$previous->getFile().':'.$previous->getLine(); + } while ($previous = $previous->getPrevious()); + } + + $str = '[object] ('.Utils::getClass($e).'(code: '.$e->getCode().'): '.$e->getMessage().' at '.$e->getFile().':'.$e->getLine().$previousText.')'; + if ($this->includeStacktraces) { + $str .= "\n[stacktrace]\n".$e->getTraceAsString()."\n"; + } + + return $str; + } + + protected function convertToString($data) + { + if (null === $data || is_bool($data)) { + return var_export($data, true); + } + + if (is_scalar($data)) { + return (string) $data; + } + + if (version_compare(PHP_VERSION, '5.4.0', '>=')) { + return $this->toJson($data, true); + } + + return str_replace('\\/', '/', $this->toJson($data, true)); + } + + protected function replaceNewlines($str) + { + if ($this->allowInlineLineBreaks) { + if (0 === strpos($str, '{')) { + return str_replace(array('\r', '\n'), array("\r", "\n"), $str); + } + + return $str; + } + + return str_replace(array("\r\n", "\r", "\n"), ' ', $str); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php new file mode 100644 index 0000000000..401859bba6 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +/** + * Encodes message information into JSON in a format compatible with Loggly. + * + * @author Adam Pancutt + */ +class LogglyFormatter extends JsonFormatter +{ + /** + * Overrides the default batch mode to new lines for compatibility with the + * Loggly bulk API. + * + * @param int $batchMode + */ + public function __construct($batchMode = self::BATCH_MODE_NEWLINES, $appendNewline = false) + { + parent::__construct($batchMode, $appendNewline); + } + + /** + * Appends the 'timestamp' parameter for indexing by Loggly. + * + * @see https://www.loggly.com/docs/automated-parsing/#json + * @see \Monolog\Formatter\JsonFormatter::format() + */ + public function format(array $record) + { + if (isset($record["datetime"]) && ($record["datetime"] instanceof \DateTime)) { + $record["timestamp"] = $record["datetime"]->format("Y-m-d\TH:i:s.uO"); + // TODO 2.0 unset the 'datetime' parameter, retained for BC + } + + return parent::format($record); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php new file mode 100644 index 0000000000..8f83bec041 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php @@ -0,0 +1,166 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +/** + * Serializes a log message to Logstash Event Format + * + * @see http://logstash.net/ + * @see https://github.com/logstash/logstash/blob/master/lib/logstash/event.rb + * + * @author Tim Mower + */ +class LogstashFormatter extends NormalizerFormatter +{ + const V0 = 0; + const V1 = 1; + + /** + * @var string the name of the system for the Logstash log message, used to fill the @source field + */ + protected $systemName; + + /** + * @var string an application name for the Logstash log message, used to fill the @type field + */ + protected $applicationName; + + /** + * @var string a prefix for 'extra' fields from the Monolog record (optional) + */ + protected $extraPrefix; + + /** + * @var string a prefix for 'context' fields from the Monolog record (optional) + */ + protected $contextPrefix; + + /** + * @var int logstash format version to use + */ + protected $version; + + /** + * @param string $applicationName the application that sends the data, used as the "type" field of logstash + * @param string $systemName the system/machine name, used as the "source" field of logstash, defaults to the hostname of the machine + * @param string $extraPrefix prefix for extra keys inside logstash "fields" + * @param string $contextPrefix prefix for context keys inside logstash "fields", defaults to ctxt_ + * @param int $version the logstash format version to use, defaults to 0 + */ + public function __construct($applicationName, $systemName = null, $extraPrefix = null, $contextPrefix = 'ctxt_', $version = self::V0) + { + // logstash requires a ISO 8601 format date with optional millisecond precision. + parent::__construct('Y-m-d\TH:i:s.uP'); + + $this->systemName = $systemName ?: gethostname(); + $this->applicationName = $applicationName; + $this->extraPrefix = $extraPrefix; + $this->contextPrefix = $contextPrefix; + $this->version = $version; + } + + /** + * {@inheritdoc} + */ + public function format(array $record) + { + $record = parent::format($record); + + if ($this->version === self::V1) { + $message = $this->formatV1($record); + } else { + $message = $this->formatV0($record); + } + + return $this->toJson($message) . "\n"; + } + + protected function formatV0(array $record) + { + if (empty($record['datetime'])) { + $record['datetime'] = gmdate('c'); + } + $message = array( + '@timestamp' => $record['datetime'], + '@source' => $this->systemName, + '@fields' => array(), + ); + if (isset($record['message'])) { + $message['@message'] = $record['message']; + } + if (isset($record['channel'])) { + $message['@tags'] = array($record['channel']); + $message['@fields']['channel'] = $record['channel']; + } + if (isset($record['level'])) { + $message['@fields']['level'] = $record['level']; + } + if ($this->applicationName) { + $message['@type'] = $this->applicationName; + } + if (isset($record['extra']['server'])) { + $message['@source_host'] = $record['extra']['server']; + } + if (isset($record['extra']['url'])) { + $message['@source_path'] = $record['extra']['url']; + } + if (!empty($record['extra'])) { + foreach ($record['extra'] as $key => $val) { + $message['@fields'][$this->extraPrefix . $key] = $val; + } + } + if (!empty($record['context'])) { + foreach ($record['context'] as $key => $val) { + $message['@fields'][$this->contextPrefix . $key] = $val; + } + } + + return $message; + } + + protected function formatV1(array $record) + { + if (empty($record['datetime'])) { + $record['datetime'] = gmdate('c'); + } + $message = array( + '@timestamp' => $record['datetime'], + '@version' => 1, + 'host' => $this->systemName, + ); + if (isset($record['message'])) { + $message['message'] = $record['message']; + } + if (isset($record['channel'])) { + $message['type'] = $record['channel']; + $message['channel'] = $record['channel']; + } + if (isset($record['level_name'])) { + $message['level'] = $record['level_name']; + } + if ($this->applicationName) { + $message['type'] = $this->applicationName; + } + if (!empty($record['extra'])) { + foreach ($record['extra'] as $key => $val) { + $message[$this->extraPrefix . $key] = $val; + } + } + if (!empty($record['context'])) { + foreach ($record['context'] as $key => $val) { + $message[$this->contextPrefix . $key] = $val; + } + } + + return $message; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php new file mode 100644 index 0000000000..bd9e4c02b4 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php @@ -0,0 +1,107 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +use Monolog\Utils; + +/** + * Formats a record for use with the MongoDBHandler. + * + * @author Florian Plattner + */ +class MongoDBFormatter implements FormatterInterface +{ + private $exceptionTraceAsString; + private $maxNestingLevel; + + /** + * @param int $maxNestingLevel 0 means infinite nesting, the $record itself is level 1, $record['context'] is 2 + * @param bool $exceptionTraceAsString set to false to log exception traces as a sub documents instead of strings + */ + public function __construct($maxNestingLevel = 3, $exceptionTraceAsString = true) + { + $this->maxNestingLevel = max($maxNestingLevel, 0); + $this->exceptionTraceAsString = (bool) $exceptionTraceAsString; + } + + /** + * {@inheritDoc} + */ + public function format(array $record) + { + return $this->formatArray($record); + } + + /** + * {@inheritDoc} + */ + public function formatBatch(array $records) + { + foreach ($records as $key => $record) { + $records[$key] = $this->format($record); + } + + return $records; + } + + protected function formatArray(array $record, $nestingLevel = 0) + { + if ($this->maxNestingLevel == 0 || $nestingLevel <= $this->maxNestingLevel) { + foreach ($record as $name => $value) { + if ($value instanceof \DateTime) { + $record[$name] = $this->formatDate($value, $nestingLevel + 1); + } elseif ($value instanceof \Exception) { + $record[$name] = $this->formatException($value, $nestingLevel + 1); + } elseif (is_array($value)) { + $record[$name] = $this->formatArray($value, $nestingLevel + 1); + } elseif (is_object($value)) { + $record[$name] = $this->formatObject($value, $nestingLevel + 1); + } + } + } else { + $record = '[...]'; + } + + return $record; + } + + protected function formatObject($value, $nestingLevel) + { + $objectVars = get_object_vars($value); + $objectVars['class'] = Utils::getClass($value); + + return $this->formatArray($objectVars, $nestingLevel); + } + + protected function formatException(\Exception $exception, $nestingLevel) + { + $formattedException = array( + 'class' => Utils::getClass($exception), + 'message' => $exception->getMessage(), + 'code' => (int) $exception->getCode(), + 'file' => $exception->getFile() . ':' . $exception->getLine(), + ); + + if ($this->exceptionTraceAsString === true) { + $formattedException['trace'] = $exception->getTraceAsString(); + } else { + $formattedException['trace'] = $exception->getTrace(); + } + + return $this->formatArray($formattedException, $nestingLevel); + } + + protected function formatDate(\DateTime $value, $nestingLevel) + { + return new \MongoDate($value->getTimestamp()); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php new file mode 100644 index 0000000000..3a01f2cefb --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php @@ -0,0 +1,180 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +use Exception; +use Monolog\Utils; + +/** + * Normalizes incoming records to remove objects/resources so it's easier to dump to various targets + * + * @author Jordi Boggiano + */ +class NormalizerFormatter implements FormatterInterface +{ + const SIMPLE_DATE = "Y-m-d H:i:s"; + + protected $dateFormat; + + /** + * @param string $dateFormat The format of the timestamp: one supported by DateTime::format + */ + public function __construct($dateFormat = null) + { + $this->dateFormat = $dateFormat ?: static::SIMPLE_DATE; + if (!function_exists('json_encode')) { + throw new \RuntimeException('PHP\'s json extension is required to use Monolog\'s NormalizerFormatter'); + } + } + + /** + * {@inheritdoc} + */ + public function format(array $record) + { + return $this->normalize($record); + } + + /** + * {@inheritdoc} + */ + public function formatBatch(array $records) + { + foreach ($records as $key => $record) { + $records[$key] = $this->format($record); + } + + return $records; + } + + protected function normalize($data, $depth = 0) + { + if ($depth > 9) { + return 'Over 9 levels deep, aborting normalization'; + } + + if (null === $data || is_scalar($data)) { + if (is_float($data)) { + if (is_infinite($data)) { + return ($data > 0 ? '' : '-') . 'INF'; + } + if (is_nan($data)) { + return 'NaN'; + } + } + + return $data; + } + + if (is_array($data)) { + $normalized = array(); + + $count = 1; + foreach ($data as $key => $value) { + if ($count++ > 1000) { + $normalized['...'] = 'Over 1000 items ('.count($data).' total), aborting normalization'; + break; + } + + $normalized[$key] = $this->normalize($value, $depth+1); + } + + return $normalized; + } + + if ($data instanceof \DateTime) { + return $data->format($this->dateFormat); + } + + if (is_object($data)) { + // TODO 2.0 only check for Throwable + if ($data instanceof Exception || (PHP_VERSION_ID > 70000 && $data instanceof \Throwable)) { + return $this->normalizeException($data); + } + + // non-serializable objects that implement __toString stringified + if (method_exists($data, '__toString') && !$data instanceof \JsonSerializable) { + $value = $data->__toString(); + } else { + // the rest is json-serialized in some way + $value = $this->toJson($data, true); + } + + return sprintf("[object] (%s: %s)", Utils::getClass($data), $value); + } + + if (is_resource($data)) { + return sprintf('[resource] (%s)', get_resource_type($data)); + } + + return '[unknown('.gettype($data).')]'; + } + + protected function normalizeException($e) + { + // TODO 2.0 only check for Throwable + if (!$e instanceof Exception && !$e instanceof \Throwable) { + throw new \InvalidArgumentException('Exception/Throwable expected, got '.gettype($e).' / '.Utils::getClass($e)); + } + + $data = array( + 'class' => Utils::getClass($e), + 'message' => $e->getMessage(), + 'code' => (int) $e->getCode(), + 'file' => $e->getFile().':'.$e->getLine(), + ); + + if ($e instanceof \SoapFault) { + if (isset($e->faultcode)) { + $data['faultcode'] = $e->faultcode; + } + + if (isset($e->faultactor)) { + $data['faultactor'] = $e->faultactor; + } + + if (isset($e->detail)) { + if (is_string($e->detail)) { + $data['detail'] = $e->detail; + } elseif (is_object($e->detail) || is_array($e->detail)) { + $data['detail'] = $this->toJson($e->detail, true); + } + } + } + + $trace = $e->getTrace(); + foreach ($trace as $frame) { + if (isset($frame['file'])) { + $data['trace'][] = $frame['file'].':'.$frame['line']; + } + } + + if ($previous = $e->getPrevious()) { + $data['previous'] = $this->normalizeException($previous); + } + + return $data; + } + + /** + * Return the JSON representation of a value + * + * @param mixed $data + * @param bool $ignoreErrors + * @throws \RuntimeException if encoding fails and errors are not ignored + * @return string + */ + protected function toJson($data, $ignoreErrors = false) + { + return Utils::jsonEncode($data, null, $ignoreErrors); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php new file mode 100644 index 0000000000..5d345d53c6 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php @@ -0,0 +1,48 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +/** + * Formats data into an associative array of scalar values. + * Objects and arrays will be JSON encoded. + * + * @author Andrew Lawson + */ +class ScalarFormatter extends NormalizerFormatter +{ + /** + * {@inheritdoc} + */ + public function format(array $record) + { + foreach ($record as $key => $value) { + $record[$key] = $this->normalizeValue($value); + } + + return $record; + } + + /** + * @param mixed $value + * @return mixed + */ + protected function normalizeValue($value) + { + $normalized = $this->normalize($value); + + if (is_array($normalized) || is_object($normalized)) { + return $this->toJson($normalized, true); + } + + return $normalized; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php new file mode 100644 index 0000000000..65dba99c9e --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php @@ -0,0 +1,113 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +use Monolog\Logger; + +/** + * Serializes a log message according to Wildfire's header requirements + * + * @author Eric Clemmons (@ericclemmons) + * @author Christophe Coevoet + * @author Kirill chEbba Chebunin + */ +class WildfireFormatter extends NormalizerFormatter +{ + const TABLE = 'table'; + + /** + * Translates Monolog log levels to Wildfire levels. + */ + private $logLevels = array( + Logger::DEBUG => 'LOG', + Logger::INFO => 'INFO', + Logger::NOTICE => 'INFO', + Logger::WARNING => 'WARN', + Logger::ERROR => 'ERROR', + Logger::CRITICAL => 'ERROR', + Logger::ALERT => 'ERROR', + Logger::EMERGENCY => 'ERROR', + ); + + /** + * {@inheritdoc} + */ + public function format(array $record) + { + // Retrieve the line and file if set and remove them from the formatted extra + $file = $line = ''; + if (isset($record['extra']['file'])) { + $file = $record['extra']['file']; + unset($record['extra']['file']); + } + if (isset($record['extra']['line'])) { + $line = $record['extra']['line']; + unset($record['extra']['line']); + } + + $record = $this->normalize($record); + $message = array('message' => $record['message']); + $handleError = false; + if ($record['context']) { + $message['context'] = $record['context']; + $handleError = true; + } + if ($record['extra']) { + $message['extra'] = $record['extra']; + $handleError = true; + } + if (count($message) === 1) { + $message = reset($message); + } + + if (isset($record['context'][self::TABLE])) { + $type = 'TABLE'; + $label = $record['channel'] .': '. $record['message']; + $message = $record['context'][self::TABLE]; + } else { + $type = $this->logLevels[$record['level']]; + $label = $record['channel']; + } + + // Create JSON object describing the appearance of the message in the console + $json = $this->toJson(array( + array( + 'Type' => $type, + 'File' => $file, + 'Line' => $line, + 'Label' => $label, + ), + $message, + ), $handleError); + + // The message itself is a serialization of the above JSON object + it's length + return sprintf( + '%s|%s|', + strlen($json), + $json + ); + } + + public function formatBatch(array $records) + { + throw new \BadMethodCallException('Batch formatting does not make sense for the WildfireFormatter'); + } + + protected function normalize($data, $depth = 0) + { + if (is_object($data) && !$data instanceof \DateTime) { + return $data; + } + + return parent::normalize($data, $depth); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php new file mode 100644 index 0000000000..cdd9f7d402 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php @@ -0,0 +1,196 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\LineFormatter; +use Monolog\Logger; +use Monolog\ResettableInterface; + +/** + * Base Handler class providing the Handler structure + * + * @author Jordi Boggiano + */ +abstract class AbstractHandler implements HandlerInterface, ResettableInterface +{ + protected $level = Logger::DEBUG; + protected $bubble = true; + + /** + * @var FormatterInterface + */ + protected $formatter; + protected $processors = array(); + + /** + * @param int|string $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct($level = Logger::DEBUG, $bubble = true) + { + $this->setLevel($level); + $this->bubble = $bubble; + } + + /** + * {@inheritdoc} + */ + public function isHandling(array $record) + { + return $record['level'] >= $this->level; + } + + /** + * {@inheritdoc} + */ + public function handleBatch(array $records) + { + foreach ($records as $record) { + $this->handle($record); + } + } + + /** + * Closes the handler. + * + * This will be called automatically when the object is destroyed + */ + public function close() + { + } + + /** + * {@inheritdoc} + */ + public function pushProcessor($callback) + { + if (!is_callable($callback)) { + throw new \InvalidArgumentException('Processors must be valid callables (callback or object with an __invoke method), '.var_export($callback, true).' given'); + } + array_unshift($this->processors, $callback); + + return $this; + } + + /** + * {@inheritdoc} + */ + public function popProcessor() + { + if (!$this->processors) { + throw new \LogicException('You tried to pop from an empty processor stack.'); + } + + return array_shift($this->processors); + } + + /** + * {@inheritdoc} + */ + public function setFormatter(FormatterInterface $formatter) + { + $this->formatter = $formatter; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getFormatter() + { + if (!$this->formatter) { + $this->formatter = $this->getDefaultFormatter(); + } + + return $this->formatter; + } + + /** + * Sets minimum logging level at which this handler will be triggered. + * + * @param int|string $level Level or level name + * @return self + */ + public function setLevel($level) + { + $this->level = Logger::toMonologLevel($level); + + return $this; + } + + /** + * Gets minimum logging level at which this handler will be triggered. + * + * @return int + */ + public function getLevel() + { + return $this->level; + } + + /** + * Sets the bubbling behavior. + * + * @param bool $bubble true means that this handler allows bubbling. + * false means that bubbling is not permitted. + * @return self + */ + public function setBubble($bubble) + { + $this->bubble = $bubble; + + return $this; + } + + /** + * Gets the bubbling behavior. + * + * @return bool true means that this handler allows bubbling. + * false means that bubbling is not permitted. + */ + public function getBubble() + { + return $this->bubble; + } + + public function __destruct() + { + try { + $this->close(); + } catch (\Exception $e) { + // do nothing + } catch (\Throwable $e) { + // do nothing + } + } + + public function reset() + { + foreach ($this->processors as $processor) { + if ($processor instanceof ResettableInterface) { + $processor->reset(); + } + } + } + + /** + * Gets the default formatter. + * + * @return FormatterInterface + */ + protected function getDefaultFormatter() + { + return new LineFormatter(); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php new file mode 100644 index 0000000000..e1e89530ad --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php @@ -0,0 +1,68 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\ResettableInterface; + +/** + * Base Handler class providing the Handler structure + * + * Classes extending it should (in most cases) only implement write($record) + * + * @author Jordi Boggiano + * @author Christophe Coevoet + */ +abstract class AbstractProcessingHandler extends AbstractHandler +{ + /** + * {@inheritdoc} + */ + public function handle(array $record) + { + if (!$this->isHandling($record)) { + return false; + } + + $record = $this->processRecord($record); + + $record['formatted'] = $this->getFormatter()->format($record); + + $this->write($record); + + return false === $this->bubble; + } + + /** + * Writes the record down to the log of the implementing handler + * + * @param array $record + * @return void + */ + abstract protected function write(array $record); + + /** + * Processes a record. + * + * @param array $record + * @return array + */ + protected function processRecord(array $record) + { + if ($this->processors) { + foreach ($this->processors as $processor) { + $record = call_user_func($processor, $record); + } + } + + return $record; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php new file mode 100644 index 0000000000..8c76aca0b1 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php @@ -0,0 +1,101 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Formatter\LineFormatter; + +/** + * Common syslog functionality + */ +abstract class AbstractSyslogHandler extends AbstractProcessingHandler +{ + protected $facility; + + /** + * Translates Monolog log levels to syslog log priorities. + */ + protected $logLevels = array( + Logger::DEBUG => LOG_DEBUG, + Logger::INFO => LOG_INFO, + Logger::NOTICE => LOG_NOTICE, + Logger::WARNING => LOG_WARNING, + Logger::ERROR => LOG_ERR, + Logger::CRITICAL => LOG_CRIT, + Logger::ALERT => LOG_ALERT, + Logger::EMERGENCY => LOG_EMERG, + ); + + /** + * List of valid log facility names. + */ + protected $facilities = array( + 'auth' => LOG_AUTH, + 'authpriv' => LOG_AUTHPRIV, + 'cron' => LOG_CRON, + 'daemon' => LOG_DAEMON, + 'kern' => LOG_KERN, + 'lpr' => LOG_LPR, + 'mail' => LOG_MAIL, + 'news' => LOG_NEWS, + 'syslog' => LOG_SYSLOG, + 'user' => LOG_USER, + 'uucp' => LOG_UUCP, + ); + + /** + * @param mixed $facility + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct($facility = LOG_USER, $level = Logger::DEBUG, $bubble = true) + { + parent::__construct($level, $bubble); + + if (!defined('PHP_WINDOWS_VERSION_BUILD')) { + $this->facilities['local0'] = LOG_LOCAL0; + $this->facilities['local1'] = LOG_LOCAL1; + $this->facilities['local2'] = LOG_LOCAL2; + $this->facilities['local3'] = LOG_LOCAL3; + $this->facilities['local4'] = LOG_LOCAL4; + $this->facilities['local5'] = LOG_LOCAL5; + $this->facilities['local6'] = LOG_LOCAL6; + $this->facilities['local7'] = LOG_LOCAL7; + } else { + $this->facilities['local0'] = 128; // LOG_LOCAL0 + $this->facilities['local1'] = 136; // LOG_LOCAL1 + $this->facilities['local2'] = 144; // LOG_LOCAL2 + $this->facilities['local3'] = 152; // LOG_LOCAL3 + $this->facilities['local4'] = 160; // LOG_LOCAL4 + $this->facilities['local5'] = 168; // LOG_LOCAL5 + $this->facilities['local6'] = 176; // LOG_LOCAL6 + $this->facilities['local7'] = 184; // LOG_LOCAL7 + } + + // convert textual description of facility to syslog constant + if (array_key_exists(strtolower($facility), $this->facilities)) { + $facility = $this->facilities[strtolower($facility)]; + } elseif (!in_array($facility, array_values($this->facilities), true)) { + throw new \UnexpectedValueException('Unknown facility value "'.$facility.'" given'); + } + + $this->facility = $facility; + } + + /** + * {@inheritdoc} + */ + protected function getDefaultFormatter() + { + return new LineFormatter('%channel%.%level_name%: %message% %context% %extra%'); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php new file mode 100644 index 0000000000..e5a46bc0d5 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php @@ -0,0 +1,148 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Formatter\JsonFormatter; +use PhpAmqpLib\Message\AMQPMessage; +use PhpAmqpLib\Channel\AMQPChannel; +use AMQPExchange; + +class AmqpHandler extends AbstractProcessingHandler +{ + /** + * @var AMQPExchange|AMQPChannel $exchange + */ + protected $exchange; + + /** + * @var string + */ + protected $exchangeName; + + /** + * @param AMQPExchange|AMQPChannel $exchange AMQPExchange (php AMQP ext) or PHP AMQP lib channel, ready for use + * @param string $exchangeName + * @param int $level + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct($exchange, $exchangeName = 'log', $level = Logger::DEBUG, $bubble = true) + { + if ($exchange instanceof AMQPExchange) { + $exchange->setName($exchangeName); + } elseif ($exchange instanceof AMQPChannel) { + $this->exchangeName = $exchangeName; + } else { + throw new \InvalidArgumentException('PhpAmqpLib\Channel\AMQPChannel or AMQPExchange instance required'); + } + $this->exchange = $exchange; + + parent::__construct($level, $bubble); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record) + { + $data = $record["formatted"]; + $routingKey = $this->getRoutingKey($record); + + if ($this->exchange instanceof AMQPExchange) { + $this->exchange->publish( + $data, + $routingKey, + 0, + array( + 'delivery_mode' => 2, + 'content_type' => 'application/json', + ) + ); + } else { + $this->exchange->basic_publish( + $this->createAmqpMessage($data), + $this->exchangeName, + $routingKey + ); + } + } + + /** + * {@inheritDoc} + */ + public function handleBatch(array $records) + { + if ($this->exchange instanceof AMQPExchange) { + parent::handleBatch($records); + + return; + } + + foreach ($records as $record) { + if (!$this->isHandling($record)) { + continue; + } + + $record = $this->processRecord($record); + $data = $this->getFormatter()->format($record); + + $this->exchange->batch_basic_publish( + $this->createAmqpMessage($data), + $this->exchangeName, + $this->getRoutingKey($record) + ); + } + + $this->exchange->publish_batch(); + } + + /** + * Gets the routing key for the AMQP exchange + * + * @param array $record + * @return string + */ + protected function getRoutingKey(array $record) + { + $routingKey = sprintf( + '%s.%s', + // TODO 2.0 remove substr call + substr($record['level_name'], 0, 4), + $record['channel'] + ); + + return strtolower($routingKey); + } + + /** + * @param string $data + * @return AMQPMessage + */ + private function createAmqpMessage($data) + { + return new AMQPMessage( + (string) $data, + array( + 'delivery_mode' => 2, + 'content_type' => 'application/json', + ) + ); + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter() + { + return new JsonFormatter(JsonFormatter::BATCH_MODE_JSON, false); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php new file mode 100644 index 0000000000..68feb48081 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php @@ -0,0 +1,241 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\LineFormatter; + +/** + * Handler sending logs to browser's javascript console with no browser extension required + * + * @author Olivier Poitrey + */ +class BrowserConsoleHandler extends AbstractProcessingHandler +{ + protected static $initialized = false; + protected static $records = array(); + + /** + * {@inheritDoc} + * + * Formatted output may contain some formatting markers to be transferred to `console.log` using the %c format. + * + * Example of formatted string: + * + * You can do [[blue text]]{color: blue} or [[green background]]{background-color: green; color: white} + */ + protected function getDefaultFormatter() + { + return new LineFormatter('[[%channel%]]{macro: autolabel} [[%level_name%]]{font-weight: bold} %message%'); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record) + { + // Accumulate records + static::$records[] = $record; + + // Register shutdown handler if not already done + if (!static::$initialized) { + static::$initialized = true; + $this->registerShutdownFunction(); + } + } + + /** + * Convert records to javascript console commands and send it to the browser. + * This method is automatically called on PHP shutdown if output is HTML or Javascript. + */ + public static function send() + { + $format = static::getResponseFormat(); + if ($format === 'unknown') { + return; + } + + if (count(static::$records)) { + if ($format === 'html') { + static::writeOutput(''); + } elseif ($format === 'js') { + static::writeOutput(static::generateScript()); + } + static::resetStatic(); + } + } + + public function close() + { + self::resetStatic(); + } + + public function reset() + { + self::resetStatic(); + } + + /** + * Forget all logged records + */ + public static function resetStatic() + { + static::$records = array(); + } + + /** + * Wrapper for register_shutdown_function to allow overriding + */ + protected function registerShutdownFunction() + { + if (PHP_SAPI !== 'cli') { + register_shutdown_function(array('Monolog\Handler\BrowserConsoleHandler', 'send')); + } + } + + /** + * Wrapper for echo to allow overriding + * + * @param string $str + */ + protected static function writeOutput($str) + { + echo $str; + } + + /** + * Checks the format of the response + * + * If Content-Type is set to application/javascript or text/javascript -> js + * If Content-Type is set to text/html, or is unset -> html + * If Content-Type is anything else -> unknown + * + * @return string One of 'js', 'html' or 'unknown' + */ + protected static function getResponseFormat() + { + // Check content type + foreach (headers_list() as $header) { + if (stripos($header, 'content-type:') === 0) { + // This handler only works with HTML and javascript outputs + // text/javascript is obsolete in favour of application/javascript, but still used + if (stripos($header, 'application/javascript') !== false || stripos($header, 'text/javascript') !== false) { + return 'js'; + } + if (stripos($header, 'text/html') === false) { + return 'unknown'; + } + break; + } + } + + return 'html'; + } + + private static function generateScript() + { + $script = array(); + foreach (static::$records as $record) { + $context = static::dump('Context', $record['context']); + $extra = static::dump('Extra', $record['extra']); + + if (empty($context) && empty($extra)) { + $script[] = static::call_array('log', static::handleStyles($record['formatted'])); + } else { + $script = array_merge($script, + array(static::call_array('groupCollapsed', static::handleStyles($record['formatted']))), + $context, + $extra, + array(static::call('groupEnd')) + ); + } + } + + return "(function (c) {if (c && c.groupCollapsed) {\n" . implode("\n", $script) . "\n}})(console);"; + } + + private static function handleStyles($formatted) + { + $args = array(); + $format = '%c' . $formatted; + preg_match_all('/\[\[(.*?)\]\]\{([^}]*)\}/s', $format, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER); + + foreach (array_reverse($matches) as $match) { + $args[] = '"font-weight: normal"'; + $args[] = static::quote(static::handleCustomStyles($match[2][0], $match[1][0])); + + $pos = $match[0][1]; + $format = substr($format, 0, $pos) . '%c' . $match[1][0] . '%c' . substr($format, $pos + strlen($match[0][0])); + } + + $args[] = static::quote('font-weight: normal'); + $args[] = static::quote($format); + + return array_reverse($args); + } + + private static function handleCustomStyles($style, $string) + { + static $colors = array('blue', 'green', 'red', 'magenta', 'orange', 'black', 'grey'); + static $labels = array(); + + return preg_replace_callback('/macro\s*:(.*?)(?:;|$)/', function ($m) use ($string, &$colors, &$labels) { + if (trim($m[1]) === 'autolabel') { + // Format the string as a label with consistent auto assigned background color + if (!isset($labels[$string])) { + $labels[$string] = $colors[count($labels) % count($colors)]; + } + $color = $labels[$string]; + + return "background-color: $color; color: white; border-radius: 3px; padding: 0 2px 0 2px"; + } + + return $m[1]; + }, $style); + } + + private static function dump($title, array $dict) + { + $script = array(); + $dict = array_filter($dict); + if (empty($dict)) { + return $script; + } + $script[] = static::call('log', static::quote('%c%s'), static::quote('font-weight: bold'), static::quote($title)); + foreach ($dict as $key => $value) { + $value = json_encode($value); + if (empty($value)) { + $value = static::quote(''); + } + $script[] = static::call('log', static::quote('%s: %o'), static::quote($key), $value); + } + + return $script; + } + + private static function quote($arg) + { + return '"' . addcslashes($arg, "\"\n\\") . '"'; + } + + private static function call() + { + $args = func_get_args(); + $method = array_shift($args); + + return static::call_array($method, $args); + } + + private static function call_array($method, array $args) + { + return 'c.' . $method . '(' . implode(', ', $args) . ');'; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php new file mode 100644 index 0000000000..0957e55808 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php @@ -0,0 +1,148 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\ResettableInterface; +use Monolog\Formatter\FormatterInterface; + +/** + * Buffers all records until closing the handler and then pass them as batch. + * + * This is useful for a MailHandler to send only one mail per request instead of + * sending one per log message. + * + * @author Christophe Coevoet + */ +class BufferHandler extends AbstractHandler +{ + protected $handler; + protected $bufferSize = 0; + protected $bufferLimit; + protected $flushOnOverflow; + protected $buffer = array(); + protected $initialized = false; + + /** + * @param HandlerInterface $handler Handler. + * @param int $bufferLimit How many entries should be buffered at most, beyond that the oldest items are removed from the buffer. + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @param bool $flushOnOverflow If true, the buffer is flushed when the max size has been reached, by default oldest entries are discarded + */ + public function __construct(HandlerInterface $handler, $bufferLimit = 0, $level = Logger::DEBUG, $bubble = true, $flushOnOverflow = false) + { + parent::__construct($level, $bubble); + $this->handler = $handler; + $this->bufferLimit = (int) $bufferLimit; + $this->flushOnOverflow = $flushOnOverflow; + } + + /** + * {@inheritdoc} + */ + public function handle(array $record) + { + if ($record['level'] < $this->level) { + return false; + } + + if (!$this->initialized) { + // __destructor() doesn't get called on Fatal errors + register_shutdown_function(array($this, 'close')); + $this->initialized = true; + } + + if ($this->bufferLimit > 0 && $this->bufferSize === $this->bufferLimit) { + if ($this->flushOnOverflow) { + $this->flush(); + } else { + array_shift($this->buffer); + $this->bufferSize--; + } + } + + if ($this->processors) { + foreach ($this->processors as $processor) { + $record = call_user_func($processor, $record); + } + } + + $this->buffer[] = $record; + $this->bufferSize++; + + return false === $this->bubble; + } + + public function flush() + { + if ($this->bufferSize === 0) { + return; + } + + $this->handler->handleBatch($this->buffer); + $this->clear(); + } + + public function __destruct() + { + // suppress the parent behavior since we already have register_shutdown_function() + // to call close(), and the reference contained there will prevent this from being + // GC'd until the end of the request + } + + /** + * {@inheritdoc} + */ + public function close() + { + $this->flush(); + } + + /** + * Clears the buffer without flushing any messages down to the wrapped handler. + */ + public function clear() + { + $this->bufferSize = 0; + $this->buffer = array(); + } + + public function reset() + { + $this->flush(); + + parent::reset(); + + if ($this->handler instanceof ResettableInterface) { + $this->handler->reset(); + } + } + + /** + * {@inheritdoc} + */ + public function setFormatter(FormatterInterface $formatter) + { + $this->handler->setFormatter($formatter); + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getFormatter() + { + return $this->handler->getFormatter(); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php new file mode 100644 index 0000000000..47120e5450 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php @@ -0,0 +1,212 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\ChromePHPFormatter; +use Monolog\Logger; +use Monolog\Utils; + +/** + * Handler sending logs to the ChromePHP extension (http://www.chromephp.com/) + * + * This also works out of the box with Firefox 43+ + * + * @author Christophe Coevoet + */ +class ChromePHPHandler extends AbstractProcessingHandler +{ + /** + * Version of the extension + */ + const VERSION = '4.0'; + + /** + * Header name + */ + const HEADER_NAME = 'X-ChromeLogger-Data'; + + /** + * Regular expression to detect supported browsers (matches any Chrome, or Firefox 43+) + */ + const USER_AGENT_REGEX = '{\b(?:Chrome/\d+(?:\.\d+)*|HeadlessChrome|Firefox/(?:4[3-9]|[5-9]\d|\d{3,})(?:\.\d)*)\b}'; + + protected static $initialized = false; + + /** + * Tracks whether we sent too much data + * + * Chrome limits the headers to 4KB, so when we sent 3KB we stop sending + * + * @var bool + */ + protected static $overflowed = false; + + protected static $json = array( + 'version' => self::VERSION, + 'columns' => array('label', 'log', 'backtrace', 'type'), + 'rows' => array(), + ); + + protected static $sendHeaders = true; + + /** + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct($level = Logger::DEBUG, $bubble = true) + { + parent::__construct($level, $bubble); + if (!function_exists('json_encode')) { + throw new \RuntimeException('PHP\'s json extension is required to use Monolog\'s ChromePHPHandler'); + } + } + + /** + * {@inheritdoc} + */ + public function handleBatch(array $records) + { + $messages = array(); + + foreach ($records as $record) { + if ($record['level'] < $this->level) { + continue; + } + $messages[] = $this->processRecord($record); + } + + if (!empty($messages)) { + $messages = $this->getFormatter()->formatBatch($messages); + self::$json['rows'] = array_merge(self::$json['rows'], $messages); + $this->send(); + } + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter() + { + return new ChromePHPFormatter(); + } + + /** + * Creates & sends header for a record + * + * @see sendHeader() + * @see send() + * @param array $record + */ + protected function write(array $record) + { + self::$json['rows'][] = $record['formatted']; + + $this->send(); + } + + /** + * Sends the log header + * + * @see sendHeader() + */ + protected function send() + { + if (self::$overflowed || !self::$sendHeaders) { + return; + } + + if (!self::$initialized) { + self::$initialized = true; + + self::$sendHeaders = $this->headersAccepted(); + if (!self::$sendHeaders) { + return; + } + + self::$json['request_uri'] = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : ''; + } + + $json = Utils::jsonEncode(self::$json, null, true); + $data = base64_encode(utf8_encode($json)); + if (strlen($data) > 3 * 1024) { + self::$overflowed = true; + + $record = array( + 'message' => 'Incomplete logs, chrome header size limit reached', + 'context' => array(), + 'level' => Logger::WARNING, + 'level_name' => Logger::getLevelName(Logger::WARNING), + 'channel' => 'monolog', + 'datetime' => new \DateTime(), + 'extra' => array(), + ); + self::$json['rows'][count(self::$json['rows']) - 1] = $this->getFormatter()->format($record); + $json = Utils::jsonEncode(self::$json, null, true); + $data = base64_encode(utf8_encode($json)); + } + + if (trim($data) !== '') { + $this->sendHeader(self::HEADER_NAME, $data); + } + } + + /** + * Send header string to the client + * + * @param string $header + * @param string $content + */ + protected function sendHeader($header, $content) + { + if (!headers_sent() && self::$sendHeaders) { + header(sprintf('%s: %s', $header, $content)); + } + } + + /** + * Verifies if the headers are accepted by the current user agent + * + * @return bool + */ + protected function headersAccepted() + { + if (empty($_SERVER['HTTP_USER_AGENT'])) { + return false; + } + + return preg_match(self::USER_AGENT_REGEX, $_SERVER['HTTP_USER_AGENT']); + } + + /** + * BC getter for the sendHeaders property that has been made static + */ + public function __get($property) + { + if ('sendHeaders' !== $property) { + throw new \InvalidArgumentException('Undefined property '.$property); + } + + return static::$sendHeaders; + } + + /** + * BC setter for the sendHeaders property that has been made static + */ + public function __set($property, $value) + { + if ('sendHeaders' !== $property) { + throw new \InvalidArgumentException('Undefined property '.$property); + } + + static::$sendHeaders = $value; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php new file mode 100644 index 0000000000..cc98697199 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php @@ -0,0 +1,72 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\JsonFormatter; +use Monolog\Logger; + +/** + * CouchDB handler + * + * @author Markus Bachmann + */ +class CouchDBHandler extends AbstractProcessingHandler +{ + private $options; + + public function __construct(array $options = array(), $level = Logger::DEBUG, $bubble = true) + { + $this->options = array_merge(array( + 'host' => 'localhost', + 'port' => 5984, + 'dbname' => 'logger', + 'username' => null, + 'password' => null, + ), $options); + + parent::__construct($level, $bubble); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record) + { + $basicAuth = null; + if ($this->options['username']) { + $basicAuth = sprintf('%s:%s@', $this->options['username'], $this->options['password']); + } + + $url = 'http://'.$basicAuth.$this->options['host'].':'.$this->options['port'].'/'.$this->options['dbname']; + $context = stream_context_create(array( + 'http' => array( + 'method' => 'POST', + 'content' => $record['formatted'], + 'ignore_errors' => true, + 'max_redirects' => 0, + 'header' => 'Content-type: application/json', + ), + )); + + if (false === @file_get_contents($url, null, $context)) { + throw new \RuntimeException(sprintf('Could not connect to %s', $url)); + } + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter() + { + return new JsonFormatter(JsonFormatter::BATCH_MODE_JSON, false); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php new file mode 100644 index 0000000000..44928efb25 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php @@ -0,0 +1,152 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Utils; + +/** + * Logs to Cube. + * + * @link http://square.github.com/cube/ + * @author Wan Chen + */ +class CubeHandler extends AbstractProcessingHandler +{ + private $udpConnection; + private $httpConnection; + private $scheme; + private $host; + private $port; + private $acceptedSchemes = array('http', 'udp'); + + /** + * Create a Cube handler + * + * @throws \UnexpectedValueException when given url is not a valid url. + * A valid url must consist of three parts : protocol://host:port + * Only valid protocols used by Cube are http and udp + */ + public function __construct($url, $level = Logger::DEBUG, $bubble = true) + { + $urlInfo = parse_url($url); + + if (!isset($urlInfo['scheme'], $urlInfo['host'], $urlInfo['port'])) { + throw new \UnexpectedValueException('URL "'.$url.'" is not valid'); + } + + if (!in_array($urlInfo['scheme'], $this->acceptedSchemes)) { + throw new \UnexpectedValueException( + 'Invalid protocol (' . $urlInfo['scheme'] . ').' + . ' Valid options are ' . implode(', ', $this->acceptedSchemes)); + } + + $this->scheme = $urlInfo['scheme']; + $this->host = $urlInfo['host']; + $this->port = $urlInfo['port']; + + parent::__construct($level, $bubble); + } + + /** + * Establish a connection to an UDP socket + * + * @throws \LogicException when unable to connect to the socket + * @throws MissingExtensionException when there is no socket extension + */ + protected function connectUdp() + { + if (!extension_loaded('sockets')) { + throw new MissingExtensionException('The sockets extension is required to use udp URLs with the CubeHandler'); + } + + $this->udpConnection = socket_create(AF_INET, SOCK_DGRAM, 0); + if (!$this->udpConnection) { + throw new \LogicException('Unable to create a socket'); + } + + if (!socket_connect($this->udpConnection, $this->host, $this->port)) { + throw new \LogicException('Unable to connect to the socket at ' . $this->host . ':' . $this->port); + } + } + + /** + * Establish a connection to a http server + * @throws \LogicException when no curl extension + */ + protected function connectHttp() + { + if (!extension_loaded('curl')) { + throw new \LogicException('The curl extension is needed to use http URLs with the CubeHandler'); + } + + $this->httpConnection = curl_init('http://'.$this->host.':'.$this->port.'/1.0/event/put'); + + if (!$this->httpConnection) { + throw new \LogicException('Unable to connect to ' . $this->host . ':' . $this->port); + } + + curl_setopt($this->httpConnection, CURLOPT_CUSTOMREQUEST, "POST"); + curl_setopt($this->httpConnection, CURLOPT_RETURNTRANSFER, true); + } + + /** + * {@inheritdoc} + */ + protected function write(array $record) + { + $date = $record['datetime']; + + $data = array('time' => $date->format('Y-m-d\TH:i:s.uO')); + unset($record['datetime']); + + if (isset($record['context']['type'])) { + $data['type'] = $record['context']['type']; + unset($record['context']['type']); + } else { + $data['type'] = $record['channel']; + } + + $data['data'] = $record['context']; + $data['data']['level'] = $record['level']; + + if ($this->scheme === 'http') { + $this->writeHttp(Utils::jsonEncode($data)); + } else { + $this->writeUdp(Utils::jsonEncode($data)); + } + } + + private function writeUdp($data) + { + if (!$this->udpConnection) { + $this->connectUdp(); + } + + socket_send($this->udpConnection, $data, strlen($data), 0); + } + + private function writeHttp($data) + { + if (!$this->httpConnection) { + $this->connectHttp(); + } + + curl_setopt($this->httpConnection, CURLOPT_POSTFIELDS, '['.$data.']'); + curl_setopt($this->httpConnection, CURLOPT_HTTPHEADER, array( + 'Content-Type: application/json', + 'Content-Length: ' . strlen('['.$data.']'), + )); + + Curl\Util::execute($this->httpConnection, 5, false); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.php b/vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.php new file mode 100644 index 0000000000..48d30b3586 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.php @@ -0,0 +1,57 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler\Curl; + +class Util +{ + private static $retriableErrorCodes = array( + CURLE_COULDNT_RESOLVE_HOST, + CURLE_COULDNT_CONNECT, + CURLE_HTTP_NOT_FOUND, + CURLE_READ_ERROR, + CURLE_OPERATION_TIMEOUTED, + CURLE_HTTP_POST_ERROR, + CURLE_SSL_CONNECT_ERROR, + ); + + /** + * Executes a CURL request with optional retries and exception on failure + * + * @param resource $ch curl handler + * @throws \RuntimeException + */ + public static function execute($ch, $retries = 5, $closeAfterDone = true) + { + while ($retries--) { + if (curl_exec($ch) === false) { + $curlErrno = curl_errno($ch); + + if (false === in_array($curlErrno, self::$retriableErrorCodes, true) || !$retries) { + $curlError = curl_error($ch); + + if ($closeAfterDone) { + curl_close($ch); + } + + throw new \RuntimeException(sprintf('Curl error (code %s): %s', $curlErrno, $curlError)); + } + + continue; + } + + if ($closeAfterDone) { + curl_close($ch); + } + break; + } + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php new file mode 100644 index 0000000000..35b55cb4f4 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php @@ -0,0 +1,169 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; + +/** + * Simple handler wrapper that deduplicates log records across multiple requests + * + * It also includes the BufferHandler functionality and will buffer + * all messages until the end of the request or flush() is called. + * + * This works by storing all log records' messages above $deduplicationLevel + * to the file specified by $deduplicationStore. When further logs come in at the end of the + * request (or when flush() is called), all those above $deduplicationLevel are checked + * against the existing stored logs. If they match and the timestamps in the stored log is + * not older than $time seconds, the new log record is discarded. If no log record is new, the + * whole data set is discarded. + * + * This is mainly useful in combination with Mail handlers or things like Slack or HipChat handlers + * that send messages to people, to avoid spamming with the same message over and over in case of + * a major component failure like a database server being down which makes all requests fail in the + * same way. + * + * @author Jordi Boggiano + */ +class DeduplicationHandler extends BufferHandler +{ + /** + * @var string + */ + protected $deduplicationStore; + + /** + * @var int + */ + protected $deduplicationLevel; + + /** + * @var int + */ + protected $time; + + /** + * @var bool + */ + private $gc = false; + + /** + * @param HandlerInterface $handler Handler. + * @param string $deduplicationStore The file/path where the deduplication log should be kept + * @param int $deduplicationLevel The minimum logging level for log records to be looked at for deduplication purposes + * @param int $time The period (in seconds) during which duplicate entries should be suppressed after a given log is sent through + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct(HandlerInterface $handler, $deduplicationStore = null, $deduplicationLevel = Logger::ERROR, $time = 60, $bubble = true) + { + parent::__construct($handler, 0, Logger::DEBUG, $bubble, false); + + $this->deduplicationStore = $deduplicationStore === null ? sys_get_temp_dir() . '/monolog-dedup-' . substr(md5(__FILE__), 0, 20) .'.log' : $deduplicationStore; + $this->deduplicationLevel = Logger::toMonologLevel($deduplicationLevel); + $this->time = $time; + } + + public function flush() + { + if ($this->bufferSize === 0) { + return; + } + + $passthru = null; + + foreach ($this->buffer as $record) { + if ($record['level'] >= $this->deduplicationLevel) { + + $passthru = $passthru || !$this->isDuplicate($record); + if ($passthru) { + $this->appendRecord($record); + } + } + } + + // default of null is valid as well as if no record matches duplicationLevel we just pass through + if ($passthru === true || $passthru === null) { + $this->handler->handleBatch($this->buffer); + } + + $this->clear(); + + if ($this->gc) { + $this->collectLogs(); + } + } + + private function isDuplicate(array $record) + { + if (!file_exists($this->deduplicationStore)) { + return false; + } + + $store = file($this->deduplicationStore, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); + if (!is_array($store)) { + return false; + } + + $yesterday = time() - 86400; + $timestampValidity = $record['datetime']->getTimestamp() - $this->time; + $expectedMessage = preg_replace('{[\r\n].*}', '', $record['message']); + + for ($i = count($store) - 1; $i >= 0; $i--) { + list($timestamp, $level, $message) = explode(':', $store[$i], 3); + + if ($level === $record['level_name'] && $message === $expectedMessage && $timestamp > $timestampValidity) { + return true; + } + + if ($timestamp < $yesterday) { + $this->gc = true; + } + } + + return false; + } + + private function collectLogs() + { + if (!file_exists($this->deduplicationStore)) { + return false; + } + + $handle = fopen($this->deduplicationStore, 'rw+'); + flock($handle, LOCK_EX); + $validLogs = array(); + + $timestampValidity = time() - $this->time; + + while (!feof($handle)) { + $log = fgets($handle); + if (substr($log, 0, 10) >= $timestampValidity) { + $validLogs[] = $log; + } + } + + ftruncate($handle, 0); + rewind($handle); + foreach ($validLogs as $log) { + fwrite($handle, $log); + } + + flock($handle, LOCK_UN); + fclose($handle); + + $this->gc = false; + } + + private function appendRecord(array $record) + { + file_put_contents($this->deduplicationStore, $record['datetime']->getTimestamp() . ':' . $record['level_name'] . ':' . preg_replace('{[\r\n].*}', '', $record['message']) . "\n", FILE_APPEND); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php new file mode 100644 index 0000000000..b91ffec905 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php @@ -0,0 +1,45 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Formatter\NormalizerFormatter; +use Doctrine\CouchDB\CouchDBClient; + +/** + * CouchDB handler for Doctrine CouchDB ODM + * + * @author Markus Bachmann + */ +class DoctrineCouchDBHandler extends AbstractProcessingHandler +{ + private $client; + + public function __construct(CouchDBClient $client, $level = Logger::DEBUG, $bubble = true) + { + $this->client = $client; + parent::__construct($level, $bubble); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record) + { + $this->client->postDocument($record['formatted']); + } + + protected function getDefaultFormatter() + { + return new NormalizerFormatter; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php new file mode 100644 index 0000000000..237b71f616 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php @@ -0,0 +1,107 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Aws\Sdk; +use Aws\DynamoDb\DynamoDbClient; +use Aws\DynamoDb\Marshaler; +use Monolog\Formatter\ScalarFormatter; +use Monolog\Logger; + +/** + * Amazon DynamoDB handler (http://aws.amazon.com/dynamodb/) + * + * @link https://github.com/aws/aws-sdk-php/ + * @author Andrew Lawson + */ +class DynamoDbHandler extends AbstractProcessingHandler +{ + const DATE_FORMAT = 'Y-m-d\TH:i:s.uO'; + + /** + * @var DynamoDbClient + */ + protected $client; + + /** + * @var string + */ + protected $table; + + /** + * @var int + */ + protected $version; + + /** + * @var Marshaler + */ + protected $marshaler; + + /** + * @param DynamoDbClient $client + * @param string $table + * @param int $level + * @param bool $bubble + */ + public function __construct(DynamoDbClient $client, $table, $level = Logger::DEBUG, $bubble = true) + { + if (defined('Aws\Sdk::VERSION') && version_compare(Sdk::VERSION, '3.0', '>=')) { + $this->version = 3; + $this->marshaler = new Marshaler; + } else { + $this->version = 2; + } + + $this->client = $client; + $this->table = $table; + + parent::__construct($level, $bubble); + } + + /** + * {@inheritdoc} + */ + protected function write(array $record) + { + $filtered = $this->filterEmptyFields($record['formatted']); + if ($this->version === 3) { + $formatted = $this->marshaler->marshalItem($filtered); + } else { + $formatted = $this->client->formatAttributes($filtered); + } + + $this->client->putItem(array( + 'TableName' => $this->table, + 'Item' => $formatted, + )); + } + + /** + * @param array $record + * @return array + */ + protected function filterEmptyFields(array $record) + { + return array_filter($record, function ($value) { + return !empty($value) || false === $value || 0 === $value; + }); + } + + /** + * {@inheritdoc} + */ + protected function getDefaultFormatter() + { + return new ScalarFormatter(self::DATE_FORMAT); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php new file mode 100644 index 0000000000..bb0f83ebc4 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php @@ -0,0 +1,128 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\ElasticaFormatter; +use Monolog\Logger; +use Elastica\Client; +use Elastica\Exception\ExceptionInterface; + +/** + * Elastic Search handler + * + * Usage example: + * + * $client = new \Elastica\Client(); + * $options = array( + * 'index' => 'elastic_index_name', + * 'type' => 'elastic_doc_type', + * ); + * $handler = new ElasticSearchHandler($client, $options); + * $log = new Logger('application'); + * $log->pushHandler($handler); + * + * @author Jelle Vink + */ +class ElasticSearchHandler extends AbstractProcessingHandler +{ + /** + * @var Client + */ + protected $client; + + /** + * @var array Handler config options + */ + protected $options = array(); + + /** + * @param Client $client Elastica Client object + * @param array $options Handler configuration + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct(Client $client, array $options = array(), $level = Logger::DEBUG, $bubble = true) + { + parent::__construct($level, $bubble); + $this->client = $client; + $this->options = array_merge( + array( + 'index' => 'monolog', // Elastic index name + 'type' => 'record', // Elastic document type + 'ignore_error' => false, // Suppress Elastica exceptions + ), + $options + ); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record) + { + $this->bulkSend(array($record['formatted'])); + } + + /** + * {@inheritdoc} + */ + public function setFormatter(FormatterInterface $formatter) + { + if ($formatter instanceof ElasticaFormatter) { + return parent::setFormatter($formatter); + } + throw new \InvalidArgumentException('ElasticSearchHandler is only compatible with ElasticaFormatter'); + } + + /** + * Getter options + * @return array + */ + public function getOptions() + { + return $this->options; + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter() + { + return new ElasticaFormatter($this->options['index'], $this->options['type']); + } + + /** + * {@inheritdoc} + */ + public function handleBatch(array $records) + { + $documents = $this->getFormatter()->formatBatch($records); + $this->bulkSend($documents); + } + + /** + * Use Elasticsearch bulk API to send list of documents + * @param array $documents + * @throws \RuntimeException + */ + protected function bulkSend(array $documents) + { + try { + $this->client->addDocuments($documents); + } catch (ExceptionInterface $e) { + if (!$this->options['ignore_error']) { + throw new \RuntimeException("Error sending messages to Elasticsearch", 0, $e); + } + } + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php new file mode 100644 index 0000000000..b2986b0fed --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php @@ -0,0 +1,82 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\LineFormatter; +use Monolog\Logger; + +/** + * Stores to PHP error_log() handler. + * + * @author Elan Ruusamäe + */ +class ErrorLogHandler extends AbstractProcessingHandler +{ + const OPERATING_SYSTEM = 0; + const SAPI = 4; + + protected $messageType; + protected $expandNewlines; + + /** + * @param int $messageType Says where the error should go. + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @param bool $expandNewlines If set to true, newlines in the message will be expanded to be take multiple log entries + */ + public function __construct($messageType = self::OPERATING_SYSTEM, $level = Logger::DEBUG, $bubble = true, $expandNewlines = false) + { + parent::__construct($level, $bubble); + + if (false === in_array($messageType, self::getAvailableTypes())) { + $message = sprintf('The given message type "%s" is not supported', print_r($messageType, true)); + throw new \InvalidArgumentException($message); + } + + $this->messageType = $messageType; + $this->expandNewlines = $expandNewlines; + } + + /** + * @return array With all available types + */ + public static function getAvailableTypes() + { + return array( + self::OPERATING_SYSTEM, + self::SAPI, + ); + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter() + { + return new LineFormatter('[%datetime%] %channel%.%level_name%: %message% %context% %extra%'); + } + + /** + * {@inheritdoc} + */ + protected function write(array $record) + { + if ($this->expandNewlines) { + $lines = preg_split('{[\r\n]+}', (string) $record['formatted']); + foreach ($lines as $line) { + error_log($line, $this->messageType); + } + } else { + error_log((string) $record['formatted'], $this->messageType); + } + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php new file mode 100644 index 0000000000..949f22718f --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php @@ -0,0 +1,172 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Formatter\FormatterInterface; + +/** + * Simple handler wrapper that filters records based on a list of levels + * + * It can be configured with an exact list of levels to allow, or a min/max level. + * + * @author Hennadiy Verkh + * @author Jordi Boggiano + */ +class FilterHandler extends AbstractHandler +{ + /** + * Handler or factory callable($record, $this) + * + * @var callable|\Monolog\Handler\HandlerInterface + */ + protected $handler; + + /** + * Minimum level for logs that are passed to handler + * + * @var int[] + */ + protected $acceptedLevels; + + /** + * Whether the messages that are handled can bubble up the stack or not + * + * @var bool + */ + protected $bubble; + + /** + * @param callable|HandlerInterface $handler Handler or factory callable($record|null, $filterHandler). + * @param int|array $minLevelOrList A list of levels to accept or a minimum level if maxLevel is provided + * @param int $maxLevel Maximum level to accept, only used if $minLevelOrList is not an array + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct($handler, $minLevelOrList = Logger::DEBUG, $maxLevel = Logger::EMERGENCY, $bubble = true) + { + $this->handler = $handler; + $this->bubble = $bubble; + $this->setAcceptedLevels($minLevelOrList, $maxLevel); + + if (!$this->handler instanceof HandlerInterface && !is_callable($this->handler)) { + throw new \RuntimeException("The given handler (".json_encode($this->handler).") is not a callable nor a Monolog\Handler\HandlerInterface object"); + } + } + + /** + * @return array + */ + public function getAcceptedLevels() + { + return array_flip($this->acceptedLevels); + } + + /** + * @param int|string|array $minLevelOrList A list of levels to accept or a minimum level or level name if maxLevel is provided + * @param int|string $maxLevel Maximum level or level name to accept, only used if $minLevelOrList is not an array + */ + public function setAcceptedLevels($minLevelOrList = Logger::DEBUG, $maxLevel = Logger::EMERGENCY) + { + if (is_array($minLevelOrList)) { + $acceptedLevels = array_map('Monolog\Logger::toMonologLevel', $minLevelOrList); + } else { + $minLevelOrList = Logger::toMonologLevel($minLevelOrList); + $maxLevel = Logger::toMonologLevel($maxLevel); + $acceptedLevels = array_values(array_filter(Logger::getLevels(), function ($level) use ($minLevelOrList, $maxLevel) { + return $level >= $minLevelOrList && $level <= $maxLevel; + })); + } + $this->acceptedLevels = array_flip($acceptedLevels); + } + + /** + * {@inheritdoc} + */ + public function isHandling(array $record) + { + return isset($this->acceptedLevels[$record['level']]); + } + + /** + * {@inheritdoc} + */ + public function handle(array $record) + { + if (!$this->isHandling($record)) { + return false; + } + + if ($this->processors) { + foreach ($this->processors as $processor) { + $record = call_user_func($processor, $record); + } + } + + $this->getHandler($record)->handle($record); + + return false === $this->bubble; + } + + /** + * {@inheritdoc} + */ + public function handleBatch(array $records) + { + $filtered = array(); + foreach ($records as $record) { + if ($this->isHandling($record)) { + $filtered[] = $record; + } + } + + if (count($filtered) > 0) { + $this->getHandler($filtered[count($filtered) - 1])->handleBatch($filtered); + } + } + + /** + * Return the nested handler + * + * If the handler was provided as a factory callable, this will trigger the handler's instantiation. + * + * @return HandlerInterface + */ + public function getHandler(array $record = null) + { + if (!$this->handler instanceof HandlerInterface) { + $this->handler = call_user_func($this->handler, $record, $this); + if (!$this->handler instanceof HandlerInterface) { + throw new \RuntimeException("The factory callable should return a HandlerInterface"); + } + } + + return $this->handler; + } + + /** + * {@inheritdoc} + */ + public function setFormatter(FormatterInterface $formatter) + { + $this->getHandler()->setFormatter($formatter); + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getFormatter() + { + return $this->getHandler()->getFormatter(); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php b/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php new file mode 100644 index 0000000000..aaca12ccd0 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler\FingersCrossed; + +/** + * Interface for activation strategies for the FingersCrossedHandler. + * + * @author Johannes M. Schmitt + */ +interface ActivationStrategyInterface +{ + /** + * Returns whether the given record activates the handler. + * + * @param array $record + * @return bool + */ + public function isHandlerActivated(array $record); +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php b/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php new file mode 100644 index 0000000000..2a2a64d940 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.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 Monolog\Handler\FingersCrossed; + +use Monolog\Logger; + +/** + * Channel and Error level based monolog activation strategy. Allows to trigger activation + * based on level per channel. e.g. trigger activation on level 'ERROR' by default, except + * for records of the 'sql' channel; those should trigger activation on level 'WARN'. + * + * Example: + * + * + * $activationStrategy = new ChannelLevelActivationStrategy( + * Logger::CRITICAL, + * array( + * 'request' => Logger::ALERT, + * 'sensitive' => Logger::ERROR, + * ) + * ); + * $handler = new FingersCrossedHandler(new StreamHandler('php://stderr'), $activationStrategy); + * + * + * @author Mike Meessen + */ +class ChannelLevelActivationStrategy implements ActivationStrategyInterface +{ + private $defaultActionLevel; + private $channelToActionLevel; + + /** + * @param int $defaultActionLevel The default action level to be used if the record's category doesn't match any + * @param array $channelToActionLevel An array that maps channel names to action levels. + */ + public function __construct($defaultActionLevel, $channelToActionLevel = array()) + { + $this->defaultActionLevel = Logger::toMonologLevel($defaultActionLevel); + $this->channelToActionLevel = array_map('Monolog\Logger::toMonologLevel', $channelToActionLevel); + } + + public function isHandlerActivated(array $record) + { + if (isset($this->channelToActionLevel[$record['channel']])) { + return $record['level'] >= $this->channelToActionLevel[$record['channel']]; + } + + return $record['level'] >= $this->defaultActionLevel; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php b/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php new file mode 100644 index 0000000000..6e630852fc --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php @@ -0,0 +1,34 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler\FingersCrossed; + +use Monolog\Logger; + +/** + * Error level based activation strategy. + * + * @author Johannes M. Schmitt + */ +class ErrorLevelActivationStrategy implements ActivationStrategyInterface +{ + private $actionLevel; + + public function __construct($actionLevel) + { + $this->actionLevel = Logger::toMonologLevel($actionLevel); + } + + public function isHandlerActivated(array $record) + { + return $record['level'] >= $this->actionLevel; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php new file mode 100644 index 0000000000..cdabc44589 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php @@ -0,0 +1,207 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy; +use Monolog\Handler\FingersCrossed\ActivationStrategyInterface; +use Monolog\Logger; +use Monolog\ResettableInterface; +use Monolog\Formatter\FormatterInterface; + +/** + * Buffers all records until a certain level is reached + * + * The advantage of this approach is that you don't get any clutter in your log files. + * Only requests which actually trigger an error (or whatever your actionLevel is) will be + * in the logs, but they will contain all records, not only those above the level threshold. + * + * You can find the various activation strategies in the + * Monolog\Handler\FingersCrossed\ namespace. + * + * @author Jordi Boggiano + */ +class FingersCrossedHandler extends AbstractHandler +{ + protected $handler; + protected $activationStrategy; + protected $buffering = true; + protected $bufferSize; + protected $buffer = array(); + protected $stopBuffering; + protected $passthruLevel; + + /** + * @param callable|HandlerInterface $handler Handler or factory callable($record|null, $fingersCrossedHandler). + * @param int|ActivationStrategyInterface $activationStrategy Strategy which determines when this handler takes action + * @param int $bufferSize How many entries should be buffered at most, beyond that the oldest items are removed from the buffer. + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @param bool $stopBuffering Whether the handler should stop buffering after being triggered (default true) + * @param int $passthruLevel Minimum level to always flush to handler on close, even if strategy not triggered + */ + public function __construct($handler, $activationStrategy = null, $bufferSize = 0, $bubble = true, $stopBuffering = true, $passthruLevel = null) + { + if (null === $activationStrategy) { + $activationStrategy = new ErrorLevelActivationStrategy(Logger::WARNING); + } + + // convert simple int activationStrategy to an object + if (!$activationStrategy instanceof ActivationStrategyInterface) { + $activationStrategy = new ErrorLevelActivationStrategy($activationStrategy); + } + + $this->handler = $handler; + $this->activationStrategy = $activationStrategy; + $this->bufferSize = $bufferSize; + $this->bubble = $bubble; + $this->stopBuffering = $stopBuffering; + + if ($passthruLevel !== null) { + $this->passthruLevel = Logger::toMonologLevel($passthruLevel); + } + + if (!$this->handler instanceof HandlerInterface && !is_callable($this->handler)) { + throw new \RuntimeException("The given handler (".json_encode($this->handler).") is not a callable nor a Monolog\Handler\HandlerInterface object"); + } + } + + /** + * {@inheritdoc} + */ + public function isHandling(array $record) + { + return true; + } + + /** + * Manually activate this logger regardless of the activation strategy + */ + public function activate() + { + if ($this->stopBuffering) { + $this->buffering = false; + } + $this->getHandler(end($this->buffer) ?: null)->handleBatch($this->buffer); + $this->buffer = array(); + } + + /** + * {@inheritdoc} + */ + public function handle(array $record) + { + if ($this->processors) { + foreach ($this->processors as $processor) { + $record = call_user_func($processor, $record); + } + } + + if ($this->buffering) { + $this->buffer[] = $record; + if ($this->bufferSize > 0 && count($this->buffer) > $this->bufferSize) { + array_shift($this->buffer); + } + if ($this->activationStrategy->isHandlerActivated($record)) { + $this->activate(); + } + } else { + $this->getHandler($record)->handle($record); + } + + return false === $this->bubble; + } + + /** + * {@inheritdoc} + */ + public function close() + { + $this->flushBuffer(); + } + + public function reset() + { + $this->flushBuffer(); + + parent::reset(); + + if ($this->getHandler() instanceof ResettableInterface) { + $this->getHandler()->reset(); + } + } + + /** + * Clears the buffer without flushing any messages down to the wrapped handler. + * + * It also resets the handler to its initial buffering state. + */ + public function clear() + { + $this->buffer = array(); + $this->reset(); + } + + /** + * Resets the state of the handler. Stops forwarding records to the wrapped handler. + */ + private function flushBuffer() + { + if (null !== $this->passthruLevel) { + $level = $this->passthruLevel; + $this->buffer = array_filter($this->buffer, function ($record) use ($level) { + return $record['level'] >= $level; + }); + if (count($this->buffer) > 0) { + $this->getHandler(end($this->buffer) ?: null)->handleBatch($this->buffer); + } + } + + $this->buffer = array(); + $this->buffering = true; + } + + /** + * Return the nested handler + * + * If the handler was provided as a factory callable, this will trigger the handler's instantiation. + * + * @return HandlerInterface + */ + public function getHandler(array $record = null) + { + if (!$this->handler instanceof HandlerInterface) { + $this->handler = call_user_func($this->handler, $record, $this); + if (!$this->handler instanceof HandlerInterface) { + throw new \RuntimeException("The factory callable should return a HandlerInterface"); + } + } + + return $this->handler; + } + + /** + * {@inheritdoc} + */ + public function setFormatter(FormatterInterface $formatter) + { + $this->getHandler()->setFormatter($formatter); + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getFormatter() + { + return $this->getHandler()->getFormatter(); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php new file mode 100644 index 0000000000..c30b1843cd --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php @@ -0,0 +1,195 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\WildfireFormatter; + +/** + * Simple FirePHP Handler (http://www.firephp.org/), which uses the Wildfire protocol. + * + * @author Eric Clemmons (@ericclemmons) + */ +class FirePHPHandler extends AbstractProcessingHandler +{ + /** + * WildFire JSON header message format + */ + const PROTOCOL_URI = 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2'; + + /** + * FirePHP structure for parsing messages & their presentation + */ + const STRUCTURE_URI = 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1'; + + /** + * Must reference a "known" plugin, otherwise headers won't display in FirePHP + */ + const PLUGIN_URI = 'http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.3'; + + /** + * Header prefix for Wildfire to recognize & parse headers + */ + const HEADER_PREFIX = 'X-Wf'; + + /** + * Whether or not Wildfire vendor-specific headers have been generated & sent yet + */ + protected static $initialized = false; + + /** + * Shared static message index between potentially multiple handlers + * @var int + */ + protected static $messageIndex = 1; + + protected static $sendHeaders = true; + + /** + * Base header creation function used by init headers & record headers + * + * @param array $meta Wildfire Plugin, Protocol & Structure Indexes + * @param string $message Log message + * @return array Complete header string ready for the client as key and message as value + */ + protected function createHeader(array $meta, $message) + { + $header = sprintf('%s-%s', self::HEADER_PREFIX, join('-', $meta)); + + return array($header => $message); + } + + /** + * Creates message header from record + * + * @see createHeader() + * @param array $record + * @return string + */ + protected function createRecordHeader(array $record) + { + // Wildfire is extensible to support multiple protocols & plugins in a single request, + // but we're not taking advantage of that (yet), so we're using "1" for simplicity's sake. + return $this->createHeader( + array(1, 1, 1, self::$messageIndex++), + $record['formatted'] + ); + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter() + { + return new WildfireFormatter(); + } + + /** + * Wildfire initialization headers to enable message parsing + * + * @see createHeader() + * @see sendHeader() + * @return array + */ + protected function getInitHeaders() + { + // Initial payload consists of required headers for Wildfire + return array_merge( + $this->createHeader(array('Protocol', 1), self::PROTOCOL_URI), + $this->createHeader(array(1, 'Structure', 1), self::STRUCTURE_URI), + $this->createHeader(array(1, 'Plugin', 1), self::PLUGIN_URI) + ); + } + + /** + * Send header string to the client + * + * @param string $header + * @param string $content + */ + protected function sendHeader($header, $content) + { + if (!headers_sent() && self::$sendHeaders) { + header(sprintf('%s: %s', $header, $content)); + } + } + + /** + * Creates & sends header for a record, ensuring init headers have been sent prior + * + * @see sendHeader() + * @see sendInitHeaders() + * @param array $record + */ + protected function write(array $record) + { + if (!self::$sendHeaders) { + return; + } + + // WildFire-specific headers must be sent prior to any messages + if (!self::$initialized) { + self::$initialized = true; + + self::$sendHeaders = $this->headersAccepted(); + if (!self::$sendHeaders) { + return; + } + + foreach ($this->getInitHeaders() as $header => $content) { + $this->sendHeader($header, $content); + } + } + + $header = $this->createRecordHeader($record); + if (trim(current($header)) !== '') { + $this->sendHeader(key($header), current($header)); + } + } + + /** + * Verifies if the headers are accepted by the current user agent + * + * @return bool + */ + protected function headersAccepted() + { + if (!empty($_SERVER['HTTP_USER_AGENT']) && preg_match('{\bFirePHP/\d+\.\d+\b}', $_SERVER['HTTP_USER_AGENT'])) { + return true; + } + + return isset($_SERVER['HTTP_X_FIREPHP_VERSION']); + } + + /** + * BC getter for the sendHeaders property that has been made static + */ + public function __get($property) + { + if ('sendHeaders' !== $property) { + throw new \InvalidArgumentException('Undefined property '.$property); + } + + return static::$sendHeaders; + } + + /** + * BC setter for the sendHeaders property that has been made static + */ + public function __set($property, $value) + { + if ('sendHeaders' !== $property) { + throw new \InvalidArgumentException('Undefined property '.$property); + } + + static::$sendHeaders = $value; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php new file mode 100644 index 0000000000..c43c0134ff --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php @@ -0,0 +1,126 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\LineFormatter; +use Monolog\Logger; + +/** + * Sends logs to Fleep.io using Webhook integrations + * + * You'll need a Fleep.io account to use this handler. + * + * @see https://fleep.io/integrations/webhooks/ Fleep Webhooks Documentation + * @author Ando Roots + */ +class FleepHookHandler extends SocketHandler +{ + const FLEEP_HOST = 'fleep.io'; + + const FLEEP_HOOK_URI = '/hook/'; + + /** + * @var string Webhook token (specifies the conversation where logs are sent) + */ + protected $token; + + /** + * Construct a new Fleep.io Handler. + * + * For instructions on how to create a new web hook in your conversations + * see https://fleep.io/integrations/webhooks/ + * + * @param string $token Webhook token + * @param bool|int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @throws MissingExtensionException + */ + public function __construct($token, $level = Logger::DEBUG, $bubble = true) + { + if (!extension_loaded('openssl')) { + throw new MissingExtensionException('The OpenSSL PHP extension is required to use the FleepHookHandler'); + } + + $this->token = $token; + + $connectionString = 'ssl://' . self::FLEEP_HOST . ':443'; + parent::__construct($connectionString, $level, $bubble); + } + + /** + * Returns the default formatter to use with this handler + * + * Overloaded to remove empty context and extra arrays from the end of the log message. + * + * @return LineFormatter + */ + protected function getDefaultFormatter() + { + return new LineFormatter(null, null, true, true); + } + + /** + * Handles a log record + * + * @param array $record + */ + public function write(array $record) + { + parent::write($record); + $this->closeSocket(); + } + + /** + * {@inheritdoc} + * + * @param array $record + * @return string + */ + protected function generateDataStream($record) + { + $content = $this->buildContent($record); + + return $this->buildHeader($content) . $content; + } + + /** + * Builds the header of the API Call + * + * @param string $content + * @return string + */ + private function buildHeader($content) + { + $header = "POST " . self::FLEEP_HOOK_URI . $this->token . " HTTP/1.1\r\n"; + $header .= "Host: " . self::FLEEP_HOST . "\r\n"; + $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; + $header .= "Content-Length: " . strlen($content) . "\r\n"; + $header .= "\r\n"; + + return $header; + } + + /** + * Builds the body of API call + * + * @param array $record + * @return string + */ + private function buildContent($record) + { + $dataArray = array( + 'message' => $record['formatted'], + ); + + return http_build_query($dataArray); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php new file mode 100644 index 0000000000..f0f010cbfe --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php @@ -0,0 +1,128 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Utils; +use Monolog\Formatter\FlowdockFormatter; +use Monolog\Formatter\FormatterInterface; + +/** + * Sends notifications through the Flowdock push API + * + * This must be configured with a FlowdockFormatter instance via setFormatter() + * + * Notes: + * API token - Flowdock API token + * + * @author Dominik Liebler + * @see https://www.flowdock.com/api/push + */ +class FlowdockHandler extends SocketHandler +{ + /** + * @var string + */ + protected $apiToken; + + /** + * @param string $apiToken + * @param bool|int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * + * @throws MissingExtensionException if OpenSSL is missing + */ + public function __construct($apiToken, $level = Logger::DEBUG, $bubble = true) + { + if (!extension_loaded('openssl')) { + throw new MissingExtensionException('The OpenSSL PHP extension is required to use the FlowdockHandler'); + } + + parent::__construct('ssl://api.flowdock.com:443', $level, $bubble); + $this->apiToken = $apiToken; + } + + /** + * {@inheritdoc} + */ + public function setFormatter(FormatterInterface $formatter) + { + if (!$formatter instanceof FlowdockFormatter) { + throw new \InvalidArgumentException('The FlowdockHandler requires an instance of Monolog\Formatter\FlowdockFormatter to function correctly'); + } + + return parent::setFormatter($formatter); + } + + /** + * Gets the default formatter. + * + * @return FormatterInterface + */ + protected function getDefaultFormatter() + { + throw new \InvalidArgumentException('The FlowdockHandler must be configured (via setFormatter) with an instance of Monolog\Formatter\FlowdockFormatter to function correctly'); + } + + /** + * {@inheritdoc} + * + * @param array $record + */ + protected function write(array $record) + { + parent::write($record); + + $this->closeSocket(); + } + + /** + * {@inheritdoc} + * + * @param array $record + * @return string + */ + protected function generateDataStream($record) + { + $content = $this->buildContent($record); + + return $this->buildHeader($content) . $content; + } + + /** + * Builds the body of API call + * + * @param array $record + * @return string + */ + private function buildContent($record) + { + return Utils::jsonEncode($record['formatted']['flowdock']); + } + + /** + * Builds the header of the API Call + * + * @param string $content + * @return string + */ + private function buildHeader($content) + { + $header = "POST /v1/messages/team_inbox/" . $this->apiToken . " HTTP/1.1\r\n"; + $header .= "Host: api.flowdock.com\r\n"; + $header .= "Content-Type: application/json\r\n"; + $header .= "Content-Length: " . strlen($content) . "\r\n"; + $header .= "\r\n"; + + return $header; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.php b/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.php new file mode 100644 index 0000000000..3e2f1b28a6 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.php @@ -0,0 +1,39 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; + +/** + * Interface to describe loggers that have a formatter + * + * This interface is present in monolog 1.x to ease forward compatibility. + * + * @author Jordi Boggiano + */ +interface FormattableHandlerInterface +{ + /** + * Sets the formatter. + * + * @param FormatterInterface $formatter + * @return HandlerInterface self + */ + public function setFormatter(FormatterInterface $formatter): HandlerInterface; + + /** + * Gets the formatter. + * + * @return FormatterInterface + */ + public function getFormatter(): FormatterInterface; +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.php b/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.php new file mode 100644 index 0000000000..e9ec5e776b --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.php @@ -0,0 +1,63 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\LineFormatter; + +/** + * Helper trait for implementing FormattableInterface + * + * This trait is present in monolog 1.x to ease forward compatibility. + * + * @author Jordi Boggiano + */ +trait FormattableHandlerTrait +{ + /** + * @var FormatterInterface + */ + protected $formatter; + + /** + * {@inheritdoc} + * @suppress PhanTypeMismatchReturn + */ + public function setFormatter(FormatterInterface $formatter): HandlerInterface + { + $this->formatter = $formatter; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getFormatter(): FormatterInterface + { + if (!$this->formatter) { + $this->formatter = $this->getDefaultFormatter(); + } + + return $this->formatter; + } + + /** + * Gets the default formatter. + * + * Overwrite this if the LineFormatter is not a good default for your handler. + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new LineFormatter(); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php new file mode 100644 index 0000000000..71e4669348 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.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 Monolog\Handler; + +use Gelf\IMessagePublisher; +use Gelf\PublisherInterface; +use Gelf\Publisher; +use InvalidArgumentException; +use Monolog\Logger; +use Monolog\Formatter\GelfMessageFormatter; + +/** + * Handler to send messages to a Graylog2 (http://www.graylog2.org) server + * + * @author Matt Lehner + * @author Benjamin Zikarsky + */ +class GelfHandler extends AbstractProcessingHandler +{ + /** + * @var Publisher the publisher object that sends the message to the server + */ + protected $publisher; + + /** + * @param PublisherInterface|IMessagePublisher|Publisher $publisher a publisher object + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct($publisher, $level = Logger::DEBUG, $bubble = true) + { + parent::__construct($level, $bubble); + + if (!$publisher instanceof Publisher && !$publisher instanceof IMessagePublisher && !$publisher instanceof PublisherInterface) { + throw new InvalidArgumentException('Invalid publisher, expected a Gelf\Publisher, Gelf\IMessagePublisher or Gelf\PublisherInterface instance'); + } + + $this->publisher = $publisher; + } + + /** + * {@inheritdoc} + */ + protected function write(array $record) + { + $this->publisher->publish($record['formatted']); + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter() + { + return new GelfMessageFormatter(); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php new file mode 100644 index 0000000000..0d461f9c78 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php @@ -0,0 +1,117 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; +use Monolog\ResettableInterface; + +/** + * Forwards records to multiple handlers + * + * @author Lenar Lõhmus + */ +class GroupHandler extends AbstractHandler +{ + protected $handlers; + + /** + * @param array $handlers Array of Handlers. + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct(array $handlers, $bubble = true) + { + foreach ($handlers as $handler) { + if (!$handler instanceof HandlerInterface) { + throw new \InvalidArgumentException('The first argument of the GroupHandler must be an array of HandlerInterface instances.'); + } + } + + $this->handlers = $handlers; + $this->bubble = $bubble; + } + + /** + * {@inheritdoc} + */ + public function isHandling(array $record) + { + foreach ($this->handlers as $handler) { + if ($handler->isHandling($record)) { + return true; + } + } + + return false; + } + + /** + * {@inheritdoc} + */ + public function handle(array $record) + { + if ($this->processors) { + foreach ($this->processors as $processor) { + $record = call_user_func($processor, $record); + } + } + + foreach ($this->handlers as $handler) { + $handler->handle($record); + } + + return false === $this->bubble; + } + + /** + * {@inheritdoc} + */ + public function handleBatch(array $records) + { + if ($this->processors) { + $processed = array(); + foreach ($records as $record) { + foreach ($this->processors as $processor) { + $record = call_user_func($processor, $record); + } + $processed[] = $record; + } + $records = $processed; + } + + foreach ($this->handlers as $handler) { + $handler->handleBatch($records); + } + } + + public function reset() + { + parent::reset(); + + foreach ($this->handlers as $handler) { + if ($handler instanceof ResettableInterface) { + $handler->reset(); + } + } + } + + /** + * {@inheritdoc} + */ + public function setFormatter(FormatterInterface $formatter) + { + foreach ($this->handlers as $handler) { + $handler->setFormatter($formatter); + } + + return $this; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php b/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php new file mode 100644 index 0000000000..8d5a4a0959 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php @@ -0,0 +1,90 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; + +/** + * Interface that all Monolog Handlers must implement + * + * @author Jordi Boggiano + */ +interface HandlerInterface +{ + /** + * Checks whether the given record will be handled by this handler. + * + * This is mostly done for performance reasons, to avoid calling processors for nothing. + * + * Handlers should still check the record levels within handle(), returning false in isHandling() + * is no guarantee that handle() will not be called, and isHandling() might not be called + * for a given record. + * + * @param array $record Partial log record containing only a level key + * + * @return bool + */ + public function isHandling(array $record); + + /** + * Handles a record. + * + * All records may be passed to this method, and the handler should discard + * those that it does not want to handle. + * + * The return value of this function controls the bubbling process of the handler stack. + * Unless the bubbling is interrupted (by returning true), the Logger class will keep on + * calling further handlers in the stack with a given log record. + * + * @param array $record The record to handle + * @return bool true means that this handler handled the record, and that bubbling is not permitted. + * false means the record was either not processed or that this handler allows bubbling. + */ + public function handle(array $record); + + /** + * Handles a set of records at once. + * + * @param array $records The records to handle (an array of record arrays) + */ + public function handleBatch(array $records); + + /** + * Adds a processor in the stack. + * + * @param callable $callback + * @return self + */ + public function pushProcessor($callback); + + /** + * Removes the processor on top of the stack and returns it. + * + * @return callable + */ + public function popProcessor(); + + /** + * Sets the formatter. + * + * @param FormatterInterface $formatter + * @return self + */ + public function setFormatter(FormatterInterface $formatter); + + /** + * Gets the formatter. + * + * @return FormatterInterface + */ + public function getFormatter(); +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php b/vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php new file mode 100644 index 0000000000..55e649868f --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php @@ -0,0 +1,116 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\ResettableInterface; +use Monolog\Formatter\FormatterInterface; + +/** + * This simple wrapper class can be used to extend handlers functionality. + * + * Example: A custom filtering that can be applied to any handler. + * + * Inherit from this class and override handle() like this: + * + * public function handle(array $record) + * { + * if ($record meets certain conditions) { + * return false; + * } + * return $this->handler->handle($record); + * } + * + * @author Alexey Karapetov + */ +class HandlerWrapper implements HandlerInterface, ResettableInterface +{ + /** + * @var HandlerInterface + */ + protected $handler; + + /** + * HandlerWrapper constructor. + * @param HandlerInterface $handler + */ + public function __construct(HandlerInterface $handler) + { + $this->handler = $handler; + } + + /** + * {@inheritdoc} + */ + public function isHandling(array $record) + { + return $this->handler->isHandling($record); + } + + /** + * {@inheritdoc} + */ + public function handle(array $record) + { + return $this->handler->handle($record); + } + + /** + * {@inheritdoc} + */ + public function handleBatch(array $records) + { + return $this->handler->handleBatch($records); + } + + /** + * {@inheritdoc} + */ + public function pushProcessor($callback) + { + $this->handler->pushProcessor($callback); + + return $this; + } + + /** + * {@inheritdoc} + */ + public function popProcessor() + { + return $this->handler->popProcessor(); + } + + /** + * {@inheritdoc} + */ + public function setFormatter(FormatterInterface $formatter) + { + $this->handler->setFormatter($formatter); + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getFormatter() + { + return $this->handler->getFormatter(); + } + + public function reset() + { + if ($this->handler instanceof ResettableInterface) { + return $this->handler->reset(); + } + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/HipChatHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/HipChatHandler.php new file mode 100644 index 0000000000..179d626865 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/HipChatHandler.php @@ -0,0 +1,367 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; + +/** + * Sends notifications through the hipchat api to a hipchat room + * + * Notes: + * API token - HipChat API token + * Room - HipChat Room Id or name, where messages are sent + * Name - Name used to send the message (from) + * notify - Should the message trigger a notification in the clients + * version - The API version to use (HipChatHandler::API_V1 | HipChatHandler::API_V2) + * + * @author Rafael Dohms + * @see https://www.hipchat.com/docs/api + */ +class HipChatHandler extends SocketHandler +{ + /** + * Use API version 1 + */ + const API_V1 = 'v1'; + + /** + * Use API version v2 + */ + const API_V2 = 'v2'; + + /** + * The maximum allowed length for the name used in the "from" field. + */ + const MAXIMUM_NAME_LENGTH = 15; + + /** + * The maximum allowed length for the message. + */ + const MAXIMUM_MESSAGE_LENGTH = 9500; + + /** + * @var string + */ + private $token; + + /** + * @var string + */ + private $room; + + /** + * @var string + */ + private $name; + + /** + * @var bool + */ + private $notify; + + /** + * @var string + */ + private $format; + + /** + * @var string + */ + private $host; + + /** + * @var string + */ + private $version; + + /** + * @param string $token HipChat API Token + * @param string $room The room that should be alerted of the message (Id or Name) + * @param string $name Name used in the "from" field. + * @param bool $notify Trigger a notification in clients or not + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @param bool $useSSL Whether to connect via SSL. + * @param string $format The format of the messages (default to text, can be set to html if you have html in the messages) + * @param string $host The HipChat server hostname. + * @param string $version The HipChat API version (default HipChatHandler::API_V1) + */ + public function __construct($token, $room, $name = 'Monolog', $notify = false, $level = Logger::CRITICAL, $bubble = true, $useSSL = true, $format = 'text', $host = 'api.hipchat.com', $version = self::API_V1) + { + @trigger_error('The Monolog\Handler\HipChatHandler class is deprecated. You should migrate to Slack and the SlackWebhookHandler / SlackbotHandler, see https://www.atlassian.com/partnerships/slack', E_USER_DEPRECATED); + + if ($version == self::API_V1 && !$this->validateStringLength($name, static::MAXIMUM_NAME_LENGTH)) { + throw new \InvalidArgumentException('The supplied name is too long. HipChat\'s v1 API supports names up to 15 UTF-8 characters.'); + } + + $connectionString = $useSSL ? 'ssl://'.$host.':443' : $host.':80'; + parent::__construct($connectionString, $level, $bubble); + + $this->token = $token; + $this->name = $name; + $this->notify = $notify; + $this->room = $room; + $this->format = $format; + $this->host = $host; + $this->version = $version; + } + + /** + * {@inheritdoc} + * + * @param array $record + * @return string + */ + protected function generateDataStream($record) + { + $content = $this->buildContent($record); + + return $this->buildHeader($content) . $content; + } + + /** + * Builds the body of API call + * + * @param array $record + * @return string + */ + private function buildContent($record) + { + $dataArray = array( + 'notify' => $this->version == self::API_V1 ? + ($this->notify ? 1 : 0) : + ($this->notify ? 'true' : 'false'), + 'message' => $record['formatted'], + 'message_format' => $this->format, + 'color' => $this->getAlertColor($record['level']), + ); + + if (!$this->validateStringLength($dataArray['message'], static::MAXIMUM_MESSAGE_LENGTH)) { + if (function_exists('mb_substr')) { + $dataArray['message'] = mb_substr($dataArray['message'], 0, static::MAXIMUM_MESSAGE_LENGTH).' [truncated]'; + } else { + $dataArray['message'] = substr($dataArray['message'], 0, static::MAXIMUM_MESSAGE_LENGTH).' [truncated]'; + } + } + + // if we are using the legacy API then we need to send some additional information + if ($this->version == self::API_V1) { + $dataArray['room_id'] = $this->room; + } + + // append the sender name if it is set + // always append it if we use the v1 api (it is required in v1) + if ($this->version == self::API_V1 || $this->name !== null) { + $dataArray['from'] = (string) $this->name; + } + + return http_build_query($dataArray); + } + + /** + * Builds the header of the API Call + * + * @param string $content + * @return string + */ + private function buildHeader($content) + { + if ($this->version == self::API_V1) { + $header = "POST /v1/rooms/message?format=json&auth_token={$this->token} HTTP/1.1\r\n"; + } else { + // needed for rooms with special (spaces, etc) characters in the name + $room = rawurlencode($this->room); + $header = "POST /v2/room/{$room}/notification?auth_token={$this->token} HTTP/1.1\r\n"; + } + + $header .= "Host: {$this->host}\r\n"; + $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; + $header .= "Content-Length: " . strlen($content) . "\r\n"; + $header .= "\r\n"; + + return $header; + } + + /** + * Assigns a color to each level of log records. + * + * @param int $level + * @return string + */ + protected function getAlertColor($level) + { + switch (true) { + case $level >= Logger::ERROR: + return 'red'; + case $level >= Logger::WARNING: + return 'yellow'; + case $level >= Logger::INFO: + return 'green'; + case $level == Logger::DEBUG: + return 'gray'; + default: + return 'yellow'; + } + } + + /** + * {@inheritdoc} + * + * @param array $record + */ + protected function write(array $record) + { + parent::write($record); + $this->finalizeWrite(); + } + + /** + * Finalizes the request by reading some bytes and then closing the socket + * + * If we do not read some but close the socket too early, hipchat sometimes + * drops the request entirely. + */ + protected function finalizeWrite() + { + $res = $this->getResource(); + if (is_resource($res)) { + @fread($res, 2048); + } + $this->closeSocket(); + } + + /** + * {@inheritdoc} + */ + public function handleBatch(array $records) + { + if (count($records) == 0) { + return true; + } + + $batchRecords = $this->combineRecords($records); + + $handled = false; + foreach ($batchRecords as $batchRecord) { + if ($this->isHandling($batchRecord)) { + $this->write($batchRecord); + $handled = true; + } + } + + if (!$handled) { + return false; + } + + return false === $this->bubble; + } + + /** + * Combines multiple records into one. Error level of the combined record + * will be the highest level from the given records. Datetime will be taken + * from the first record. + * + * @param $records + * @return array + */ + private function combineRecords($records) + { + $batchRecord = null; + $batchRecords = array(); + $messages = array(); + $formattedMessages = array(); + $level = 0; + $levelName = null; + $datetime = null; + + foreach ($records as $record) { + $record = $this->processRecord($record); + + if ($record['level'] > $level) { + $level = $record['level']; + $levelName = $record['level_name']; + } + + if (null === $datetime) { + $datetime = $record['datetime']; + } + + $messages[] = $record['message']; + $messageStr = implode(PHP_EOL, $messages); + $formattedMessages[] = $this->getFormatter()->format($record); + $formattedMessageStr = implode('', $formattedMessages); + + $batchRecord = array( + 'message' => $messageStr, + 'formatted' => $formattedMessageStr, + 'context' => array(), + 'extra' => array(), + ); + + if (!$this->validateStringLength($batchRecord['formatted'], static::MAXIMUM_MESSAGE_LENGTH)) { + // Pop the last message and implode the remaining messages + $lastMessage = array_pop($messages); + $lastFormattedMessage = array_pop($formattedMessages); + $batchRecord['message'] = implode(PHP_EOL, $messages); + $batchRecord['formatted'] = implode('', $formattedMessages); + + $batchRecords[] = $batchRecord; + $messages = array($lastMessage); + $formattedMessages = array($lastFormattedMessage); + + $batchRecord = null; + } + } + + if (null !== $batchRecord) { + $batchRecords[] = $batchRecord; + } + + // Set the max level and datetime for all records + foreach ($batchRecords as &$batchRecord) { + $batchRecord = array_merge( + $batchRecord, + array( + 'level' => $level, + 'level_name' => $levelName, + 'datetime' => $datetime, + ) + ); + } + + return $batchRecords; + } + + /** + * Validates the length of a string. + * + * If the `mb_strlen()` function is available, it will use that, as HipChat + * allows UTF-8 characters. Otherwise, it will fall back to `strlen()`. + * + * Note that this might cause false failures in the specific case of using + * a valid name with less than 16 characters, but 16 or more bytes, on a + * system where `mb_strlen()` is unavailable. + * + * @param string $str + * @param int $length + * + * @return bool + */ + private function validateStringLength($str, $length) + { + if (function_exists('mb_strlen')) { + return (mb_strlen($str) <= $length); + } + + return (strlen($str) <= $length); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php new file mode 100644 index 0000000000..f4d3b97eb8 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php @@ -0,0 +1,70 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Utils; + +/** + * IFTTTHandler uses cURL to trigger IFTTT Maker actions + * + * Register a secret key and trigger/event name at https://ifttt.com/maker + * + * value1 will be the channel from monolog's Logger constructor, + * value2 will be the level name (ERROR, WARNING, ..) + * value3 will be the log record's message + * + * @author Nehal Patel + */ +class IFTTTHandler extends AbstractProcessingHandler +{ + private $eventName; + private $secretKey; + + /** + * @param string $eventName The name of the IFTTT Maker event that should be triggered + * @param string $secretKey A valid IFTTT secret key + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct($eventName, $secretKey, $level = Logger::ERROR, $bubble = true) + { + $this->eventName = $eventName; + $this->secretKey = $secretKey; + + parent::__construct($level, $bubble); + } + + /** + * {@inheritdoc} + */ + public function write(array $record) + { + $postData = array( + "value1" => $record["channel"], + "value2" => $record["level_name"], + "value3" => $record["message"], + ); + $postString = Utils::jsonEncode($postData); + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, "https://maker.ifttt.com/trigger/" . $this->eventName . "/with/key/" . $this->secretKey); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, $postString); + curl_setopt($ch, CURLOPT_HTTPHEADER, array( + "Content-Type: application/json", + )); + + Curl\Util::execute($ch); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php new file mode 100644 index 0000000000..8f683dce53 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php @@ -0,0 +1,62 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + + namespace Monolog\Handler; + + use Monolog\Logger; + +/** + * Inspired on LogEntriesHandler. + * + * @author Robert Kaufmann III + * @author Gabriel Machado + */ +class InsightOpsHandler extends SocketHandler +{ + /** + * @var string + */ + protected $logToken; + + /** + * @param string $token Log token supplied by InsightOps + * @param string $region Region where InsightOps account is hosted. Could be 'us' or 'eu'. + * @param bool $useSSL Whether or not SSL encryption should be used + * @param int $level The minimum logging level to trigger this handler + * @param bool $bubble Whether or not messages that are handled should bubble up the stack. + * + * @throws MissingExtensionException If SSL encryption is set to true and OpenSSL is missing + */ + public function __construct($token, $region = 'us', $useSSL = true, $level = Logger::DEBUG, $bubble = true) + { + if ($useSSL && !extension_loaded('openssl')) { + throw new MissingExtensionException('The OpenSSL PHP plugin is required to use SSL encrypted connection for InsightOpsHandler'); + } + + $endpoint = $useSSL + ? 'ssl://' . $region . '.data.logs.insight.rapid7.com:443' + : $region . '.data.logs.insight.rapid7.com:80'; + + parent::__construct($endpoint, $level, $bubble); + $this->logToken = $token; + } + + /** + * {@inheritdoc} + * + * @param array $record + * @return string + */ + protected function generateDataStream($record) + { + return $this->logToken . ' ' . $record['formatted']; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php new file mode 100644 index 0000000000..ea89fb3ed6 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.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 Monolog\Handler; + +use Monolog\Logger; + +/** + * @author Robert Kaufmann III + */ +class LogEntriesHandler extends SocketHandler +{ + /** + * @var string + */ + protected $logToken; + + /** + * @param string $token Log token supplied by LogEntries + * @param bool $useSSL Whether or not SSL encryption should be used. + * @param int $level The minimum logging level to trigger this handler + * @param bool $bubble Whether or not messages that are handled should bubble up the stack. + * + * @throws MissingExtensionException If SSL encryption is set to true and OpenSSL is missing + */ + public function __construct($token, $useSSL = true, $level = Logger::DEBUG, $bubble = true, $host = 'data.logentries.com') + { + if ($useSSL && !extension_loaded('openssl')) { + throw new MissingExtensionException('The OpenSSL PHP plugin is required to use SSL encrypted connection for LogEntriesHandler'); + } + + $endpoint = $useSSL ? 'ssl://' . $host . ':443' : $host . ':80'; + parent::__construct($endpoint, $level, $bubble); + $this->logToken = $token; + } + + /** + * {@inheritdoc} + * + * @param array $record + * @return string + */ + protected function generateDataStream($record) + { + return $this->logToken . ' ' . $record['formatted']; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php new file mode 100644 index 0000000000..bcd62e1c55 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php @@ -0,0 +1,102 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Formatter\LogglyFormatter; + +/** + * Sends errors to Loggly. + * + * @author Przemek Sobstel + * @author Adam Pancutt + * @author Gregory Barchard + */ +class LogglyHandler extends AbstractProcessingHandler +{ + const HOST = 'logs-01.loggly.com'; + const ENDPOINT_SINGLE = 'inputs'; + const ENDPOINT_BATCH = 'bulk'; + + protected $token; + + protected $tag = array(); + + public function __construct($token, $level = Logger::DEBUG, $bubble = true) + { + if (!extension_loaded('curl')) { + throw new \LogicException('The curl extension is needed to use the LogglyHandler'); + } + + $this->token = $token; + + parent::__construct($level, $bubble); + } + + public function setTag($tag) + { + $tag = !empty($tag) ? $tag : array(); + $this->tag = is_array($tag) ? $tag : array($tag); + } + + public function addTag($tag) + { + if (!empty($tag)) { + $tag = is_array($tag) ? $tag : array($tag); + $this->tag = array_unique(array_merge($this->tag, $tag)); + } + } + + protected function write(array $record) + { + $this->send($record["formatted"], self::ENDPOINT_SINGLE); + } + + public function handleBatch(array $records) + { + $level = $this->level; + + $records = array_filter($records, function ($record) use ($level) { + return ($record['level'] >= $level); + }); + + if ($records) { + $this->send($this->getFormatter()->formatBatch($records), self::ENDPOINT_BATCH); + } + } + + protected function send($data, $endpoint) + { + $url = sprintf("https://%s/%s/%s/", self::HOST, $endpoint, $this->token); + + $headers = array('Content-Type: application/json'); + + if (!empty($this->tag)) { + $headers[] = 'X-LOGGLY-TAG: '.implode(',', $this->tag); + } + + $ch = curl_init(); + + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, $data); + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + + Curl\Util::execute($ch); + } + + protected function getDefaultFormatter() + { + return new LogglyFormatter(); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php new file mode 100644 index 0000000000..9e23283852 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php @@ -0,0 +1,67 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +/** + * Base class for all mail handlers + * + * @author Gyula Sallai + */ +abstract class MailHandler extends AbstractProcessingHandler +{ + /** + * {@inheritdoc} + */ + public function handleBatch(array $records) + { + $messages = array(); + + foreach ($records as $record) { + if ($record['level'] < $this->level) { + continue; + } + $messages[] = $this->processRecord($record); + } + + if (!empty($messages)) { + $this->send((string) $this->getFormatter()->formatBatch($messages), $messages); + } + } + + /** + * Send a mail with the given content + * + * @param string $content formatted email body to be sent + * @param array $records the array of log records that formed this content + */ + abstract protected function send($content, array $records); + + /** + * {@inheritdoc} + */ + protected function write(array $record) + { + $this->send((string) $record['formatted'], array($record)); + } + + protected function getHighestRecord(array $records) + { + $highestRecord = null; + foreach ($records as $record) { + if ($highestRecord === null || $highestRecord['level'] < $record['level']) { + $highestRecord = $record; + } + } + + return $highestRecord; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php new file mode 100644 index 0000000000..3f0956a9c8 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php @@ -0,0 +1,68 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; + +/** + * MandrillHandler uses cURL to send the emails to the Mandrill API + * + * @author Adam Nicholson + */ +class MandrillHandler extends MailHandler +{ + protected $message; + protected $apiKey; + + /** + * @param string $apiKey A valid Mandrill API key + * @param callable|\Swift_Message $message An example message for real messages, only the body will be replaced + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct($apiKey, $message, $level = Logger::ERROR, $bubble = true) + { + parent::__construct($level, $bubble); + + if (!$message instanceof \Swift_Message && is_callable($message)) { + $message = call_user_func($message); + } + if (!$message instanceof \Swift_Message) { + throw new \InvalidArgumentException('You must provide either a Swift_Message instance or a callable returning it'); + } + $this->message = $message; + $this->apiKey = $apiKey; + } + + /** + * {@inheritdoc} + */ + protected function send($content, array $records) + { + $message = clone $this->message; + $message->setBody($content); + $message->setDate(time()); + + $ch = curl_init(); + + curl_setopt($ch, CURLOPT_URL, 'https://mandrillapp.com/api/1.0/messages/send-raw.json'); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array( + 'key' => $this->apiKey, + 'raw_message' => (string) $message, + 'async' => false, + ))); + + Curl\Util::execute($ch); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php b/vendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php new file mode 100644 index 0000000000..4724a7e2d0 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.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 Monolog\Handler; + +/** + * Exception can be thrown if an extension for an handler is missing + * + * @author Christian Bergau + */ +class MissingExtensionException extends \Exception +{ +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php new file mode 100644 index 0000000000..56fe755b96 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.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 Monolog\Handler; + +use Monolog\Logger; +use Monolog\Formatter\NormalizerFormatter; + +/** + * Logs to a MongoDB database. + * + * usage example: + * + * $log = new Logger('application'); + * $mongodb = new MongoDBHandler(new \Mongo("mongodb://localhost:27017"), "logs", "prod"); + * $log->pushHandler($mongodb); + * + * @author Thomas Tourlourat + */ +class MongoDBHandler extends AbstractProcessingHandler +{ + protected $mongoCollection; + + public function __construct($mongo, $database, $collection, $level = Logger::DEBUG, $bubble = true) + { + if (!($mongo instanceof \MongoClient || $mongo instanceof \Mongo || $mongo instanceof \MongoDB\Client)) { + throw new \InvalidArgumentException('MongoClient, Mongo or MongoDB\Client instance required'); + } + + $this->mongoCollection = $mongo->selectCollection($database, $collection); + + parent::__construct($level, $bubble); + } + + protected function write(array $record) + { + if ($this->mongoCollection instanceof \MongoDB\Collection) { + $this->mongoCollection->insertOne($record["formatted"]); + } else { + $this->mongoCollection->save($record["formatted"]); + } + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter() + { + return new NormalizerFormatter(); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php new file mode 100644 index 0000000000..d7807fd116 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php @@ -0,0 +1,185 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Formatter\LineFormatter; + +/** + * NativeMailerHandler uses the mail() function to send the emails + * + * @author Christophe Coevoet + * @author Mark Garrett + */ +class NativeMailerHandler extends MailHandler +{ + /** + * The email addresses to which the message will be sent + * @var array + */ + protected $to; + + /** + * The subject of the email + * @var string + */ + protected $subject; + + /** + * Optional headers for the message + * @var array + */ + protected $headers = array(); + + /** + * Optional parameters for the message + * @var array + */ + protected $parameters = array(); + + /** + * The wordwrap length for the message + * @var int + */ + protected $maxColumnWidth; + + /** + * The Content-type for the message + * @var string + */ + protected $contentType = 'text/plain'; + + /** + * The encoding for the message + * @var string + */ + protected $encoding = 'utf-8'; + + /** + * @param string|array $to The receiver of the mail + * @param string $subject The subject of the mail + * @param string $from The sender of the mail + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @param int $maxColumnWidth The maximum column width that the message lines will have + */ + public function __construct($to, $subject, $from, $level = Logger::ERROR, $bubble = true, $maxColumnWidth = 70) + { + parent::__construct($level, $bubble); + $this->to = is_array($to) ? $to : array($to); + $this->subject = $subject; + $this->addHeader(sprintf('From: %s', $from)); + $this->maxColumnWidth = $maxColumnWidth; + } + + /** + * Add headers to the message + * + * @param string|array $headers Custom added headers + * @return self + */ + public function addHeader($headers) + { + foreach ((array) $headers as $header) { + if (strpos($header, "\n") !== false || strpos($header, "\r") !== false) { + throw new \InvalidArgumentException('Headers can not contain newline characters for security reasons'); + } + $this->headers[] = $header; + } + + return $this; + } + + /** + * Add parameters to the message + * + * @param string|array $parameters Custom added parameters + * @return self + */ + public function addParameter($parameters) + { + $this->parameters = array_merge($this->parameters, (array) $parameters); + + return $this; + } + + /** + * {@inheritdoc} + */ + protected function send($content, array $records) + { + $content = wordwrap($content, $this->maxColumnWidth); + $headers = ltrim(implode("\r\n", $this->headers) . "\r\n", "\r\n"); + $headers .= 'Content-type: ' . $this->getContentType() . '; charset=' . $this->getEncoding() . "\r\n"; + if ($this->getContentType() == 'text/html' && false === strpos($headers, 'MIME-Version:')) { + $headers .= 'MIME-Version: 1.0' . "\r\n"; + } + + $subject = $this->subject; + if ($records) { + $subjectFormatter = new LineFormatter($this->subject); + $subject = $subjectFormatter->format($this->getHighestRecord($records)); + } + + $parameters = implode(' ', $this->parameters); + foreach ($this->to as $to) { + mail($to, $subject, $content, $headers, $parameters); + } + } + + /** + * @return string $contentType + */ + public function getContentType() + { + return $this->contentType; + } + + /** + * @return string $encoding + */ + public function getEncoding() + { + return $this->encoding; + } + + /** + * @param string $contentType The content type of the email - Defaults to text/plain. Use text/html for HTML + * messages. + * @return self + */ + public function setContentType($contentType) + { + if (strpos($contentType, "\n") !== false || strpos($contentType, "\r") !== false) { + throw new \InvalidArgumentException('The content type can not contain newline characters to prevent email header injection'); + } + + $this->contentType = $contentType; + + return $this; + } + + /** + * @param string $encoding + * @return self + */ + public function setEncoding($encoding) + { + if (strpos($encoding, "\n") !== false || strpos($encoding, "\r") !== false) { + throw new \InvalidArgumentException('The encoding can not contain newline characters to prevent email header injection'); + } + + $this->encoding = $encoding; + + return $this; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php new file mode 100644 index 0000000000..64dc1381a5 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php @@ -0,0 +1,205 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Utils; +use Monolog\Formatter\NormalizerFormatter; + +/** + * Class to record a log on a NewRelic application. + * Enabling New Relic High Security mode may prevent capture of useful information. + * + * This handler requires a NormalizerFormatter to function and expects an array in $record['formatted'] + * + * @see https://docs.newrelic.com/docs/agents/php-agent + * @see https://docs.newrelic.com/docs/accounts-partnerships/accounts/security/high-security + */ +class NewRelicHandler extends AbstractProcessingHandler +{ + /** + * Name of the New Relic application that will receive logs from this handler. + * + * @var string + */ + protected $appName; + + /** + * Name of the current transaction + * + * @var string + */ + protected $transactionName; + + /** + * Some context and extra data is passed into the handler as arrays of values. Do we send them as is + * (useful if we are using the API), or explode them for display on the NewRelic RPM website? + * + * @var bool + */ + protected $explodeArrays; + + /** + * {@inheritDoc} + * + * @param string $appName + * @param bool $explodeArrays + * @param string $transactionName + */ + public function __construct( + $level = Logger::ERROR, + $bubble = true, + $appName = null, + $explodeArrays = false, + $transactionName = null + ) { + parent::__construct($level, $bubble); + + $this->appName = $appName; + $this->explodeArrays = $explodeArrays; + $this->transactionName = $transactionName; + } + + /** + * {@inheritDoc} + */ + protected function write(array $record) + { + if (!$this->isNewRelicEnabled()) { + throw new MissingExtensionException('The newrelic PHP extension is required to use the NewRelicHandler'); + } + + if ($appName = $this->getAppName($record['context'])) { + $this->setNewRelicAppName($appName); + } + + if ($transactionName = $this->getTransactionName($record['context'])) { + $this->setNewRelicTransactionName($transactionName); + unset($record['formatted']['context']['transaction_name']); + } + + if (isset($record['context']['exception']) && ($record['context']['exception'] instanceof \Exception || (PHP_VERSION_ID >= 70000 && $record['context']['exception'] instanceof \Throwable))) { + newrelic_notice_error($record['message'], $record['context']['exception']); + unset($record['formatted']['context']['exception']); + } else { + newrelic_notice_error($record['message']); + } + + if (isset($record['formatted']['context']) && is_array($record['formatted']['context'])) { + foreach ($record['formatted']['context'] as $key => $parameter) { + if (is_array($parameter) && $this->explodeArrays) { + foreach ($parameter as $paramKey => $paramValue) { + $this->setNewRelicParameter('context_' . $key . '_' . $paramKey, $paramValue); + } + } else { + $this->setNewRelicParameter('context_' . $key, $parameter); + } + } + } + + if (isset($record['formatted']['extra']) && is_array($record['formatted']['extra'])) { + foreach ($record['formatted']['extra'] as $key => $parameter) { + if (is_array($parameter) && $this->explodeArrays) { + foreach ($parameter as $paramKey => $paramValue) { + $this->setNewRelicParameter('extra_' . $key . '_' . $paramKey, $paramValue); + } + } else { + $this->setNewRelicParameter('extra_' . $key, $parameter); + } + } + } + } + + /** + * Checks whether the NewRelic extension is enabled in the system. + * + * @return bool + */ + protected function isNewRelicEnabled() + { + return extension_loaded('newrelic'); + } + + /** + * Returns the appname where this log should be sent. Each log can override the default appname, set in this + * handler's constructor, by providing the appname in it's context. + * + * @param array $context + * @return null|string + */ + protected function getAppName(array $context) + { + if (isset($context['appname'])) { + return $context['appname']; + } + + return $this->appName; + } + + /** + * Returns the name of the current transaction. Each log can override the default transaction name, set in this + * handler's constructor, by providing the transaction_name in it's context + * + * @param array $context + * + * @return null|string + */ + protected function getTransactionName(array $context) + { + if (isset($context['transaction_name'])) { + return $context['transaction_name']; + } + + return $this->transactionName; + } + + /** + * Sets the NewRelic application that should receive this log. + * + * @param string $appName + */ + protected function setNewRelicAppName($appName) + { + newrelic_set_appname($appName); + } + + /** + * Overwrites the name of the current transaction + * + * @param string $transactionName + */ + protected function setNewRelicTransactionName($transactionName) + { + newrelic_name_transaction($transactionName); + } + + /** + * @param string $key + * @param mixed $value + */ + protected function setNewRelicParameter($key, $value) + { + if (null === $value || is_scalar($value)) { + newrelic_add_custom_parameter($key, $value); + } else { + newrelic_add_custom_parameter($key, Utils::jsonEncode($value, null, true)); + } + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter() + { + return new NormalizerFormatter(); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php new file mode 100644 index 0000000000..4b8458833c --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php @@ -0,0 +1,45 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; + +/** + * Blackhole + * + * Any record it can handle will be thrown away. This can be used + * to put on top of an existing stack to override it temporarily. + * + * @author Jordi Boggiano + */ +class NullHandler extends AbstractHandler +{ + /** + * @param int $level The minimum logging level at which this handler will be triggered + */ + public function __construct($level = Logger::DEBUG) + { + parent::__construct($level, false); + } + + /** + * {@inheritdoc} + */ + public function handle(array $record) + { + if ($record['level'] < $this->level) { + return false; + } + + return true; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php new file mode 100644 index 0000000000..d0a8b43e71 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php @@ -0,0 +1,243 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Exception; +use Monolog\Formatter\LineFormatter; +use Monolog\Logger; +use Monolog\Utils; +use PhpConsole\Connector; +use PhpConsole\Handler; +use PhpConsole\Helper; + +/** + * Monolog handler for Google Chrome extension "PHP Console" + * + * Display PHP error/debug log messages in Google Chrome console and notification popups, executes PHP code remotely + * + * Usage: + * 1. Install Google Chrome extension https://chrome.google.com/webstore/detail/php-console/nfhmhhlpfleoednkpnnnkolmclajemef + * 2. See overview https://github.com/barbushin/php-console#overview + * 3. Install PHP Console library https://github.com/barbushin/php-console#installation + * 4. Example (result will looks like http://i.hizliresim.com/vg3Pz4.png) + * + * $logger = new \Monolog\Logger('all', array(new \Monolog\Handler\PHPConsoleHandler())); + * \Monolog\ErrorHandler::register($logger); + * echo $undefinedVar; + * $logger->addDebug('SELECT * FROM users', array('db', 'time' => 0.012)); + * PC::debug($_SERVER); // PHP Console debugger for any type of vars + * + * @author Sergey Barbushin https://www.linkedin.com/in/barbushin + */ +class PHPConsoleHandler extends AbstractProcessingHandler +{ + private $options = array( + 'enabled' => true, // bool Is PHP Console server enabled + 'classesPartialsTraceIgnore' => array('Monolog\\'), // array Hide calls of classes started with... + 'debugTagsKeysInContext' => array(0, 'tag'), // bool Is PHP Console server enabled + 'useOwnErrorsHandler' => false, // bool Enable errors handling + 'useOwnExceptionsHandler' => false, // bool Enable exceptions handling + 'sourcesBasePath' => null, // string Base path of all project sources to strip in errors source paths + 'registerHelper' => true, // bool Register PhpConsole\Helper that allows short debug calls like PC::debug($var, 'ta.g.s') + 'serverEncoding' => null, // string|null Server internal encoding + 'headersLimit' => null, // int|null Set headers size limit for your web-server + 'password' => null, // string|null Protect PHP Console connection by password + 'enableSslOnlyMode' => false, // bool Force connection by SSL for clients with PHP Console installed + 'ipMasks' => array(), // array Set IP masks of clients that will be allowed to connect to PHP Console: array('192.168.*.*', '127.0.0.1') + 'enableEvalListener' => false, // bool Enable eval request to be handled by eval dispatcher(if enabled, 'password' option is also required) + 'dumperDetectCallbacks' => false, // bool Convert callback items in dumper vars to (callback SomeClass::someMethod) strings + 'dumperLevelLimit' => 5, // int Maximum dumped vars array or object nested dump level + 'dumperItemsCountLimit' => 100, // int Maximum dumped var same level array items or object properties number + 'dumperItemSizeLimit' => 5000, // int Maximum length of any string or dumped array item + 'dumperDumpSizeLimit' => 500000, // int Maximum approximate size of dumped vars result formatted in JSON + 'detectDumpTraceAndSource' => false, // bool Autodetect and append trace data to debug + 'dataStorage' => null, // PhpConsole\Storage|null Fixes problem with custom $_SESSION handler(see http://goo.gl/Ne8juJ) + ); + + /** @var Connector */ + private $connector; + + /** + * @param array $options See \Monolog\Handler\PHPConsoleHandler::$options for more details + * @param Connector|null $connector Instance of \PhpConsole\Connector class (optional) + * @param int $level + * @param bool $bubble + * @throws Exception + */ + public function __construct(array $options = array(), Connector $connector = null, $level = Logger::DEBUG, $bubble = true) + { + if (!class_exists('PhpConsole\Connector')) { + throw new Exception('PHP Console library not found. See https://github.com/barbushin/php-console#installation'); + } + parent::__construct($level, $bubble); + $this->options = $this->initOptions($options); + $this->connector = $this->initConnector($connector); + } + + private function initOptions(array $options) + { + $wrongOptions = array_diff(array_keys($options), array_keys($this->options)); + if ($wrongOptions) { + throw new Exception('Unknown options: ' . implode(', ', $wrongOptions)); + } + + return array_replace($this->options, $options); + } + + private function initConnector(Connector $connector = null) + { + if (!$connector) { + if ($this->options['dataStorage']) { + Connector::setPostponeStorage($this->options['dataStorage']); + } + $connector = Connector::getInstance(); + } + + if ($this->options['registerHelper'] && !Helper::isRegistered()) { + Helper::register(); + } + + if ($this->options['enabled'] && $connector->isActiveClient()) { + if ($this->options['useOwnErrorsHandler'] || $this->options['useOwnExceptionsHandler']) { + $handler = Handler::getInstance(); + $handler->setHandleErrors($this->options['useOwnErrorsHandler']); + $handler->setHandleExceptions($this->options['useOwnExceptionsHandler']); + $handler->start(); + } + if ($this->options['sourcesBasePath']) { + $connector->setSourcesBasePath($this->options['sourcesBasePath']); + } + if ($this->options['serverEncoding']) { + $connector->setServerEncoding($this->options['serverEncoding']); + } + if ($this->options['password']) { + $connector->setPassword($this->options['password']); + } + if ($this->options['enableSslOnlyMode']) { + $connector->enableSslOnlyMode(); + } + if ($this->options['ipMasks']) { + $connector->setAllowedIpMasks($this->options['ipMasks']); + } + if ($this->options['headersLimit']) { + $connector->setHeadersLimit($this->options['headersLimit']); + } + if ($this->options['detectDumpTraceAndSource']) { + $connector->getDebugDispatcher()->detectTraceAndSource = true; + } + $dumper = $connector->getDumper(); + $dumper->levelLimit = $this->options['dumperLevelLimit']; + $dumper->itemsCountLimit = $this->options['dumperItemsCountLimit']; + $dumper->itemSizeLimit = $this->options['dumperItemSizeLimit']; + $dumper->dumpSizeLimit = $this->options['dumperDumpSizeLimit']; + $dumper->detectCallbacks = $this->options['dumperDetectCallbacks']; + if ($this->options['enableEvalListener']) { + $connector->startEvalRequestsListener(); + } + } + + return $connector; + } + + public function getConnector() + { + return $this->connector; + } + + public function getOptions() + { + return $this->options; + } + + public function handle(array $record) + { + if ($this->options['enabled'] && $this->connector->isActiveClient()) { + return parent::handle($record); + } + + return !$this->bubble; + } + + /** + * Writes the record down to the log of the implementing handler + * + * @param array $record + * @return void + */ + protected function write(array $record) + { + if ($record['level'] < Logger::NOTICE) { + $this->handleDebugRecord($record); + } elseif (isset($record['context']['exception']) && $record['context']['exception'] instanceof Exception) { + $this->handleExceptionRecord($record); + } else { + $this->handleErrorRecord($record); + } + } + + private function handleDebugRecord(array $record) + { + $tags = $this->getRecordTags($record); + $message = $record['message']; + if ($record['context']) { + $message .= ' ' . Utils::jsonEncode($this->connector->getDumper()->dump(array_filter($record['context'])), null, true); + } + $this->connector->getDebugDispatcher()->dispatchDebug($message, $tags, $this->options['classesPartialsTraceIgnore']); + } + + private function handleExceptionRecord(array $record) + { + $this->connector->getErrorsDispatcher()->dispatchException($record['context']['exception']); + } + + private function handleErrorRecord(array $record) + { + $context = $record['context']; + + $this->connector->getErrorsDispatcher()->dispatchError( + isset($context['code']) ? $context['code'] : null, + isset($context['message']) ? $context['message'] : $record['message'], + isset($context['file']) ? $context['file'] : null, + isset($context['line']) ? $context['line'] : null, + $this->options['classesPartialsTraceIgnore'] + ); + } + + private function getRecordTags(array &$record) + { + $tags = null; + if (!empty($record['context'])) { + $context = & $record['context']; + foreach ($this->options['debugTagsKeysInContext'] as $key) { + if (!empty($context[$key])) { + $tags = $context[$key]; + if ($key === 0) { + array_shift($context); + } else { + unset($context[$key]); + } + break; + } + } + } + + return $tags ?: strtolower($record['level_name']); + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter() + { + return new LineFormatter('%message%'); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.php b/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.php new file mode 100644 index 0000000000..66a3d83ae3 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Processor\ProcessorInterface; + +/** + * Interface to describe loggers that have processors + * + * This interface is present in monolog 1.x to ease forward compatibility. + * + * @author Jordi Boggiano + */ +interface ProcessableHandlerInterface +{ + /** + * Adds a processor in the stack. + * + * @param ProcessorInterface|callable $callback + * @return HandlerInterface self + */ + public function pushProcessor($callback): HandlerInterface; + + /** + * Removes the processor on top of the stack and returns it. + * + * @throws \LogicException In case the processor stack is empty + * @return callable + */ + public function popProcessor(): callable; +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.php b/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.php new file mode 100644 index 0000000000..09f32a12c7 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.php @@ -0,0 +1,73 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\ResettableInterface; + +/** + * Helper trait for implementing ProcessableInterface + * + * This trait is present in monolog 1.x to ease forward compatibility. + * + * @author Jordi Boggiano + */ +trait ProcessableHandlerTrait +{ + /** + * @var callable[] + */ + protected $processors = []; + + /** + * {@inheritdoc} + * @suppress PhanTypeMismatchReturn + */ + public function pushProcessor($callback): HandlerInterface + { + array_unshift($this->processors, $callback); + + return $this; + } + + /** + * {@inheritdoc} + */ + public function popProcessor(): callable + { + if (!$this->processors) { + throw new \LogicException('You tried to pop from an empty processor stack.'); + } + + return array_shift($this->processors); + } + + /** + * Processes a record. + */ + protected function processRecord(array $record): array + { + foreach ($this->processors as $processor) { + $record = $processor($record); + } + + return $record; + } + + protected function resetProcessors(): void + { + foreach ($this->processors as $processor) { + if ($processor instanceof ResettableInterface) { + $processor->reset(); + } + } + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php new file mode 100644 index 0000000000..a99e6ab719 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php @@ -0,0 +1,56 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Psr\Log\LoggerInterface; + +/** + * Proxies log messages to an existing PSR-3 compliant logger. + * + * @author Michael Moussa + */ +class PsrHandler extends AbstractHandler +{ + /** + * PSR-3 compliant logger + * + * @var LoggerInterface + */ + protected $logger; + + /** + * @param LoggerInterface $logger The underlying PSR-3 compliant logger to which messages will be proxied + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct(LoggerInterface $logger, $level = Logger::DEBUG, $bubble = true) + { + parent::__construct($level, $bubble); + + $this->logger = $logger; + } + + /** + * {@inheritDoc} + */ + public function handle(array $record) + { + if (!$this->isHandling($record)) { + return false; + } + + $this->logger->log(strtolower($record['level_name']), $record['message'], $record['context']); + + return false === $this->bubble; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php new file mode 100644 index 0000000000..f27bb3da07 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php @@ -0,0 +1,185 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; + +/** + * Sends notifications through the pushover api to mobile phones + * + * @author Sebastian Göttschkes + * @see https://www.pushover.net/api + */ +class PushoverHandler extends SocketHandler +{ + private $token; + private $users; + private $title; + private $user; + private $retry; + private $expire; + + private $highPriorityLevel; + private $emergencyLevel; + private $useFormattedMessage = false; + + /** + * All parameters that can be sent to Pushover + * @see https://pushover.net/api + * @var array + */ + private $parameterNames = array( + 'token' => true, + 'user' => true, + 'message' => true, + 'device' => true, + 'title' => true, + 'url' => true, + 'url_title' => true, + 'priority' => true, + 'timestamp' => true, + 'sound' => true, + 'retry' => true, + 'expire' => true, + 'callback' => true, + ); + + /** + * Sounds the api supports by default + * @see https://pushover.net/api#sounds + * @var array + */ + private $sounds = array( + 'pushover', 'bike', 'bugle', 'cashregister', 'classical', 'cosmic', 'falling', 'gamelan', 'incoming', + 'intermission', 'magic', 'mechanical', 'pianobar', 'siren', 'spacealarm', 'tugboat', 'alien', 'climb', + 'persistent', 'echo', 'updown', 'none', + ); + + /** + * @param string $token Pushover api token + * @param string|array $users Pushover user id or array of ids the message will be sent to + * @param string $title Title sent to the Pushover API + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @param bool $useSSL Whether to connect via SSL. Required when pushing messages to users that are not + * the pushover.net app owner. OpenSSL is required for this option. + * @param int $highPriorityLevel The minimum logging level at which this handler will start + * sending "high priority" requests to the Pushover API + * @param int $emergencyLevel The minimum logging level at which this handler will start + * sending "emergency" requests to the Pushover API + * @param int $retry The retry parameter specifies how often (in seconds) the Pushover servers will send the same notification to the user. + * @param int $expire The expire parameter specifies how many seconds your notification will continue to be retried for (every retry seconds). + */ + public function __construct($token, $users, $title = null, $level = Logger::CRITICAL, $bubble = true, $useSSL = true, $highPriorityLevel = Logger::CRITICAL, $emergencyLevel = Logger::EMERGENCY, $retry = 30, $expire = 25200) + { + $connectionString = $useSSL ? 'ssl://api.pushover.net:443' : 'api.pushover.net:80'; + parent::__construct($connectionString, $level, $bubble); + + $this->token = $token; + $this->users = (array) $users; + $this->title = $title ?: gethostname(); + $this->highPriorityLevel = Logger::toMonologLevel($highPriorityLevel); + $this->emergencyLevel = Logger::toMonologLevel($emergencyLevel); + $this->retry = $retry; + $this->expire = $expire; + } + + protected function generateDataStream($record) + { + $content = $this->buildContent($record); + + return $this->buildHeader($content) . $content; + } + + private function buildContent($record) + { + // Pushover has a limit of 512 characters on title and message combined. + $maxMessageLength = 512 - strlen($this->title); + + $message = ($this->useFormattedMessage) ? $record['formatted'] : $record['message']; + $message = substr($message, 0, $maxMessageLength); + + $timestamp = $record['datetime']->getTimestamp(); + + $dataArray = array( + 'token' => $this->token, + 'user' => $this->user, + 'message' => $message, + 'title' => $this->title, + 'timestamp' => $timestamp, + ); + + if (isset($record['level']) && $record['level'] >= $this->emergencyLevel) { + $dataArray['priority'] = 2; + $dataArray['retry'] = $this->retry; + $dataArray['expire'] = $this->expire; + } elseif (isset($record['level']) && $record['level'] >= $this->highPriorityLevel) { + $dataArray['priority'] = 1; + } + + // First determine the available parameters + $context = array_intersect_key($record['context'], $this->parameterNames); + $extra = array_intersect_key($record['extra'], $this->parameterNames); + + // Least important info should be merged with subsequent info + $dataArray = array_merge($extra, $context, $dataArray); + + // Only pass sounds that are supported by the API + if (isset($dataArray['sound']) && !in_array($dataArray['sound'], $this->sounds)) { + unset($dataArray['sound']); + } + + return http_build_query($dataArray); + } + + private function buildHeader($content) + { + $header = "POST /1/messages.json HTTP/1.1\r\n"; + $header .= "Host: api.pushover.net\r\n"; + $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; + $header .= "Content-Length: " . strlen($content) . "\r\n"; + $header .= "\r\n"; + + return $header; + } + + protected function write(array $record) + { + foreach ($this->users as $user) { + $this->user = $user; + + parent::write($record); + $this->closeSocket(); + } + + $this->user = null; + } + + public function setHighPriorityLevel($value) + { + $this->highPriorityLevel = $value; + } + + public function setEmergencyLevel($value) + { + $this->emergencyLevel = $value; + } + + /** + * Use the formatted message? + * @param bool $value + */ + public function useFormattedMessage($value) + { + $this->useFormattedMessage = (bool) $value; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php new file mode 100644 index 0000000000..9d24dfe864 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php @@ -0,0 +1,234 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\LineFormatter; +use Monolog\Formatter\FormatterInterface; +use Monolog\Logger; +use Raven_Client; + +/** + * Handler to send messages to a Sentry (https://github.com/getsentry/sentry) server + * using sentry-php (https://github.com/getsentry/sentry-php) + * + * @author Marc Abramowitz + */ +class RavenHandler extends AbstractProcessingHandler +{ + /** + * Translates Monolog log levels to Raven log levels. + */ + protected $logLevels = array( + Logger::DEBUG => Raven_Client::DEBUG, + Logger::INFO => Raven_Client::INFO, + Logger::NOTICE => Raven_Client::INFO, + Logger::WARNING => Raven_Client::WARNING, + Logger::ERROR => Raven_Client::ERROR, + Logger::CRITICAL => Raven_Client::FATAL, + Logger::ALERT => Raven_Client::FATAL, + Logger::EMERGENCY => Raven_Client::FATAL, + ); + + /** + * @var string should represent the current version of the calling + * software. Can be any string (git commit, version number) + */ + protected $release; + + /** + * @var Raven_Client the client object that sends the message to the server + */ + protected $ravenClient; + + /** + * @var LineFormatter The formatter to use for the logs generated via handleBatch() + */ + protected $batchFormatter; + + /** + * @param Raven_Client $ravenClient + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct(Raven_Client $ravenClient, $level = Logger::DEBUG, $bubble = true) + { + @trigger_error('The Monolog\Handler\RavenHandler class is deprecated. You should rather upgrade to the sentry/sentry 2.x and use Sentry\Monolog\Handler, see https://github.com/getsentry/sentry-php/blob/master/src/Monolog/Handler.php', E_USER_DEPRECATED); + + parent::__construct($level, $bubble); + + $this->ravenClient = $ravenClient; + } + + /** + * {@inheritdoc} + */ + public function handleBatch(array $records) + { + $level = $this->level; + + // filter records based on their level + $records = array_filter($records, function ($record) use ($level) { + return $record['level'] >= $level; + }); + + if (!$records) { + return; + } + + // the record with the highest severity is the "main" one + $record = array_reduce($records, function ($highest, $record) { + if (null === $highest || $record['level'] > $highest['level']) { + return $record; + } + + return $highest; + }); + + // the other ones are added as a context item + $logs = array(); + foreach ($records as $r) { + $logs[] = $this->processRecord($r); + } + + if ($logs) { + $record['context']['logs'] = (string) $this->getBatchFormatter()->formatBatch($logs); + } + + $this->handle($record); + } + + /** + * Sets the formatter for the logs generated by handleBatch(). + * + * @param FormatterInterface $formatter + */ + public function setBatchFormatter(FormatterInterface $formatter) + { + $this->batchFormatter = $formatter; + } + + /** + * Gets the formatter for the logs generated by handleBatch(). + * + * @return FormatterInterface + */ + public function getBatchFormatter() + { + if (!$this->batchFormatter) { + $this->batchFormatter = $this->getDefaultBatchFormatter(); + } + + return $this->batchFormatter; + } + + /** + * {@inheritdoc} + */ + protected function write(array $record) + { + $previousUserContext = false; + $options = array(); + $options['level'] = $this->logLevels[$record['level']]; + $options['tags'] = array(); + if (!empty($record['extra']['tags'])) { + $options['tags'] = array_merge($options['tags'], $record['extra']['tags']); + unset($record['extra']['tags']); + } + if (!empty($record['context']['tags'])) { + $options['tags'] = array_merge($options['tags'], $record['context']['tags']); + unset($record['context']['tags']); + } + if (!empty($record['context']['fingerprint'])) { + $options['fingerprint'] = $record['context']['fingerprint']; + unset($record['context']['fingerprint']); + } + if (!empty($record['context']['logger'])) { + $options['logger'] = $record['context']['logger']; + unset($record['context']['logger']); + } else { + $options['logger'] = $record['channel']; + } + foreach ($this->getExtraParameters() as $key) { + foreach (array('extra', 'context') as $source) { + if (!empty($record[$source][$key])) { + $options[$key] = $record[$source][$key]; + unset($record[$source][$key]); + } + } + } + if (!empty($record['context'])) { + $options['extra']['context'] = $record['context']; + if (!empty($record['context']['user'])) { + $previousUserContext = $this->ravenClient->context->user; + $this->ravenClient->user_context($record['context']['user']); + unset($options['extra']['context']['user']); + } + } + if (!empty($record['extra'])) { + $options['extra']['extra'] = $record['extra']; + } + + if (!empty($this->release) && !isset($options['release'])) { + $options['release'] = $this->release; + } + + if (isset($record['context']['exception']) && ($record['context']['exception'] instanceof \Exception || (PHP_VERSION_ID >= 70000 && $record['context']['exception'] instanceof \Throwable))) { + $options['message'] = $record['formatted']; + $this->ravenClient->captureException($record['context']['exception'], $options); + } else { + $this->ravenClient->captureMessage($record['formatted'], array(), $options); + } + + if ($previousUserContext !== false) { + $this->ravenClient->user_context($previousUserContext); + } + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter() + { + return new LineFormatter('[%channel%] %message%'); + } + + /** + * Gets the default formatter for the logs generated by handleBatch(). + * + * @return FormatterInterface + */ + protected function getDefaultBatchFormatter() + { + return new LineFormatter(); + } + + /** + * Gets extra parameters supported by Raven that can be found in "extra" and "context" + * + * @return array + */ + protected function getExtraParameters() + { + return array('contexts', 'checksum', 'release', 'event_id'); + } + + /** + * @param string $value + * @return self + */ + public function setRelease($value) + { + $this->release = $value; + + return $this; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php new file mode 100644 index 0000000000..bb00db5097 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php @@ -0,0 +1,98 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\LineFormatter; +use Monolog\Logger; + +/** + * Logs to a Redis key using rpush + * + * usage example: + * + * $log = new Logger('application'); + * $redis = new RedisHandler(new Predis\Client("tcp://localhost:6379"), "logs", "prod"); + * $log->pushHandler($redis); + * + * @author Thomas Tourlourat + */ +class RedisHandler extends AbstractProcessingHandler +{ + private $redisClient; + private $redisKey; + protected $capSize; + + /** + * @param \Predis\Client|\Redis $redis The redis instance + * @param string $key The key name to push records to + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @param int $capSize Number of entries to limit list size to + */ + public function __construct($redis, $key, $level = Logger::DEBUG, $bubble = true, $capSize = false) + { + if (!(($redis instanceof \Predis\Client) || ($redis instanceof \Redis))) { + throw new \InvalidArgumentException('Predis\Client or Redis instance required'); + } + + $this->redisClient = $redis; + $this->redisKey = $key; + $this->capSize = $capSize; + + parent::__construct($level, $bubble); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record) + { + if ($this->capSize) { + $this->writeCapped($record); + } else { + $this->redisClient->rpush($this->redisKey, $record["formatted"]); + } + } + + /** + * Write and cap the collection + * Writes the record to the redis list and caps its + * + * @param array $record associative record array + * @return void + */ + protected function writeCapped(array $record) + { + if ($this->redisClient instanceof \Redis) { + $mode = defined('\Redis::MULTI') ? \Redis::MULTI : 1; + $this->redisClient->multi($mode) + ->rpush($this->redisKey, $record["formatted"]) + ->ltrim($this->redisKey, -$this->capSize, -1) + ->exec(); + } else { + $redisKey = $this->redisKey; + $capSize = $this->capSize; + $this->redisClient->transaction(function ($tx) use ($record, $redisKey, $capSize) { + $tx->rpush($redisKey, $record["formatted"]); + $tx->ltrim($redisKey, -$capSize, -1); + }); + } + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter() + { + return new LineFormatter(); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php new file mode 100644 index 0000000000..65073ffe39 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php @@ -0,0 +1,144 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use RollbarNotifier; +use Exception; +use Monolog\Logger; + +/** + * Sends errors to Rollbar + * + * If the context data contains a `payload` key, that is used as an array + * of payload options to RollbarNotifier's report_message/report_exception methods. + * + * Rollbar's context info will contain the context + extra keys from the log record + * merged, and then on top of that a few keys: + * + * - level (rollbar level name) + * - monolog_level (monolog level name, raw level, as rollbar only has 5 but monolog 8) + * - channel + * - datetime (unix timestamp) + * + * @author Paul Statezny + */ +class RollbarHandler extends AbstractProcessingHandler +{ + /** + * Rollbar notifier + * + * @var RollbarNotifier + */ + protected $rollbarNotifier; + + protected $levelMap = array( + Logger::DEBUG => 'debug', + Logger::INFO => 'info', + Logger::NOTICE => 'info', + Logger::WARNING => 'warning', + Logger::ERROR => 'error', + Logger::CRITICAL => 'critical', + Logger::ALERT => 'critical', + Logger::EMERGENCY => 'critical', + ); + + /** + * Records whether any log records have been added since the last flush of the rollbar notifier + * + * @var bool + */ + private $hasRecords = false; + + protected $initialized = false; + + /** + * @param RollbarNotifier $rollbarNotifier RollbarNotifier object constructed with valid token + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct(RollbarNotifier $rollbarNotifier, $level = Logger::ERROR, $bubble = true) + { + $this->rollbarNotifier = $rollbarNotifier; + + parent::__construct($level, $bubble); + } + + /** + * {@inheritdoc} + */ + protected function write(array $record) + { + if (!$this->initialized) { + // __destructor() doesn't get called on Fatal errors + register_shutdown_function(array($this, 'close')); + $this->initialized = true; + } + + $context = $record['context']; + $payload = array(); + if (isset($context['payload'])) { + $payload = $context['payload']; + unset($context['payload']); + } + $context = array_merge($context, $record['extra'], array( + 'level' => $this->levelMap[$record['level']], + 'monolog_level' => $record['level_name'], + 'channel' => $record['channel'], + 'datetime' => $record['datetime']->format('U'), + )); + + if (isset($context['exception']) && $context['exception'] instanceof Exception) { + $payload['level'] = $context['level']; + $exception = $context['exception']; + unset($context['exception']); + + $this->rollbarNotifier->report_exception($exception, $context, $payload); + } else { + $this->rollbarNotifier->report_message( + $record['message'], + $context['level'], + $context, + $payload + ); + } + + $this->hasRecords = true; + } + + public function flush() + { + if ($this->hasRecords) { + $this->rollbarNotifier->flush(); + $this->hasRecords = false; + } + } + + /** + * {@inheritdoc} + */ + public function close() + { + $this->flush(); + } + + /** + * {@inheritdoc} + */ + public function reset() + { + $this->flush(); + + parent::reset(); + } + + +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php new file mode 100644 index 0000000000..b8253ba0ff --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php @@ -0,0 +1,191 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Utils; + +/** + * Stores logs to files that are rotated every day and a limited number of files are kept. + * + * This rotation is only intended to be used as a workaround. Using logrotate to + * handle the rotation is strongly encouraged when you can use it. + * + * @author Christophe Coevoet + * @author Jordi Boggiano + */ +class RotatingFileHandler extends StreamHandler +{ + const FILE_PER_DAY = 'Y-m-d'; + const FILE_PER_MONTH = 'Y-m'; + const FILE_PER_YEAR = 'Y'; + + protected $filename; + protected $maxFiles; + protected $mustRotate; + protected $nextRotation; + protected $filenameFormat; + protected $dateFormat; + + /** + * @param string $filename + * @param int $maxFiles The maximal amount of files to keep (0 means unlimited) + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @param int|null $filePermission Optional file permissions (default (0644) are only for owner read/write) + * @param bool $useLocking Try to lock log file before doing any writes + */ + public function __construct($filename, $maxFiles = 0, $level = Logger::DEBUG, $bubble = true, $filePermission = null, $useLocking = false) + { + $this->filename = Utils::canonicalizePath($filename); + $this->maxFiles = (int) $maxFiles; + $this->nextRotation = new \DateTime('tomorrow'); + $this->filenameFormat = '{filename}-{date}'; + $this->dateFormat = 'Y-m-d'; + + parent::__construct($this->getTimedFilename(), $level, $bubble, $filePermission, $useLocking); + } + + /** + * {@inheritdoc} + */ + public function close() + { + parent::close(); + + if (true === $this->mustRotate) { + $this->rotate(); + } + } + + /** + * {@inheritdoc} + */ + public function reset() + { + parent::reset(); + + if (true === $this->mustRotate) { + $this->rotate(); + } + } + + public function setFilenameFormat($filenameFormat, $dateFormat) + { + if (!preg_match('{^Y(([/_.-]?m)([/_.-]?d)?)?$}', $dateFormat)) { + trigger_error( + 'Invalid date format - format must be one of '. + 'RotatingFileHandler::FILE_PER_DAY ("Y-m-d"), RotatingFileHandler::FILE_PER_MONTH ("Y-m") '. + 'or RotatingFileHandler::FILE_PER_YEAR ("Y"), or you can set one of the '. + 'date formats using slashes, underscores and/or dots instead of dashes.', + E_USER_DEPRECATED + ); + } + if (substr_count($filenameFormat, '{date}') === 0) { + trigger_error( + 'Invalid filename format - format should contain at least `{date}`, because otherwise rotating is impossible.', + E_USER_DEPRECATED + ); + } + $this->filenameFormat = $filenameFormat; + $this->dateFormat = $dateFormat; + $this->url = $this->getTimedFilename(); + $this->close(); + } + + /** + * {@inheritdoc} + */ + protected function write(array $record) + { + // on the first record written, if the log is new, we should rotate (once per day) + if (null === $this->mustRotate) { + $this->mustRotate = !file_exists($this->url); + } + + if ($this->nextRotation < $record['datetime']) { + $this->mustRotate = true; + $this->close(); + } + + parent::write($record); + } + + /** + * Rotates the files. + */ + protected function rotate() + { + // update filename + $this->url = $this->getTimedFilename(); + $this->nextRotation = new \DateTime('tomorrow'); + + // skip GC of old logs if files are unlimited + if (0 === $this->maxFiles) { + return; + } + + $logFiles = glob($this->getGlobPattern()); + if ($this->maxFiles >= count($logFiles)) { + // no files to remove + return; + } + + // Sorting the files by name to remove the older ones + usort($logFiles, function ($a, $b) { + return strcmp($b, $a); + }); + + foreach (array_slice($logFiles, $this->maxFiles) as $file) { + if (is_writable($file)) { + // suppress errors here as unlink() might fail if two processes + // are cleaning up/rotating at the same time + set_error_handler(function ($errno, $errstr, $errfile, $errline) {}); + unlink($file); + restore_error_handler(); + } + } + + $this->mustRotate = false; + } + + protected function getTimedFilename() + { + $fileInfo = pathinfo($this->filename); + $timedFilename = str_replace( + array('{filename}', '{date}'), + array($fileInfo['filename'], date($this->dateFormat)), + $fileInfo['dirname'] . '/' . $this->filenameFormat + ); + + if (!empty($fileInfo['extension'])) { + $timedFilename .= '.'.$fileInfo['extension']; + } + + return $timedFilename; + } + + protected function getGlobPattern() + { + $fileInfo = pathinfo($this->filename); + $glob = str_replace( + array('{filename}', '{date}'), + array($fileInfo['filename'], '[0-9][0-9][0-9][0-9]*'), + $fileInfo['dirname'] . '/' . $this->filenameFormat + ); + if (!empty($fileInfo['extension'])) { + $glob .= '.'.$fileInfo['extension']; + } + + return $glob; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php new file mode 100644 index 0000000000..b547ed7dad --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php @@ -0,0 +1,113 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; + +/** + * Sampling handler + * + * A sampled event stream can be useful for logging high frequency events in + * a production environment where you only need an idea of what is happening + * and are not concerned with capturing every occurrence. Since the decision to + * handle or not handle a particular event is determined randomly, the + * resulting sampled log is not guaranteed to contain 1/N of the events that + * occurred in the application, but based on the Law of large numbers, it will + * tend to be close to this ratio with a large number of attempts. + * + * @author Bryan Davis + * @author Kunal Mehta + */ +class SamplingHandler extends AbstractHandler +{ + /** + * @var callable|HandlerInterface $handler + */ + protected $handler; + + /** + * @var int $factor + */ + protected $factor; + + /** + * @param callable|HandlerInterface $handler Handler or factory callable($record|null, $samplingHandler). + * @param int $factor Sample factor + */ + public function __construct($handler, $factor) + { + parent::__construct(); + $this->handler = $handler; + $this->factor = $factor; + + if (!$this->handler instanceof HandlerInterface && !is_callable($this->handler)) { + throw new \RuntimeException("The given handler (".json_encode($this->handler).") is not a callable nor a Monolog\Handler\HandlerInterface object"); + } + } + + public function isHandling(array $record) + { + return $this->getHandler($record)->isHandling($record); + } + + public function handle(array $record) + { + if ($this->isHandling($record) && mt_rand(1, $this->factor) === 1) { + if ($this->processors) { + foreach ($this->processors as $processor) { + $record = call_user_func($processor, $record); + } + } + + $this->getHandler($record)->handle($record); + } + + return false === $this->bubble; + } + + /** + * Return the nested handler + * + * If the handler was provided as a factory callable, this will trigger the handler's instantiation. + * + * @return HandlerInterface + */ + public function getHandler(array $record = null) + { + if (!$this->handler instanceof HandlerInterface) { + $this->handler = call_user_func($this->handler, $record, $this); + if (!$this->handler instanceof HandlerInterface) { + throw new \RuntimeException("The factory callable should return a HandlerInterface"); + } + } + + return $this->handler; + } + + /** + * {@inheritdoc} + */ + public function setFormatter(FormatterInterface $formatter) + { + $this->getHandler()->setFormatter($formatter); + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getFormatter() + { + return $this->getHandler()->getFormatter(); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php b/vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php new file mode 100644 index 0000000000..39455501f8 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.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 Monolog\Handler\Slack; + +use Monolog\Logger; +use Monolog\Utils; +use Monolog\Formatter\NormalizerFormatter; +use Monolog\Formatter\FormatterInterface; + +/** + * Slack record utility helping to log to Slack webhooks or API. + * + * @author Greg Kedzierski + * @author Haralan Dobrev + * @see https://api.slack.com/incoming-webhooks + * @see https://api.slack.com/docs/message-attachments + */ +class SlackRecord +{ + const COLOR_DANGER = 'danger'; + + const COLOR_WARNING = 'warning'; + + const COLOR_GOOD = 'good'; + + const COLOR_DEFAULT = '#e3e4e6'; + + /** + * Slack channel (encoded ID or name) + * @var string|null + */ + private $channel; + + /** + * Name of a bot + * @var string|null + */ + private $username; + + /** + * User icon e.g. 'ghost', 'http://example.com/user.png' + * @var string + */ + private $userIcon; + + /** + * Whether the message should be added to Slack as attachment (plain text otherwise) + * @var bool + */ + private $useAttachment; + + /** + * Whether the the context/extra messages added to Slack as attachments are in a short style + * @var bool + */ + private $useShortAttachment; + + /** + * Whether the attachment should include context and extra data + * @var bool + */ + private $includeContextAndExtra; + + /** + * Dot separated list of fields to exclude from slack message. E.g. ['context.field1', 'extra.field2'] + * @var array + */ + private $excludeFields; + + /** + * @var FormatterInterface + */ + private $formatter; + + /** + * @var NormalizerFormatter + */ + private $normalizerFormatter; + + public function __construct($channel = null, $username = null, $useAttachment = true, $userIcon = null, $useShortAttachment = false, $includeContextAndExtra = false, array $excludeFields = array(), FormatterInterface $formatter = null) + { + $this->channel = $channel; + $this->username = $username; + $this->userIcon = trim($userIcon, ':'); + $this->useAttachment = $useAttachment; + $this->useShortAttachment = $useShortAttachment; + $this->includeContextAndExtra = $includeContextAndExtra; + $this->excludeFields = $excludeFields; + $this->formatter = $formatter; + + if ($this->includeContextAndExtra) { + $this->normalizerFormatter = new NormalizerFormatter(); + } + } + + public function getSlackData(array $record) + { + $dataArray = array(); + $record = $this->excludeFields($record); + + if ($this->username) { + $dataArray['username'] = $this->username; + } + + if ($this->channel) { + $dataArray['channel'] = $this->channel; + } + + if ($this->formatter && !$this->useAttachment) { + $message = $this->formatter->format($record); + } else { + $message = $record['message']; + } + + if ($this->useAttachment) { + $attachment = array( + 'fallback' => $message, + 'text' => $message, + 'color' => $this->getAttachmentColor($record['level']), + 'fields' => array(), + 'mrkdwn_in' => array('fields'), + 'ts' => $record['datetime']->getTimestamp() + ); + + if ($this->useShortAttachment) { + $attachment['title'] = $record['level_name']; + } else { + $attachment['title'] = 'Message'; + $attachment['fields'][] = $this->generateAttachmentField('Level', $record['level_name']); + } + + + if ($this->includeContextAndExtra) { + foreach (array('extra', 'context') as $key) { + if (empty($record[$key])) { + continue; + } + + if ($this->useShortAttachment) { + $attachment['fields'][] = $this->generateAttachmentField( + $key, + $record[$key] + ); + } else { + // Add all extra fields as individual fields in attachment + $attachment['fields'] = array_merge( + $attachment['fields'], + $this->generateAttachmentFields($record[$key]) + ); + } + } + } + + $dataArray['attachments'] = array($attachment); + } else { + $dataArray['text'] = $message; + } + + if ($this->userIcon) { + if (filter_var($this->userIcon, FILTER_VALIDATE_URL)) { + $dataArray['icon_url'] = $this->userIcon; + } else { + $dataArray['icon_emoji'] = ":{$this->userIcon}:"; + } + } + + return $dataArray; + } + + /** + * Returned a Slack message attachment color associated with + * provided level. + * + * @param int $level + * @return string + */ + public function getAttachmentColor($level) + { + switch (true) { + case $level >= Logger::ERROR: + return self::COLOR_DANGER; + case $level >= Logger::WARNING: + return self::COLOR_WARNING; + case $level >= Logger::INFO: + return self::COLOR_GOOD; + default: + return self::COLOR_DEFAULT; + } + } + + /** + * Stringifies an array of key/value pairs to be used in attachment fields + * + * @param array $fields + * + * @return string + */ + public function stringify($fields) + { + $normalized = $this->normalizerFormatter->format($fields); + $prettyPrintFlag = defined('JSON_PRETTY_PRINT') ? JSON_PRETTY_PRINT : 128; + $flags = 0; + if (PHP_VERSION_ID >= 50400) { + $flags = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE; + } + + $hasSecondDimension = count(array_filter($normalized, 'is_array')); + $hasNonNumericKeys = !count(array_filter(array_keys($normalized), 'is_numeric')); + + return $hasSecondDimension || $hasNonNumericKeys + ? Utils::jsonEncode($normalized, $prettyPrintFlag | $flags) + : Utils::jsonEncode($normalized, $flags); + } + + /** + * Sets the formatter + * + * @param FormatterInterface $formatter + */ + public function setFormatter(FormatterInterface $formatter) + { + $this->formatter = $formatter; + } + + /** + * Generates attachment field + * + * @param string $title + * @param string|array $value + * + * @return array + */ + private function generateAttachmentField($title, $value) + { + $value = is_array($value) + ? sprintf('```%s```', $this->stringify($value)) + : $value; + + return array( + 'title' => ucfirst($title), + 'value' => $value, + 'short' => false + ); + } + + /** + * Generates a collection of attachment fields from array + * + * @param array $data + * + * @return array + */ + private function generateAttachmentFields(array $data) + { + $fields = array(); + foreach ($this->normalizerFormatter->format($data) as $key => $value) { + $fields[] = $this->generateAttachmentField($key, $value); + } + + return $fields; + } + + /** + * Get a copy of record with fields excluded according to $this->excludeFields + * + * @param array $record + * + * @return array + */ + private function excludeFields(array $record) + { + foreach ($this->excludeFields as $field) { + $keys = explode('.', $field); + $node = &$record; + $lastKey = end($keys); + foreach ($keys as $key) { + if (!isset($node[$key])) { + break; + } + if ($lastKey === $key) { + unset($node[$key]); + break; + } + $node = &$node[$key]; + } + } + + return $record; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php new file mode 100644 index 0000000000..88c4c4d00c --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php @@ -0,0 +1,221 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; +use Monolog\Logger; +use Monolog\Utils; +use Monolog\Handler\Slack\SlackRecord; + +/** + * Sends notifications through Slack API + * + * @author Greg Kedzierski + * @see https://api.slack.com/ + */ +class SlackHandler extends SocketHandler +{ + /** + * Slack API token + * @var string + */ + private $token; + + /** + * Instance of the SlackRecord util class preparing data for Slack API. + * @var SlackRecord + */ + private $slackRecord; + + /** + * @param string $token Slack API token + * @param string $channel Slack channel (encoded ID or name) + * @param string|null $username Name of a bot + * @param bool $useAttachment Whether the message should be added to Slack as attachment (plain text otherwise) + * @param string|null $iconEmoji The emoji name to use (or null) + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @param bool $useShortAttachment Whether the the context/extra messages added to Slack as attachments are in a short style + * @param bool $includeContextAndExtra Whether the attachment should include context and extra data + * @param array $excludeFields Dot separated list of fields to exclude from slack message. E.g. ['context.field1', 'extra.field2'] + * @throws MissingExtensionException If no OpenSSL PHP extension configured + */ + public function __construct($token, $channel, $username = null, $useAttachment = true, $iconEmoji = null, $level = Logger::CRITICAL, $bubble = true, $useShortAttachment = false, $includeContextAndExtra = false, array $excludeFields = array()) + { + if (!extension_loaded('openssl')) { + throw new MissingExtensionException('The OpenSSL PHP extension is required to use the SlackHandler'); + } + + parent::__construct('ssl://slack.com:443', $level, $bubble); + + $this->slackRecord = new SlackRecord( + $channel, + $username, + $useAttachment, + $iconEmoji, + $useShortAttachment, + $includeContextAndExtra, + $excludeFields, + $this->formatter + ); + + $this->token = $token; + } + + public function getSlackRecord() + { + return $this->slackRecord; + } + + public function getToken() + { + return $this->token; + } + + /** + * {@inheritdoc} + * + * @param array $record + * @return string + */ + protected function generateDataStream($record) + { + $content = $this->buildContent($record); + + return $this->buildHeader($content) . $content; + } + + /** + * Builds the body of API call + * + * @param array $record + * @return string + */ + private function buildContent($record) + { + $dataArray = $this->prepareContentData($record); + + return http_build_query($dataArray); + } + + /** + * Prepares content data + * + * @param array $record + * @return array + */ + protected function prepareContentData($record) + { + $dataArray = $this->slackRecord->getSlackData($record); + $dataArray['token'] = $this->token; + + if (!empty($dataArray['attachments'])) { + $dataArray['attachments'] = Utils::jsonEncode($dataArray['attachments']); + } + + return $dataArray; + } + + /** + * Builds the header of the API Call + * + * @param string $content + * @return string + */ + private function buildHeader($content) + { + $header = "POST /api/chat.postMessage HTTP/1.1\r\n"; + $header .= "Host: slack.com\r\n"; + $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; + $header .= "Content-Length: " . strlen($content) . "\r\n"; + $header .= "\r\n"; + + return $header; + } + + /** + * {@inheritdoc} + * + * @param array $record + */ + protected function write(array $record) + { + parent::write($record); + $this->finalizeWrite(); + } + + /** + * Finalizes the request by reading some bytes and then closing the socket + * + * If we do not read some but close the socket too early, slack sometimes + * drops the request entirely. + */ + protected function finalizeWrite() + { + $res = $this->getResource(); + if (is_resource($res)) { + @fread($res, 2048); + } + $this->closeSocket(); + } + + /** + * Returned a Slack message attachment color associated with + * provided level. + * + * @param int $level + * @return string + * @deprecated Use underlying SlackRecord instead + */ + protected function getAttachmentColor($level) + { + trigger_error( + 'SlackHandler::getAttachmentColor() is deprecated. Use underlying SlackRecord instead.', + E_USER_DEPRECATED + ); + + return $this->slackRecord->getAttachmentColor($level); + } + + /** + * Stringifies an array of key/value pairs to be used in attachment fields + * + * @param array $fields + * @return string + * @deprecated Use underlying SlackRecord instead + */ + protected function stringify($fields) + { + trigger_error( + 'SlackHandler::stringify() is deprecated. Use underlying SlackRecord instead.', + E_USER_DEPRECATED + ); + + return $this->slackRecord->stringify($fields); + } + + public function setFormatter(FormatterInterface $formatter) + { + parent::setFormatter($formatter); + $this->slackRecord->setFormatter($formatter); + + return $this; + } + + public function getFormatter() + { + $formatter = parent::getFormatter(); + $this->slackRecord->setFormatter($formatter); + + return $formatter; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php new file mode 100644 index 0000000000..b87be99a88 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php @@ -0,0 +1,121 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; +use Monolog\Logger; +use Monolog\Utils; +use Monolog\Handler\Slack\SlackRecord; + +/** + * Sends notifications through Slack Webhooks + * + * @author Haralan Dobrev + * @see https://api.slack.com/incoming-webhooks + */ +class SlackWebhookHandler extends AbstractProcessingHandler +{ + /** + * Slack Webhook token + * @var string + */ + private $webhookUrl; + + /** + * Instance of the SlackRecord util class preparing data for Slack API. + * @var SlackRecord + */ + private $slackRecord; + + /** + * @param string $webhookUrl Slack Webhook URL + * @param string|null $channel Slack channel (encoded ID or name) + * @param string|null $username Name of a bot + * @param bool $useAttachment Whether the message should be added to Slack as attachment (plain text otherwise) + * @param string|null $iconEmoji The emoji name to use (or null) + * @param bool $useShortAttachment Whether the the context/extra messages added to Slack as attachments are in a short style + * @param bool $includeContextAndExtra Whether the attachment should include context and extra data + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @param array $excludeFields Dot separated list of fields to exclude from slack message. E.g. ['context.field1', 'extra.field2'] + */ + public function __construct($webhookUrl, $channel = null, $username = null, $useAttachment = true, $iconEmoji = null, $useShortAttachment = false, $includeContextAndExtra = false, $level = Logger::CRITICAL, $bubble = true, array $excludeFields = array()) + { + parent::__construct($level, $bubble); + + $this->webhookUrl = $webhookUrl; + + $this->slackRecord = new SlackRecord( + $channel, + $username, + $useAttachment, + $iconEmoji, + $useShortAttachment, + $includeContextAndExtra, + $excludeFields, + $this->formatter + ); + } + + public function getSlackRecord() + { + return $this->slackRecord; + } + + public function getWebhookUrl() + { + return $this->webhookUrl; + } + + /** + * {@inheritdoc} + * + * @param array $record + */ + protected function write(array $record) + { + $postData = $this->slackRecord->getSlackData($record); + $postString = Utils::jsonEncode($postData); + + $ch = curl_init(); + $options = array( + CURLOPT_URL => $this->webhookUrl, + CURLOPT_POST => true, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_HTTPHEADER => array('Content-type: application/json'), + CURLOPT_POSTFIELDS => $postString + ); + if (defined('CURLOPT_SAFE_UPLOAD')) { + $options[CURLOPT_SAFE_UPLOAD] = true; + } + + curl_setopt_array($ch, $options); + + Curl\Util::execute($ch); + } + + public function setFormatter(FormatterInterface $formatter) + { + parent::setFormatter($formatter); + $this->slackRecord->setFormatter($formatter); + + return $this; + } + + public function getFormatter() + { + $formatter = parent::getFormatter(); + $this->slackRecord->setFormatter($formatter); + + return $formatter; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SlackbotHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SlackbotHandler.php new file mode 100644 index 0000000000..d3352ea0f7 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/SlackbotHandler.php @@ -0,0 +1,84 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; + +/** + * Sends notifications through Slack's Slackbot + * + * @author Haralan Dobrev + * @see https://slack.com/apps/A0F81R8ET-slackbot + * @deprecated According to Slack the API used on this handler it is deprecated. + * Therefore this handler will be removed on 2.x + * Slack suggests to use webhooks instead. Please contact slack for more information. + */ +class SlackbotHandler extends AbstractProcessingHandler +{ + /** + * The slug of the Slack team + * @var string + */ + private $slackTeam; + + /** + * Slackbot token + * @var string + */ + private $token; + + /** + * Slack channel name + * @var string + */ + private $channel; + + /** + * @param string $slackTeam Slack team slug + * @param string $token Slackbot token + * @param string $channel Slack channel (encoded ID or name) + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct($slackTeam, $token, $channel, $level = Logger::CRITICAL, $bubble = true) + { + @trigger_error('SlackbotHandler is deprecated and will be removed on 2.x', E_USER_DEPRECATED); + parent::__construct($level, $bubble); + + $this->slackTeam = $slackTeam; + $this->token = $token; + $this->channel = $channel; + } + + /** + * {@inheritdoc} + * + * @param array $record + */ + protected function write(array $record) + { + $slackbotUrl = sprintf( + 'https://%s.slack.com/services/hooks/slackbot?token=%s&channel=%s', + $this->slackTeam, + $this->token, + $this->channel + ); + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $slackbotUrl); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, $record['message']); + + Curl\Util::execute($ch); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php new file mode 100644 index 0000000000..db50d97fec --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php @@ -0,0 +1,385 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; + +/** + * Stores to any socket - uses fsockopen() or pfsockopen(). + * + * @author Pablo de Leon Belloc + * @see http://php.net/manual/en/function.fsockopen.php + */ +class SocketHandler extends AbstractProcessingHandler +{ + private $connectionString; + private $connectionTimeout; + private $resource; + private $timeout = 0; + private $writingTimeout = 10; + private $lastSentBytes = null; + private $chunkSize = null; + private $persistent = false; + private $errno; + private $errstr; + private $lastWritingAt; + + /** + * @param string $connectionString Socket connection string + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct($connectionString, $level = Logger::DEBUG, $bubble = true) + { + parent::__construct($level, $bubble); + $this->connectionString = $connectionString; + $this->connectionTimeout = (float) ini_get('default_socket_timeout'); + } + + /** + * Connect (if necessary) and write to the socket + * + * @param array $record + * + * @throws \UnexpectedValueException + * @throws \RuntimeException + */ + protected function write(array $record) + { + $this->connectIfNotConnected(); + $data = $this->generateDataStream($record); + $this->writeToSocket($data); + } + + /** + * We will not close a PersistentSocket instance so it can be reused in other requests. + */ + public function close() + { + if (!$this->isPersistent()) { + $this->closeSocket(); + } + } + + /** + * Close socket, if open + */ + public function closeSocket() + { + if (is_resource($this->resource)) { + fclose($this->resource); + $this->resource = null; + } + } + + /** + * Set socket connection to nbe persistent. It only has effect before the connection is initiated. + * + * @param bool $persistent + */ + public function setPersistent($persistent) + { + $this->persistent = (bool) $persistent; + } + + /** + * Set connection timeout. Only has effect before we connect. + * + * @param float $seconds + * + * @see http://php.net/manual/en/function.fsockopen.php + */ + public function setConnectionTimeout($seconds) + { + $this->validateTimeout($seconds); + $this->connectionTimeout = (float) $seconds; + } + + /** + * Set write timeout. Only has effect before we connect. + * + * @param float $seconds + * + * @see http://php.net/manual/en/function.stream-set-timeout.php + */ + public function setTimeout($seconds) + { + $this->validateTimeout($seconds); + $this->timeout = (float) $seconds; + } + + /** + * Set writing timeout. Only has effect during connection in the writing cycle. + * + * @param float $seconds 0 for no timeout + */ + public function setWritingTimeout($seconds) + { + $this->validateTimeout($seconds); + $this->writingTimeout = (float) $seconds; + } + + /** + * Set chunk size. Only has effect during connection in the writing cycle. + * + * @param float $bytes + */ + public function setChunkSize($bytes) + { + $this->chunkSize = $bytes; + } + + /** + * Get current connection string + * + * @return string + */ + public function getConnectionString() + { + return $this->connectionString; + } + + /** + * Get persistent setting + * + * @return bool + */ + public function isPersistent() + { + return $this->persistent; + } + + /** + * Get current connection timeout setting + * + * @return float + */ + public function getConnectionTimeout() + { + return $this->connectionTimeout; + } + + /** + * Get current in-transfer timeout + * + * @return float + */ + public function getTimeout() + { + return $this->timeout; + } + + /** + * Get current local writing timeout + * + * @return float + */ + public function getWritingTimeout() + { + return $this->writingTimeout; + } + + /** + * Get current chunk size + * + * @return float + */ + public function getChunkSize() + { + return $this->chunkSize; + } + + /** + * Check to see if the socket is currently available. + * + * UDP might appear to be connected but might fail when writing. See http://php.net/fsockopen for details. + * + * @return bool + */ + public function isConnected() + { + return is_resource($this->resource) + && !feof($this->resource); // on TCP - other party can close connection. + } + + /** + * Wrapper to allow mocking + */ + protected function pfsockopen() + { + return @pfsockopen($this->connectionString, -1, $this->errno, $this->errstr, $this->connectionTimeout); + } + + /** + * Wrapper to allow mocking + */ + protected function fsockopen() + { + return @fsockopen($this->connectionString, -1, $this->errno, $this->errstr, $this->connectionTimeout); + } + + /** + * Wrapper to allow mocking + * + * @see http://php.net/manual/en/function.stream-set-timeout.php + */ + protected function streamSetTimeout() + { + $seconds = floor($this->timeout); + $microseconds = round(($this->timeout - $seconds) * 1e6); + + return stream_set_timeout($this->resource, $seconds, $microseconds); + } + + /** + * Wrapper to allow mocking + * + * @see http://php.net/manual/en/function.stream-set-chunk-size.php + */ + protected function streamSetChunkSize() + { + return stream_set_chunk_size($this->resource, $this->chunkSize); + } + + /** + * Wrapper to allow mocking + */ + protected function fwrite($data) + { + return @fwrite($this->resource, $data); + } + + /** + * Wrapper to allow mocking + */ + protected function streamGetMetadata() + { + return stream_get_meta_data($this->resource); + } + + private function validateTimeout($value) + { + $ok = filter_var($value, FILTER_VALIDATE_FLOAT); + if ($ok === false || $value < 0) { + throw new \InvalidArgumentException("Timeout must be 0 or a positive float (got $value)"); + } + } + + private function connectIfNotConnected() + { + if ($this->isConnected()) { + return; + } + $this->connect(); + } + + protected function generateDataStream($record) + { + return (string) $record['formatted']; + } + + /** + * @return resource|null + */ + protected function getResource() + { + return $this->resource; + } + + private function connect() + { + $this->createSocketResource(); + $this->setSocketTimeout(); + $this->setStreamChunkSize(); + } + + private function createSocketResource() + { + if ($this->isPersistent()) { + $resource = $this->pfsockopen(); + } else { + $resource = $this->fsockopen(); + } + if (!$resource) { + throw new \UnexpectedValueException("Failed connecting to $this->connectionString ($this->errno: $this->errstr)"); + } + $this->resource = $resource; + } + + private function setSocketTimeout() + { + if (!$this->streamSetTimeout()) { + throw new \UnexpectedValueException("Failed setting timeout with stream_set_timeout()"); + } + } + + private function setStreamChunkSize() + { + if ($this->chunkSize && !$this->streamSetChunkSize()) { + throw new \UnexpectedValueException("Failed setting chunk size with stream_set_chunk_size()"); + } + } + + private function writeToSocket($data) + { + $length = strlen($data); + $sent = 0; + $this->lastSentBytes = $sent; + while ($this->isConnected() && $sent < $length) { + if (0 == $sent) { + $chunk = $this->fwrite($data); + } else { + $chunk = $this->fwrite(substr($data, $sent)); + } + if ($chunk === false) { + throw new \RuntimeException("Could not write to socket"); + } + $sent += $chunk; + $socketInfo = $this->streamGetMetadata(); + if ($socketInfo['timed_out']) { + throw new \RuntimeException("Write timed-out"); + } + + if ($this->writingIsTimedOut($sent)) { + throw new \RuntimeException("Write timed-out, no data sent for `{$this->writingTimeout}` seconds, probably we got disconnected (sent $sent of $length)"); + } + } + if (!$this->isConnected() && $sent < $length) { + throw new \RuntimeException("End-of-file reached, probably we got disconnected (sent $sent of $length)"); + } + } + + private function writingIsTimedOut($sent) + { + $writingTimeout = (int) floor($this->writingTimeout); + if (0 === $writingTimeout) { + return false; + } + + if ($sent !== $this->lastSentBytes) { + $this->lastWritingAt = time(); + $this->lastSentBytes = $sent; + + return false; + } else { + usleep(100); + } + + if ((time() - $this->lastWritingAt) >= $writingTimeout) { + $this->closeSocket(); + + return true; + } + + return false; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php new file mode 100644 index 0000000000..b52607d2e2 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php @@ -0,0 +1,179 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Utils; + +/** + * Stores to any stream resource + * + * Can be used to store into php://stderr, remote and local files, etc. + * + * @author Jordi Boggiano + */ +class StreamHandler extends AbstractProcessingHandler +{ + protected $stream; + protected $url; + private $errorMessage; + protected $filePermission; + protected $useLocking; + private $dirCreated; + + /** + * @param resource|string $stream + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @param int|null $filePermission Optional file permissions (default (0644) are only for owner read/write) + * @param bool $useLocking Try to lock log file before doing any writes + * + * @throws \Exception If a missing directory is not buildable + * @throws \InvalidArgumentException If stream is not a resource or string + */ + public function __construct($stream, $level = Logger::DEBUG, $bubble = true, $filePermission = null, $useLocking = false) + { + parent::__construct($level, $bubble); + if (is_resource($stream)) { + $this->stream = $stream; + } elseif (is_string($stream)) { + $this->url = Utils::canonicalizePath($stream); + } else { + throw new \InvalidArgumentException('A stream must either be a resource or a string.'); + } + + $this->filePermission = $filePermission; + $this->useLocking = $useLocking; + } + + /** + * {@inheritdoc} + */ + public function close() + { + if ($this->url && is_resource($this->stream)) { + fclose($this->stream); + } + $this->stream = null; + $this->dirCreated = null; + } + + /** + * Return the currently active stream if it is open + * + * @return resource|null + */ + public function getStream() + { + return $this->stream; + } + + /** + * Return the stream URL if it was configured with a URL and not an active resource + * + * @return string|null + */ + public function getUrl() + { + return $this->url; + } + + /** + * {@inheritdoc} + */ + protected function write(array $record) + { + if (!is_resource($this->stream)) { + if (null === $this->url || '' === $this->url) { + throw new \LogicException('Missing stream url, the stream can not be opened. This may be caused by a premature call to close().'); + } + $this->createDir(); + $this->errorMessage = null; + set_error_handler(array($this, 'customErrorHandler')); + $this->stream = fopen($this->url, 'a'); + if ($this->filePermission !== null) { + @chmod($this->url, $this->filePermission); + } + restore_error_handler(); + if (!is_resource($this->stream)) { + $this->stream = null; + + throw new \UnexpectedValueException(sprintf('The stream or file "%s" could not be opened in append mode: '.$this->errorMessage, $this->url)); + } + } + + if ($this->useLocking) { + // ignoring errors here, there's not much we can do about them + flock($this->stream, LOCK_EX); + } + + $this->streamWrite($this->stream, $record); + + if ($this->useLocking) { + flock($this->stream, LOCK_UN); + } + } + + /** + * Write to stream + * @param resource $stream + * @param array $record + */ + protected function streamWrite($stream, array $record) + { + fwrite($stream, (string) $record['formatted']); + } + + private function customErrorHandler($code, $msg) + { + $this->errorMessage = preg_replace('{^(fopen|mkdir)\(.*?\): }', '', $msg); + } + + /** + * @param string $stream + * + * @return null|string + */ + private function getDirFromStream($stream) + { + $pos = strpos($stream, '://'); + if ($pos === false) { + return dirname($stream); + } + + if ('file://' === substr($stream, 0, 7)) { + return dirname(substr($stream, 7)); + } + + return; + } + + private function createDir() + { + // Do not try to create dir if it has already been tried. + if ($this->dirCreated) { + return; + } + + $dir = $this->getDirFromStream($this->url); + if (null !== $dir && !is_dir($dir)) { + $this->errorMessage = null; + set_error_handler(array($this, 'customErrorHandler')); + $status = mkdir($dir, 0777, true); + restore_error_handler(); + if (false === $status && !is_dir($dir)) { + throw new \UnexpectedValueException(sprintf('There is no existing directory at "%s" and its not buildable: '.$this->errorMessage, $dir)); + } + } + $this->dirCreated = true; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php new file mode 100644 index 0000000000..ac7b16ff87 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php @@ -0,0 +1,111 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\LineFormatter; +use Swift; + +/** + * SwiftMailerHandler uses Swift_Mailer to send the emails + * + * @author Gyula Sallai + */ +class SwiftMailerHandler extends MailHandler +{ + protected $mailer; + private $messageTemplate; + + /** + * @param \Swift_Mailer $mailer The mailer to use + * @param callable|\Swift_Message $message An example message for real messages, only the body will be replaced + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct(\Swift_Mailer $mailer, $message, $level = Logger::ERROR, $bubble = true) + { + parent::__construct($level, $bubble); + + $this->mailer = $mailer; + $this->messageTemplate = $message; + } + + /** + * {@inheritdoc} + */ + protected function send($content, array $records) + { + $this->mailer->send($this->buildMessage($content, $records)); + } + + /** + * Gets the formatter for the Swift_Message subject. + * + * @param string $format The format of the subject + * @return FormatterInterface + */ + protected function getSubjectFormatter($format) + { + return new LineFormatter($format); + } + + /** + * Creates instance of Swift_Message to be sent + * + * @param string $content formatted email body to be sent + * @param array $records Log records that formed the content + * @return \Swift_Message + */ + protected function buildMessage($content, array $records) + { + $message = null; + if ($this->messageTemplate instanceof \Swift_Message) { + $message = clone $this->messageTemplate; + $message->generateId(); + } elseif (is_callable($this->messageTemplate)) { + $message = call_user_func($this->messageTemplate, $content, $records); + } + + if (!$message instanceof \Swift_Message) { + throw new \InvalidArgumentException('Could not resolve message as instance of Swift_Message or a callable returning it'); + } + + if ($records) { + $subjectFormatter = $this->getSubjectFormatter($message->getSubject()); + $message->setSubject($subjectFormatter->format($this->getHighestRecord($records))); + } + + $message->setBody($content); + if (version_compare(Swift::VERSION, '6.0.0', '>=')) { + $message->setDate(new \DateTimeImmutable()); + } else { + $message->setDate(time()); + } + + return $message; + } + + /** + * BC getter, to be removed in 2.0 + */ + public function __get($name) + { + if ($name === 'message') { + trigger_error('SwiftMailerHandler->message is deprecated, use ->buildMessage() instead to retrieve the message', E_USER_DEPRECATED); + + return $this->buildMessage(null, array()); + } + + throw new \InvalidArgumentException('Invalid property '.$name); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php new file mode 100644 index 0000000000..f770c80284 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php @@ -0,0 +1,67 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; + +/** + * Logs to syslog service. + * + * usage example: + * + * $log = new Logger('application'); + * $syslog = new SyslogHandler('myfacility', 'local6'); + * $formatter = new LineFormatter("%channel%.%level_name%: %message% %extra%"); + * $syslog->setFormatter($formatter); + * $log->pushHandler($syslog); + * + * @author Sven Paulus + */ +class SyslogHandler extends AbstractSyslogHandler +{ + protected $ident; + protected $logopts; + + /** + * @param string $ident + * @param mixed $facility + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @param int $logopts Option flags for the openlog() call, defaults to LOG_PID + */ + public function __construct($ident, $facility = LOG_USER, $level = Logger::DEBUG, $bubble = true, $logopts = LOG_PID) + { + parent::__construct($facility, $level, $bubble); + + $this->ident = $ident; + $this->logopts = $logopts; + } + + /** + * {@inheritdoc} + */ + public function close() + { + closelog(); + } + + /** + * {@inheritdoc} + */ + protected function write(array $record) + { + if (!openlog($this->ident, $this->logopts, $this->facility)) { + throw new \LogicException('Can\'t open syslog for ident "'.$this->ident.'" and facility "'.$this->facility.'"'); + } + syslog($this->logLevels[$record['level']], (string) $record['formatted']); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php b/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php new file mode 100644 index 0000000000..3bff085bfa --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php @@ -0,0 +1,56 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler\SyslogUdp; + +class UdpSocket +{ + const DATAGRAM_MAX_LENGTH = 65023; + + protected $ip; + protected $port; + protected $socket; + + public function __construct($ip, $port = 514) + { + $this->ip = $ip; + $this->port = $port; + $this->socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); + } + + public function write($line, $header = "") + { + $this->send($this->assembleMessage($line, $header)); + } + + public function close() + { + if (is_resource($this->socket)) { + socket_close($this->socket); + $this->socket = null; + } + } + + protected function send($chunk) + { + if (!is_resource($this->socket)) { + throw new \LogicException('The UdpSocket to '.$this->ip.':'.$this->port.' has been closed and can not be written to anymore'); + } + socket_sendto($this->socket, $chunk, strlen($chunk), $flags = 0, $this->ip, $this->port); + } + + protected function assembleMessage($line, $header) + { + $chunkSize = self::DATAGRAM_MAX_LENGTH - strlen($header); + + return $header . substr($line, 0, $chunkSize); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php new file mode 100644 index 0000000000..4dfd5f5ec9 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php @@ -0,0 +1,124 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Handler\SyslogUdp\UdpSocket; + +/** + * A Handler for logging to a remote syslogd server. + * + * @author Jesper Skovgaard Nielsen + * @author Dominik Kukacka + */ +class SyslogUdpHandler extends AbstractSyslogHandler +{ + const RFC3164 = 0; + const RFC5424 = 1; + + private $dateFormats = array( + self::RFC3164 => 'M d H:i:s', + self::RFC5424 => \DateTime::RFC3339, + ); + + protected $socket; + protected $ident; + protected $rfc; + + /** + * @param string $host + * @param int $port + * @param mixed $facility + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @param string $ident Program name or tag for each log message. + * @param int $rfc RFC to format the message for. + */ + public function __construct($host, $port = 514, $facility = LOG_USER, $level = Logger::DEBUG, $bubble = true, $ident = 'php', $rfc = self::RFC5424) + { + parent::__construct($facility, $level, $bubble); + + $this->ident = $ident; + $this->rfc = $rfc; + + $this->socket = new UdpSocket($host, $port ?: 514); + } + + protected function write(array $record) + { + $lines = $this->splitMessageIntoLines($record['formatted']); + + $header = $this->makeCommonSyslogHeader($this->logLevels[$record['level']]); + + foreach ($lines as $line) { + $this->socket->write($line, $header); + } + } + + public function close() + { + $this->socket->close(); + } + + private function splitMessageIntoLines($message) + { + if (is_array($message)) { + $message = implode("\n", $message); + } + + return preg_split('/$\R?^/m', $message, -1, PREG_SPLIT_NO_EMPTY); + } + + /** + * Make common syslog header (see rfc5424 or rfc3164) + */ + protected function makeCommonSyslogHeader($severity) + { + $priority = $severity + $this->facility; + + if (!$pid = getmypid()) { + $pid = '-'; + } + + if (!$hostname = gethostname()) { + $hostname = '-'; + } + + $date = $this->getDateTime(); + + if ($this->rfc === self::RFC3164) { + return "<$priority>" . + $date . " " . + $hostname . " " . + $this->ident . "[" . $pid . "]: "; + } else { + return "<$priority>1 " . + $date . " " . + $hostname . " " . + $this->ident . " " . + $pid . " - - "; + } + } + + protected function getDateTime() + { + return date($this->dateFormats[$this->rfc]); + } + + /** + * Inject your own socket, mainly used for testing + */ + public function setSocket($socket) + { + $this->socket = $socket; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php new file mode 100644 index 0000000000..478db0ac00 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php @@ -0,0 +1,177 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +/** + * Used for testing purposes. + * + * It records all records and gives you access to them for verification. + * + * @author Jordi Boggiano + * + * @method bool hasEmergency($record) + * @method bool hasAlert($record) + * @method bool hasCritical($record) + * @method bool hasError($record) + * @method bool hasWarning($record) + * @method bool hasNotice($record) + * @method bool hasInfo($record) + * @method bool hasDebug($record) + * + * @method bool hasEmergencyRecords() + * @method bool hasAlertRecords() + * @method bool hasCriticalRecords() + * @method bool hasErrorRecords() + * @method bool hasWarningRecords() + * @method bool hasNoticeRecords() + * @method bool hasInfoRecords() + * @method bool hasDebugRecords() + * + * @method bool hasEmergencyThatContains($message) + * @method bool hasAlertThatContains($message) + * @method bool hasCriticalThatContains($message) + * @method bool hasErrorThatContains($message) + * @method bool hasWarningThatContains($message) + * @method bool hasNoticeThatContains($message) + * @method bool hasInfoThatContains($message) + * @method bool hasDebugThatContains($message) + * + * @method bool hasEmergencyThatMatches($message) + * @method bool hasAlertThatMatches($message) + * @method bool hasCriticalThatMatches($message) + * @method bool hasErrorThatMatches($message) + * @method bool hasWarningThatMatches($message) + * @method bool hasNoticeThatMatches($message) + * @method bool hasInfoThatMatches($message) + * @method bool hasDebugThatMatches($message) + * + * @method bool hasEmergencyThatPasses($message) + * @method bool hasAlertThatPasses($message) + * @method bool hasCriticalThatPasses($message) + * @method bool hasErrorThatPasses($message) + * @method bool hasWarningThatPasses($message) + * @method bool hasNoticeThatPasses($message) + * @method bool hasInfoThatPasses($message) + * @method bool hasDebugThatPasses($message) + */ +class TestHandler extends AbstractProcessingHandler +{ + protected $records = array(); + protected $recordsByLevel = array(); + private $skipReset = false; + + public function getRecords() + { + return $this->records; + } + + public function clear() + { + $this->records = array(); + $this->recordsByLevel = array(); + } + + public function reset() + { + if (!$this->skipReset) { + $this->clear(); + } + } + + public function setSkipReset($skipReset) + { + $this->skipReset = $skipReset; + } + + public function hasRecords($level) + { + return isset($this->recordsByLevel[$level]); + } + + /** + * @param string|array $record Either a message string or an array containing message and optionally context keys that will be checked against all records + * @param int $level Logger::LEVEL constant value + */ + public function hasRecord($record, $level) + { + if (is_string($record)) { + $record = array('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($predicate, $level) + { + if (!is_callable($predicate)) { + throw new \InvalidArgumentException("Expected a callable for hasRecordThatSucceeds"); + } + + 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; + } + + /** + * {@inheritdoc} + */ + protected function write(array $record) + { + $this->recordsByLevel[$record['level']][] = $record; + $this->records[] = $record; + } + + 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 = constant('Monolog\Logger::' . strtoupper($matches[2])); + if (method_exists($this, $genericMethod)) { + $args[] = $level; + + return call_user_func_array(array($this, $genericMethod), $args); + } + } + + throw new \BadMethodCallException('Call to undefined method ' . get_class($this) . '::' . $method . '()'); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php new file mode 100644 index 0000000000..7d7622a394 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php @@ -0,0 +1,72 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +/** + * Forwards records to multiple handlers suppressing failures of each handler + * and continuing through to give every handler a chance to succeed. + * + * @author Craig D'Amelio + */ +class WhatFailureGroupHandler extends GroupHandler +{ + /** + * {@inheritdoc} + */ + public function handle(array $record) + { + if ($this->processors) { + foreach ($this->processors as $processor) { + $record = call_user_func($processor, $record); + } + } + + foreach ($this->handlers as $handler) { + try { + $handler->handle($record); + } catch (\Exception $e) { + // What failure? + } catch (\Throwable $e) { + // What failure? + } + } + + return false === $this->bubble; + } + + /** + * {@inheritdoc} + */ + public function handleBatch(array $records) + { + if ($this->processors) { + $processed = array(); + foreach ($records as $record) { + foreach ($this->processors as $processor) { + $record = call_user_func($processor, $record); + } + $processed[] = $record; + } + $records = $processed; + } + + foreach ($this->handlers as $handler) { + try { + $handler->handleBatch($records); + } catch (\Exception $e) { + // What failure? + } catch (\Throwable $e) { + // What failure? + } + } + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php new file mode 100644 index 0000000000..a20aeae014 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php @@ -0,0 +1,101 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\NormalizerFormatter; +use Monolog\Logger; + +/** + * Handler sending logs to Zend Monitor + * + * @author Christian Bergau + * @author Jason Davis + */ +class ZendMonitorHandler extends AbstractProcessingHandler +{ + /** + * Monolog level / ZendMonitor Custom Event priority map + * + * @var array + */ + protected $levelMap = array(); + + /** + * Construct + * + * @param int $level + * @param bool $bubble + * @throws MissingExtensionException + */ + public function __construct($level = Logger::DEBUG, $bubble = true) + { + if (!function_exists('zend_monitor_custom_event')) { + throw new MissingExtensionException( + 'You must have Zend Server installed with Zend Monitor enabled in order to use this handler' + ); + } + //zend monitor constants are not defined if zend monitor is not enabled. + $this->levelMap = array( + Logger::DEBUG => \ZEND_MONITOR_EVENT_SEVERITY_INFO, + Logger::INFO => \ZEND_MONITOR_EVENT_SEVERITY_INFO, + Logger::NOTICE => \ZEND_MONITOR_EVENT_SEVERITY_INFO, + Logger::WARNING => \ZEND_MONITOR_EVENT_SEVERITY_WARNING, + Logger::ERROR => \ZEND_MONITOR_EVENT_SEVERITY_ERROR, + Logger::CRITICAL => \ZEND_MONITOR_EVENT_SEVERITY_ERROR, + Logger::ALERT => \ZEND_MONITOR_EVENT_SEVERITY_ERROR, + Logger::EMERGENCY => \ZEND_MONITOR_EVENT_SEVERITY_ERROR, + ); + parent::__construct($level, $bubble); + } + + /** + * {@inheritdoc} + */ + protected function write(array $record) + { + $this->writeZendMonitorCustomEvent( + Logger::getLevelName($record['level']), + $record['message'], + $record['formatted'], + $this->levelMap[$record['level']] + ); + } + + /** + * Write to Zend Monitor Events + * @param string $type Text displayed in "Class Name (custom)" field + * @param string $message Text displayed in "Error String" + * @param mixed $formatted Displayed in Custom Variables tab + * @param int $severity Set the event severity level (-1,0,1) + */ + protected function writeZendMonitorCustomEvent($type, $message, $formatted, $severity) + { + zend_monitor_custom_event($type, $message, $formatted, $severity); + } + + /** + * {@inheritdoc} + */ + public function getDefaultFormatter() + { + return new NormalizerFormatter(); + } + + /** + * Get the level map + * + * @return array + */ + public function getLevelMap() + { + return $this->levelMap; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Logger.php b/vendor/monolog/monolog/src/Monolog/Logger.php new file mode 100644 index 0000000000..e649af51bc --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Logger.php @@ -0,0 +1,796 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog; + +use Monolog\Handler\HandlerInterface; +use Monolog\Handler\StreamHandler; +use Psr\Log\LoggerInterface; +use Psr\Log\InvalidArgumentException; +use Exception; + +/** + * Monolog log channel + * + * It contains a stack of Handlers and a stack of Processors, + * and uses them to store records that are added to it. + * + * @author Jordi Boggiano + */ +class Logger implements LoggerInterface, ResettableInterface +{ + /** + * Detailed debug information + */ + const DEBUG = 100; + + /** + * Interesting events + * + * Examples: User logs in, SQL logs. + */ + const INFO = 200; + + /** + * Uncommon events + */ + const NOTICE = 250; + + /** + * Exceptional occurrences that are not errors + * + * Examples: Use of deprecated APIs, poor use of an API, + * undesirable things that are not necessarily wrong. + */ + const WARNING = 300; + + /** + * Runtime errors + */ + const ERROR = 400; + + /** + * Critical conditions + * + * Example: Application component unavailable, unexpected exception. + */ + const CRITICAL = 500; + + /** + * Action must be taken immediately + * + * Example: Entire website down, database unavailable, etc. + * This should trigger the SMS alerts and wake you up. + */ + const ALERT = 550; + + /** + * Urgent alert. + */ + const EMERGENCY = 600; + + /** + * Monolog API version + * + * This is only bumped when API breaks are done and should + * follow the major version of the library + * + * @var int + */ + const API = 1; + + /** + * Logging levels from syslog protocol defined in RFC 5424 + * + * @var array $levels Logging levels + */ + protected static $levels = array( + self::DEBUG => 'DEBUG', + self::INFO => 'INFO', + self::NOTICE => 'NOTICE', + self::WARNING => 'WARNING', + self::ERROR => 'ERROR', + self::CRITICAL => 'CRITICAL', + self::ALERT => 'ALERT', + self::EMERGENCY => 'EMERGENCY', + ); + + /** + * @var \DateTimeZone + */ + protected static $timezone; + + /** + * @var string + */ + protected $name; + + /** + * The handler stack + * + * @var HandlerInterface[] + */ + protected $handlers; + + /** + * Processors that will process all log records + * + * To process records of a single handler instead, add the processor on that specific handler + * + * @var callable[] + */ + protected $processors; + + /** + * @var bool + */ + protected $microsecondTimestamps = true; + + /** + * @var callable + */ + protected $exceptionHandler; + + /** + * @param string $name The logging channel + * @param HandlerInterface[] $handlers Optional stack of handlers, the first one in the array is called first, etc. + * @param callable[] $processors Optional array of processors + */ + public function __construct($name, array $handlers = array(), array $processors = array()) + { + $this->name = $name; + $this->setHandlers($handlers); + $this->processors = $processors; + } + + /** + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Return a new cloned instance with the name changed + * + * @return static + */ + public function withName($name) + { + $new = clone $this; + $new->name = $name; + + return $new; + } + + /** + * Pushes a handler on to the stack. + * + * @param HandlerInterface $handler + * @return $this + */ + public function pushHandler(HandlerInterface $handler) + { + array_unshift($this->handlers, $handler); + + return $this; + } + + /** + * Pops a handler from the stack + * + * @return HandlerInterface + */ + public function popHandler() + { + if (!$this->handlers) { + throw new \LogicException('You tried to pop from an empty handler stack.'); + } + + return array_shift($this->handlers); + } + + /** + * Set handlers, replacing all existing ones. + * + * If a map is passed, keys will be ignored. + * + * @param HandlerInterface[] $handlers + * @return $this + */ + public function setHandlers(array $handlers) + { + $this->handlers = array(); + foreach (array_reverse($handlers) as $handler) { + $this->pushHandler($handler); + } + + return $this; + } + + /** + * @return HandlerInterface[] + */ + public function getHandlers() + { + return $this->handlers; + } + + /** + * Adds a processor on to the stack. + * + * @param callable $callback + * @return $this + */ + public function pushProcessor($callback) + { + if (!is_callable($callback)) { + throw new \InvalidArgumentException('Processors must be valid callables (callback or object with an __invoke method), '.var_export($callback, true).' given'); + } + array_unshift($this->processors, $callback); + + return $this; + } + + /** + * Removes the processor on top of the stack and returns it. + * + * @return callable + */ + public function popProcessor() + { + if (!$this->processors) { + throw new \LogicException('You tried to pop from an empty processor stack.'); + } + + return array_shift($this->processors); + } + + /** + * @return callable[] + */ + public function getProcessors() + { + return $this->processors; + } + + /** + * Control the use of microsecond resolution timestamps in the 'datetime' + * member of new records. + * + * Generating microsecond resolution timestamps by calling + * microtime(true), formatting the result via sprintf() and then parsing + * the resulting string via \DateTime::createFromFormat() can incur + * a measurable runtime overhead vs simple usage of DateTime to capture + * a second resolution timestamp in systems which generate a large number + * of log events. + * + * @param bool $micro True to use microtime() to create timestamps + */ + public function useMicrosecondTimestamps($micro) + { + $this->microsecondTimestamps = (bool) $micro; + } + + /** + * Adds a log record. + * + * @param int $level The logging level + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function addRecord($level, $message, array $context = array()) + { + if (!$this->handlers) { + $this->pushHandler(new StreamHandler('php://stderr', static::DEBUG)); + } + + $levelName = static::getLevelName($level); + + // check if any handler will handle this message so we can return early and save cycles + $handlerKey = null; + reset($this->handlers); + while ($handler = current($this->handlers)) { + if ($handler->isHandling(array('level' => $level))) { + $handlerKey = key($this->handlers); + break; + } + + next($this->handlers); + } + + if (null === $handlerKey) { + return false; + } + + if (!static::$timezone) { + static::$timezone = new \DateTimeZone(date_default_timezone_get() ?: 'UTC'); + } + + // php7.1+ always has microseconds enabled, so we do not need this hack + if ($this->microsecondTimestamps && PHP_VERSION_ID < 70100) { + $ts = \DateTime::createFromFormat('U.u', sprintf('%.6F', microtime(true)), static::$timezone); + } else { + $ts = new \DateTime(null, static::$timezone); + } + $ts->setTimezone(static::$timezone); + + $record = array( + 'message' => (string) $message, + 'context' => $context, + 'level' => $level, + 'level_name' => $levelName, + 'channel' => $this->name, + 'datetime' => $ts, + 'extra' => array(), + ); + + try { + foreach ($this->processors as $processor) { + $record = call_user_func($processor, $record); + } + + while ($handler = current($this->handlers)) { + if (true === $handler->handle($record)) { + break; + } + + next($this->handlers); + } + } catch (Exception $e) { + $this->handleException($e, $record); + } + + return true; + } + + /** + * Ends a log cycle and frees all resources used by handlers. + * + * Closing a Handler means flushing all buffers and freeing any open resources/handles. + * Handlers that have been closed should be able to accept log records again and re-open + * themselves on demand, but this may not always be possible depending on implementation. + * + * This is useful at the end of a request and will be called automatically on every handler + * when they get destructed. + */ + public function close() + { + foreach ($this->handlers as $handler) { + if (method_exists($handler, 'close')) { + $handler->close(); + } + } + } + + /** + * Ends a log cycle and resets all handlers and processors to their initial state. + * + * Resetting a Handler or a Processor means flushing/cleaning all buffers, resetting internal + * state, and getting it back to a state in which it can receive log records again. + * + * This is useful in case you want to avoid logs leaking between two requests or jobs when you + * have a long running process like a worker or an application server serving multiple requests + * in one process. + */ + public function reset() + { + foreach ($this->handlers as $handler) { + if ($handler instanceof ResettableInterface) { + $handler->reset(); + } + } + + foreach ($this->processors as $processor) { + if ($processor instanceof ResettableInterface) { + $processor->reset(); + } + } + } + + /** + * Adds a log record at the DEBUG level. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function addDebug($message, array $context = array()) + { + return $this->addRecord(static::DEBUG, $message, $context); + } + + /** + * Adds a log record at the INFO level. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function addInfo($message, array $context = array()) + { + return $this->addRecord(static::INFO, $message, $context); + } + + /** + * Adds a log record at the NOTICE level. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function addNotice($message, array $context = array()) + { + return $this->addRecord(static::NOTICE, $message, $context); + } + + /** + * Adds a log record at the WARNING level. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function addWarning($message, array $context = array()) + { + return $this->addRecord(static::WARNING, $message, $context); + } + + /** + * Adds a log record at the ERROR level. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function addError($message, array $context = array()) + { + return $this->addRecord(static::ERROR, $message, $context); + } + + /** + * Adds a log record at the CRITICAL level. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function addCritical($message, array $context = array()) + { + return $this->addRecord(static::CRITICAL, $message, $context); + } + + /** + * Adds a log record at the ALERT level. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function addAlert($message, array $context = array()) + { + return $this->addRecord(static::ALERT, $message, $context); + } + + /** + * Adds a log record at the EMERGENCY level. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function addEmergency($message, array $context = array()) + { + return $this->addRecord(static::EMERGENCY, $message, $context); + } + + /** + * Gets all supported logging levels. + * + * @return array Assoc array with human-readable level names => level codes. + */ + public static function getLevels() + { + return array_flip(static::$levels); + } + + /** + * Gets the name of the logging level. + * + * @param int $level + * @return string + */ + public static function getLevelName($level) + { + if (!isset(static::$levels[$level])) { + throw new InvalidArgumentException('Level "'.$level.'" is not defined, use one of: '.implode(', ', array_keys(static::$levels))); + } + + return static::$levels[$level]; + } + + /** + * Converts PSR-3 levels to Monolog ones if necessary + * + * @param string|int Level number (monolog) or name (PSR-3) + * @return int + */ + public static function toMonologLevel($level) + { + if (is_string($level)) { + // Contains chars of all log levels and avoids using strtoupper() which may have + // strange results depending on locale (for example, "i" will become "İ") + $upper = strtr($level, 'abcdefgilmnortuwy', 'ABCDEFGILMNORTUWY'); + if (defined(__CLASS__.'::'.$upper)) { + return constant(__CLASS__ . '::' . $upper); + } + } + + return $level; + } + + /** + * Checks whether the Logger has a handler that listens on the given level + * + * @param int $level + * @return bool + */ + public function isHandling($level) + { + $record = array( + 'level' => $level, + ); + + foreach ($this->handlers as $handler) { + if ($handler->isHandling($record)) { + return true; + } + } + + return false; + } + + /** + * Set a custom exception handler + * + * @param callable $callback + * @return $this + */ + public function setExceptionHandler($callback) + { + if (!is_callable($callback)) { + throw new \InvalidArgumentException('Exception handler must be valid callable (callback or object with an __invoke method), '.var_export($callback, true).' given'); + } + $this->exceptionHandler = $callback; + + return $this; + } + + /** + * @return callable + */ + public function getExceptionHandler() + { + return $this->exceptionHandler; + } + + /** + * Delegates exception management to the custom exception handler, + * or throws the exception if no custom handler is set. + */ + protected function handleException(Exception $e, array $record) + { + if (!$this->exceptionHandler) { + throw $e; + } + + call_user_func($this->exceptionHandler, $e, $record); + } + + /** + * Adds a log record at an arbitrary level. + * + * This method allows for compatibility with common interfaces. + * + * @param mixed $level The log level + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function log($level, $message, array $context = array()) + { + $level = static::toMonologLevel($level); + + return $this->addRecord($level, $message, $context); + } + + /** + * Adds a log record at the DEBUG level. + * + * This method allows for compatibility with common interfaces. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function debug($message, array $context = array()) + { + return $this->addRecord(static::DEBUG, $message, $context); + } + + /** + * Adds a log record at the INFO level. + * + * This method allows for compatibility with common interfaces. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function info($message, array $context = array()) + { + return $this->addRecord(static::INFO, $message, $context); + } + + /** + * Adds a log record at the NOTICE level. + * + * This method allows for compatibility with common interfaces. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function notice($message, array $context = array()) + { + return $this->addRecord(static::NOTICE, $message, $context); + } + + /** + * Adds a log record at the WARNING level. + * + * This method allows for compatibility with common interfaces. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function warn($message, array $context = array()) + { + return $this->addRecord(static::WARNING, $message, $context); + } + + /** + * Adds a log record at the WARNING level. + * + * This method allows for compatibility with common interfaces. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function warning($message, array $context = array()) + { + return $this->addRecord(static::WARNING, $message, $context); + } + + /** + * Adds a log record at the ERROR level. + * + * This method allows for compatibility with common interfaces. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function err($message, array $context = array()) + { + return $this->addRecord(static::ERROR, $message, $context); + } + + /** + * Adds a log record at the ERROR level. + * + * This method allows for compatibility with common interfaces. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function error($message, array $context = array()) + { + return $this->addRecord(static::ERROR, $message, $context); + } + + /** + * Adds a log record at the CRITICAL level. + * + * This method allows for compatibility with common interfaces. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function crit($message, array $context = array()) + { + return $this->addRecord(static::CRITICAL, $message, $context); + } + + /** + * Adds a log record at the CRITICAL level. + * + * This method allows for compatibility with common interfaces. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function critical($message, array $context = array()) + { + return $this->addRecord(static::CRITICAL, $message, $context); + } + + /** + * Adds a log record at the ALERT level. + * + * This method allows for compatibility with common interfaces. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function alert($message, array $context = array()) + { + return $this->addRecord(static::ALERT, $message, $context); + } + + /** + * Adds a log record at the EMERGENCY level. + * + * This method allows for compatibility with common interfaces. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function emerg($message, array $context = array()) + { + return $this->addRecord(static::EMERGENCY, $message, $context); + } + + /** + * Adds a log record at the EMERGENCY level. + * + * This method allows for compatibility with common interfaces. + * + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed + */ + public function emergency($message, array $context = array()) + { + return $this->addRecord(static::EMERGENCY, $message, $context); + } + + /** + * Set the timezone to be used for the timestamp of log records. + * + * This is stored globally for all Logger instances + * + * @param \DateTimeZone $tz Timezone object + */ + public static function setTimezone(\DateTimeZone $tz) + { + self::$timezone = $tz; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php new file mode 100644 index 0000000000..cdf5ec7363 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.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 Monolog\Processor; + +use Monolog\Logger; + +/** + * Injects Git branch and Git commit SHA in all records + * + * @author Nick Otter + * @author Jordi Boggiano + */ +class GitProcessor implements ProcessorInterface +{ + private $level; + private static $cache; + + public function __construct($level = Logger::DEBUG) + { + $this->level = Logger::toMonologLevel($level); + } + + /** + * @param array $record + * @return array + */ + public function __invoke(array $record) + { + // return if the level is not high enough + if ($record['level'] < $this->level) { + return $record; + } + + $record['extra']['git'] = self::getGitInfo(); + + return $record; + } + + private static function getGitInfo() + { + if (self::$cache) { + return self::$cache; + } + + $branches = `git branch -v --no-abbrev`; + if ($branches && preg_match('{^\* (.+?)\s+([a-f0-9]{40})(?:\s|$)}m', $branches, $matches)) { + return self::$cache = array( + 'branch' => $matches[1], + 'commit' => $matches[2], + ); + } + + return self::$cache = array(); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php new file mode 100644 index 0000000000..6ae192a232 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php @@ -0,0 +1,112 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +use Monolog\Logger; + +/** + * Injects line/file:class/function where the log message came from + * + * Warning: This only works if the handler processes the logs directly. + * If you put the processor on a handler that is behind a FingersCrossedHandler + * for example, the processor will only be called once the trigger level is reached, + * and all the log records will have the same file/line/.. data from the call that + * triggered the FingersCrossedHandler. + * + * @author Jordi Boggiano + */ +class IntrospectionProcessor implements ProcessorInterface +{ + private $level; + + private $skipClassesPartials; + + private $skipStackFramesCount; + + private $skipFunctions = array( + 'call_user_func', + 'call_user_func_array', + ); + + public function __construct($level = Logger::DEBUG, array $skipClassesPartials = array(), $skipStackFramesCount = 0) + { + $this->level = Logger::toMonologLevel($level); + $this->skipClassesPartials = array_merge(array('Monolog\\'), $skipClassesPartials); + $this->skipStackFramesCount = $skipStackFramesCount; + } + + /** + * @param array $record + * @return array + */ + public function __invoke(array $record) + { + // return if the level is not high enough + if ($record['level'] < $this->level) { + return $record; + } + + /* + * http://php.net/manual/en/function.debug-backtrace.php + * As of 5.3.6, DEBUG_BACKTRACE_IGNORE_ARGS option was added. + * Any version less than 5.3.6 must use the DEBUG_BACKTRACE_IGNORE_ARGS constant value '2'. + */ + $trace = debug_backtrace((PHP_VERSION_ID < 50306) ? 2 : DEBUG_BACKTRACE_IGNORE_ARGS); + + // skip first since it's always the current method + array_shift($trace); + // the call_user_func call is also skipped + array_shift($trace); + + $i = 0; + + while ($this->isTraceClassOrSkippedFunction($trace, $i)) { + if (isset($trace[$i]['class'])) { + foreach ($this->skipClassesPartials as $part) { + if (strpos($trace[$i]['class'], $part) !== false) { + $i++; + continue 2; + } + } + } elseif (in_array($trace[$i]['function'], $this->skipFunctions)) { + $i++; + continue; + } + + break; + } + + $i += $this->skipStackFramesCount; + + // we should have the call source now + $record['extra'] = array_merge( + $record['extra'], + array( + 'file' => isset($trace[$i - 1]['file']) ? $trace[$i - 1]['file'] : null, + 'line' => isset($trace[$i - 1]['line']) ? $trace[$i - 1]['line'] : null, + 'class' => isset($trace[$i]['class']) ? $trace[$i]['class'] : null, + 'function' => isset($trace[$i]['function']) ? $trace[$i]['function'] : null, + ) + ); + + return $record; + } + + private function isTraceClassOrSkippedFunction(array $trace, $index) + { + if (!isset($trace[$index])) { + return false; + } + + return isset($trace[$index]['class']) || in_array($trace[$index]['function'], $this->skipFunctions); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php new file mode 100644 index 0000000000..0543e9292f --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php @@ -0,0 +1,35 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +/** + * Injects memory_get_peak_usage in all records + * + * @see Monolog\Processor\MemoryProcessor::__construct() for options + * @author Rob Jensen + */ +class MemoryPeakUsageProcessor extends MemoryProcessor +{ + /** + * @param array $record + * @return array + */ + public function __invoke(array $record) + { + $bytes = memory_get_peak_usage($this->realUsage); + $formatted = $this->formatBytes($bytes); + + $record['extra']['memory_peak_usage'] = $formatted; + + return $record; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php new file mode 100644 index 0000000000..2a379a302e --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php @@ -0,0 +1,63 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +/** + * Some methods that are common for all memory processors + * + * @author Rob Jensen + */ +abstract class MemoryProcessor implements ProcessorInterface +{ + /** + * @var bool If true, get the real size of memory allocated from system. Else, only the memory used by emalloc() is reported. + */ + protected $realUsage; + + /** + * @var bool If true, then format memory size to human readable string (MB, KB, B depending on size) + */ + protected $useFormatting; + + /** + * @param bool $realUsage Set this to true to get the real size of memory allocated from system. + * @param bool $useFormatting If true, then format memory size to human readable string (MB, KB, B depending on size) + */ + public function __construct($realUsage = true, $useFormatting = true) + { + $this->realUsage = (bool) $realUsage; + $this->useFormatting = (bool) $useFormatting; + } + + /** + * Formats bytes into a human readable string if $this->useFormatting is true, otherwise return $bytes as is + * + * @param int $bytes + * @return string|int Formatted string if $this->useFormatting is true, otherwise return $bytes as is + */ + protected function formatBytes($bytes) + { + $bytes = (int) $bytes; + + if (!$this->useFormatting) { + return $bytes; + } + + if ($bytes > 1024 * 1024) { + return round($bytes / 1024 / 1024, 2).' MB'; + } elseif ($bytes > 1024) { + return round($bytes / 1024, 2).' KB'; + } + + return $bytes . ' B'; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php new file mode 100644 index 0000000000..2783d656ba --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php @@ -0,0 +1,35 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +/** + * Injects memory_get_usage in all records + * + * @see Monolog\Processor\MemoryProcessor::__construct() for options + * @author Rob Jensen + */ +class MemoryUsageProcessor extends MemoryProcessor +{ + /** + * @param array $record + * @return array + */ + public function __invoke(array $record) + { + $bytes = memory_get_usage($this->realUsage); + $formatted = $this->formatBytes($bytes); + + $record['extra']['memory_usage'] = $formatted; + + return $record; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php new file mode 100644 index 0000000000..2f5b32659e --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php @@ -0,0 +1,63 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +use Monolog\Logger; + +/** + * Injects Hg branch and Hg revision number in all records + * + * @author Jonathan A. Schweder + */ +class MercurialProcessor implements ProcessorInterface +{ + private $level; + private static $cache; + + public function __construct($level = Logger::DEBUG) + { + $this->level = Logger::toMonologLevel($level); + } + + /** + * @param array $record + * @return array + */ + public function __invoke(array $record) + { + // return if the level is not high enough + if ($record['level'] < $this->level) { + return $record; + } + + $record['extra']['hg'] = self::getMercurialInfo(); + + return $record; + } + + private static function getMercurialInfo() + { + if (self::$cache) { + return self::$cache; + } + + $result = explode(' ', trim(`hg id -nb`)); + if (count($result) >= 3) { + return self::$cache = array( + 'branch' => $result[1], + 'revision' => $result[2], + ); + } + + return self::$cache = array(); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php new file mode 100644 index 0000000000..66b80fbbd3 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.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 Monolog\Processor; + +/** + * Adds value of getmypid into records + * + * @author Andreas Hörnicke + */ +class ProcessIdProcessor implements ProcessorInterface +{ + /** + * @param array $record + * @return array + */ + public function __invoke(array $record) + { + $record['extra']['process_id'] = getmypid(); + + return $record; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php b/vendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php new file mode 100644 index 0000000000..7e64d4dfaf --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.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 Monolog\Processor; + +/** + * An optional interface to allow labelling Monolog processors. + * + * @author Nicolas Grekas + */ +interface ProcessorInterface +{ + /** + * @return array The processed records + */ + public function __invoke(array $records); +} diff --git a/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php new file mode 100644 index 0000000000..0088505451 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php @@ -0,0 +1,50 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +use Monolog\Utils; + +/** + * Processes a record's message according to PSR-3 rules + * + * It replaces {foo} with the value from $context['foo'] + * + * @author Jordi Boggiano + */ +class PsrLogMessageProcessor implements ProcessorInterface +{ + /** + * @param array $record + * @return array + */ + public function __invoke(array $record) + { + if (false === strpos($record['message'], '{')) { + return $record; + } + + $replacements = array(); + foreach ($record['context'] as $key => $val) { + if (is_null($val) || is_scalar($val) || (is_object($val) && method_exists($val, "__toString"))) { + $replacements['{'.$key.'}'] = $val; + } elseif (is_object($val)) { + $replacements['{'.$key.'}'] = '[object '.Utils::getClass($val).']'; + } else { + $replacements['{'.$key.'}'] = '['.gettype($val).']'; + } + } + + $record['message'] = strtr($record['message'], $replacements); + + return $record; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php new file mode 100644 index 0000000000..615a4d9915 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php @@ -0,0 +1,44 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +/** + * Adds a tags array into record + * + * @author Martijn Riemers + */ +class TagProcessor implements ProcessorInterface +{ + private $tags; + + public function __construct(array $tags = array()) + { + $this->setTags($tags); + } + + public function addTags(array $tags = array()) + { + $this->tags = array_merge($this->tags, $tags); + } + + public function setTags(array $tags = array()) + { + $this->tags = $tags; + } + + public function __invoke(array $record) + { + $record['extra']['tags'] = $this->tags; + + return $record; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php new file mode 100644 index 0000000000..d1f708cf2d --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.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 Monolog\Processor; + +use Monolog\ResettableInterface; + +/** + * Adds a unique identifier into records + * + * @author Simon Mönch + */ +class UidProcessor implements ProcessorInterface, ResettableInterface +{ + private $uid; + + public function __construct($length = 7) + { + if (!is_int($length) || $length > 32 || $length < 1) { + throw new \InvalidArgumentException('The uid length must be an integer between 1 and 32'); + } + + + $this->uid = $this->generateUid($length); + } + + public function __invoke(array $record) + { + $record['extra']['uid'] = $this->uid; + + return $record; + } + + /** + * @return string + */ + public function getUid() + { + return $this->uid; + } + + public function reset() + { + $this->uid = $this->generateUid(strlen($this->uid)); + } + + private function generateUid($length) + { + return substr(hash('md5', uniqid('', true)), 0, $length); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php new file mode 100644 index 0000000000..2e8dfae1b4 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php @@ -0,0 +1,113 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +/** + * Injects url/method and remote IP of the current web request in all records + * + * @author Jordi Boggiano + */ +class WebProcessor implements ProcessorInterface +{ + /** + * @var array|\ArrayAccess + */ + protected $serverData; + + /** + * Default fields + * + * Array is structured as [key in record.extra => key in $serverData] + * + * @var array + */ + protected $extraFields = array( + 'url' => 'REQUEST_URI', + 'ip' => 'REMOTE_ADDR', + 'http_method' => 'REQUEST_METHOD', + 'server' => 'SERVER_NAME', + 'referrer' => 'HTTP_REFERER', + ); + + /** + * @param array|\ArrayAccess $serverData Array or object w/ ArrayAccess that provides access to the $_SERVER data + * @param array|null $extraFields Field names and the related key inside $serverData to be added. If not provided it defaults to: url, ip, http_method, server, referrer + */ + public function __construct($serverData = null, array $extraFields = null) + { + if (null === $serverData) { + $this->serverData = &$_SERVER; + } elseif (is_array($serverData) || $serverData instanceof \ArrayAccess) { + $this->serverData = $serverData; + } else { + throw new \UnexpectedValueException('$serverData must be an array or object implementing ArrayAccess.'); + } + + if (isset($this->serverData['UNIQUE_ID'])) { + $this->extraFields['unique_id'] = 'UNIQUE_ID'; + } + + if (null !== $extraFields) { + if (isset($extraFields[0])) { + foreach (array_keys($this->extraFields) as $fieldName) { + if (!in_array($fieldName, $extraFields)) { + unset($this->extraFields[$fieldName]); + } + } + } else { + $this->extraFields = $extraFields; + } + } + } + + /** + * @param array $record + * @return array + */ + public function __invoke(array $record) + { + // skip processing if for some reason request data + // is not present (CLI or wonky SAPIs) + if (!isset($this->serverData['REQUEST_URI'])) { + return $record; + } + + $record['extra'] = $this->appendExtraFields($record['extra']); + + return $record; + } + + /** + * @param string $extraName + * @param string $serverName + * @return $this + */ + public function addExtraField($extraName, $serverName) + { + $this->extraFields[$extraName] = $serverName; + + return $this; + } + + /** + * @param array $extra + * @return array + */ + private function appendExtraFields(array $extra) + { + foreach ($this->extraFields as $extraName => $serverName) { + $extra[$extraName] = isset($this->serverData[$serverName]) ? $this->serverData[$serverName] : null; + } + + return $extra; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Registry.php b/vendor/monolog/monolog/src/Monolog/Registry.php new file mode 100644 index 0000000000..159b751cdb --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Registry.php @@ -0,0 +1,134 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog; + +use InvalidArgumentException; + +/** + * Monolog log registry + * + * Allows to get `Logger` instances in the global scope + * via static method calls on this class. + * + * + * $application = new Monolog\Logger('application'); + * $api = new Monolog\Logger('api'); + * + * Monolog\Registry::addLogger($application); + * Monolog\Registry::addLogger($api); + * + * function testLogger() + * { + * Monolog\Registry::api()->addError('Sent to $api Logger instance'); + * Monolog\Registry::application()->addError('Sent to $application Logger instance'); + * } + * + * + * @author Tomas Tatarko + */ +class Registry +{ + /** + * List of all loggers in the registry (by named indexes) + * + * @var Logger[] + */ + private static $loggers = array(); + + /** + * Adds new logging channel to the registry + * + * @param Logger $logger Instance of the logging channel + * @param string|null $name Name of the logging channel ($logger->getName() by default) + * @param bool $overwrite Overwrite instance in the registry if the given name already exists? + * @throws \InvalidArgumentException If $overwrite set to false and named Logger instance already exists + */ + public static function addLogger(Logger $logger, $name = null, $overwrite = false) + { + $name = $name ?: $logger->getName(); + + if (isset(self::$loggers[$name]) && !$overwrite) { + throw new InvalidArgumentException('Logger with the given name already exists'); + } + + self::$loggers[$name] = $logger; + } + + /** + * Checks if such logging channel exists by name or instance + * + * @param string|Logger $logger Name or logger instance + */ + public static function hasLogger($logger) + { + if ($logger instanceof Logger) { + $index = array_search($logger, self::$loggers, true); + + return false !== $index; + } else { + return isset(self::$loggers[$logger]); + } + } + + /** + * Removes instance from registry by name or instance + * + * @param string|Logger $logger Name or logger instance + */ + public static function removeLogger($logger) + { + if ($logger instanceof Logger) { + if (false !== ($idx = array_search($logger, self::$loggers, true))) { + unset(self::$loggers[$idx]); + } + } else { + unset(self::$loggers[$logger]); + } + } + + /** + * Clears the registry + */ + public static function clear() + { + self::$loggers = array(); + } + + /** + * Gets Logger instance from the registry + * + * @param string $name Name of the requested Logger instance + * @throws \InvalidArgumentException If named Logger instance is not in the registry + * @return Logger Requested instance of Logger + */ + public static function getInstance($name) + { + if (!isset(self::$loggers[$name])) { + throw new InvalidArgumentException(sprintf('Requested "%s" logger instance is not in the registry', $name)); + } + + return self::$loggers[$name]; + } + + /** + * Gets Logger instance from the registry via static method call + * + * @param string $name Name of the requested Logger instance + * @param array $arguments Arguments passed to static method call + * @throws \InvalidArgumentException If named Logger instance is not in the registry + * @return Logger Requested instance of Logger + */ + public static function __callStatic($name, $arguments) + { + return self::getInstance($name); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/ResettableInterface.php b/vendor/monolog/monolog/src/Monolog/ResettableInterface.php new file mode 100644 index 0000000000..635bc77dcc --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/ResettableInterface.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 Monolog; + +/** + * Handler or Processor implementing this interface will be reset when Logger::reset() is called. + * + * Resetting ends a log cycle gets them back to their initial state. + * + * Resetting a Handler or a Processor means flushing/cleaning all buffers, resetting internal + * state, and getting it back to a state in which it can receive log records again. + * + * This is useful in case you want to avoid logs leaking between two requests or jobs when you + * have a long running process like a worker or an application server serving multiple requests + * in one process. + * + * @author Grégoire Pineau + */ +interface ResettableInterface +{ + public function reset(); +} diff --git a/vendor/monolog/monolog/src/Monolog/SignalHandler.php b/vendor/monolog/monolog/src/Monolog/SignalHandler.php new file mode 100644 index 0000000000..d87018fedf --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/SignalHandler.php @@ -0,0 +1,115 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog; + +use Psr\Log\LoggerInterface; +use Psr\Log\LogLevel; +use ReflectionExtension; + +/** + * Monolog POSIX signal handler + * + * @author Robert Gust-Bardon + */ +class SignalHandler +{ + private $logger; + + private $previousSignalHandler = array(); + private $signalLevelMap = array(); + private $signalRestartSyscalls = array(); + + public function __construct(LoggerInterface $logger) + { + $this->logger = $logger; + } + + public function registerSignalHandler($signo, $level = LogLevel::CRITICAL, $callPrevious = true, $restartSyscalls = true, $async = true) + { + if (!extension_loaded('pcntl') || !function_exists('pcntl_signal')) { + return $this; + } + + if ($callPrevious) { + if (function_exists('pcntl_signal_get_handler')) { + $handler = pcntl_signal_get_handler($signo); + if ($handler === false) { + return $this; + } + $this->previousSignalHandler[$signo] = $handler; + } else { + $this->previousSignalHandler[$signo] = true; + } + } else { + unset($this->previousSignalHandler[$signo]); + } + $this->signalLevelMap[$signo] = $level; + $this->signalRestartSyscalls[$signo] = $restartSyscalls; + + if (function_exists('pcntl_async_signals') && $async !== null) { + pcntl_async_signals($async); + } + + pcntl_signal($signo, array($this, 'handleSignal'), $restartSyscalls); + + return $this; + } + + public function handleSignal($signo, array $siginfo = null) + { + static $signals = array(); + + if (!$signals && extension_loaded('pcntl')) { + $pcntl = new ReflectionExtension('pcntl'); + $constants = $pcntl->getConstants(); + if (!$constants) { + // HHVM 3.24.2 returns an empty array. + $constants = get_defined_constants(true); + $constants = $constants['Core']; + } + foreach ($constants as $name => $value) { + if (substr($name, 0, 3) === 'SIG' && $name[3] !== '_' && is_int($value)) { + $signals[$value] = $name; + } + } + unset($constants); + } + + $level = isset($this->signalLevelMap[$signo]) ? $this->signalLevelMap[$signo] : LogLevel::CRITICAL; + $signal = isset($signals[$signo]) ? $signals[$signo] : $signo; + $context = isset($siginfo) ? $siginfo : array(); + $this->logger->log($level, sprintf('Program received signal %s', $signal), $context); + + if (!isset($this->previousSignalHandler[$signo])) { + return; + } + + if ($this->previousSignalHandler[$signo] === true || $this->previousSignalHandler[$signo] === SIG_DFL) { + if (extension_loaded('pcntl') && function_exists('pcntl_signal') && function_exists('pcntl_sigprocmask') && function_exists('pcntl_signal_dispatch') + && extension_loaded('posix') && function_exists('posix_getpid') && function_exists('posix_kill')) { + $restartSyscalls = isset($this->signalRestartSyscalls[$signo]) ? $this->signalRestartSyscalls[$signo] : true; + pcntl_signal($signo, SIG_DFL, $restartSyscalls); + pcntl_sigprocmask(SIG_UNBLOCK, array($signo), $oldset); + posix_kill(posix_getpid(), $signo); + pcntl_signal_dispatch(); + pcntl_sigprocmask(SIG_SETMASK, $oldset); + pcntl_signal($signo, array($this, 'handleSignal'), $restartSyscalls); + } + } elseif (is_callable($this->previousSignalHandler[$signo])) { + if (PHP_VERSION_ID >= 70100) { + $this->previousSignalHandler[$signo]($signo, $siginfo); + } else { + $this->previousSignalHandler[$signo]($signo); + } + } + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Utils.php b/vendor/monolog/monolog/src/Monolog/Utils.php new file mode 100644 index 0000000000..712b19692c --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Utils.php @@ -0,0 +1,189 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog; + +class Utils +{ + /** + * @internal + */ + public static function getClass($object) + { + $class = \get_class($object); + + return 'c' === $class[0] && 0 === strpos($class, "class@anonymous\0") ? get_parent_class($class).'@anonymous' : $class; + } + + /** + * Makes sure if a relative path is passed in it is turned into an absolute path + * + * @param string $streamUrl stream URL or path without protocol + * + * @return string + */ + public static function canonicalizePath($streamUrl) + { + $prefix = ''; + if ('file://' === substr($streamUrl, 0, 7)) { + $streamUrl = substr($streamUrl, 7); + $prefix = 'file://'; + } + + // other type of stream, not supported + if (false !== strpos($streamUrl, '://')) { + return $streamUrl; + } + + // already absolute + if (substr($streamUrl, 0, 1) === '/' || substr($streamUrl, 1, 1) === ':' || substr($streamUrl, 0, 2) === '\\\\') { + return $prefix.$streamUrl; + } + + $streamUrl = getcwd() . '/' . $streamUrl; + + return $prefix.$streamUrl; + } + + /** + * Return the JSON representation of a value + * + * @param mixed $data + * @param int $encodeFlags flags to pass to json encode, defaults to JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE + * @param bool $ignoreErrors whether to ignore encoding errors or to throw on error, when ignored and the encoding fails, "null" is returned which is valid json for null + * @throws \RuntimeException if encoding fails and errors are not ignored + * @return string + */ + public static function jsonEncode($data, $encodeFlags = null, $ignoreErrors = false) + { + if (null === $encodeFlags && version_compare(PHP_VERSION, '5.4.0', '>=')) { + $encodeFlags = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE; + } + + if ($ignoreErrors) { + $json = @json_encode($data, $encodeFlags); + if (false === $json) { + return 'null'; + } + + return $json; + } + + $json = json_encode($data, $encodeFlags); + if (false === $json) { + $json = self::handleJsonError(json_last_error(), $data); + } + + return $json; + } + + /** + * Handle a json_encode failure. + * + * If the failure is due to invalid string encoding, try to clean the + * input and encode again. If the second encoding attempt fails, the + * inital error is not encoding related or the input can't be cleaned then + * raise a descriptive exception. + * + * @param int $code return code of json_last_error function + * @param mixed $data data that was meant to be encoded + * @param int $encodeFlags flags to pass to json encode, defaults to JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE + * @throws \RuntimeException if failure can't be corrected + * @return string JSON encoded data after error correction + */ + public static function handleJsonError($code, $data, $encodeFlags = null) + { + if ($code !== JSON_ERROR_UTF8) { + self::throwEncodeError($code, $data); + } + + if (is_string($data)) { + self::detectAndCleanUtf8($data); + } elseif (is_array($data)) { + array_walk_recursive($data, array('Monolog\Utils', 'detectAndCleanUtf8')); + } else { + self::throwEncodeError($code, $data); + } + + if (null === $encodeFlags && version_compare(PHP_VERSION, '5.4.0', '>=')) { + $encodeFlags = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE; + } + + $json = json_encode($data, $encodeFlags); + + if ($json === false) { + self::throwEncodeError(json_last_error(), $data); + } + + return $json; + } + + /** + * Throws an exception according to a given code with a customized message + * + * @param int $code return code of json_last_error function + * @param mixed $data data that was meant to be encoded + * @throws \RuntimeException + */ + private static function throwEncodeError($code, $data) + { + switch ($code) { + case JSON_ERROR_DEPTH: + $msg = 'Maximum stack depth exceeded'; + break; + case JSON_ERROR_STATE_MISMATCH: + $msg = 'Underflow or the modes mismatch'; + break; + case JSON_ERROR_CTRL_CHAR: + $msg = 'Unexpected control character found'; + break; + case JSON_ERROR_UTF8: + $msg = 'Malformed UTF-8 characters, possibly incorrectly encoded'; + break; + default: + $msg = 'Unknown error'; + } + + throw new \RuntimeException('JSON encoding failed: '.$msg.'. Encoding: '.var_export($data, true)); + } + + /** + * Detect invalid UTF-8 string characters and convert to valid UTF-8. + * + * Valid UTF-8 input will be left unmodified, but strings containing + * invalid UTF-8 codepoints will be reencoded as UTF-8 with an assumed + * original encoding of ISO-8859-15. This conversion may result in + * incorrect output if the actual encoding was not ISO-8859-15, but it + * will be clean UTF-8 output and will not rely on expensive and fragile + * detection algorithms. + * + * Function converts the input in place in the passed variable so that it + * can be used as a callback for array_walk_recursive. + * + * @param mixed &$data Input to check and convert if needed + * @private + */ + public static function detectAndCleanUtf8(&$data) + { + if (is_string($data) && !preg_match('//u', $data)) { + $data = preg_replace_callback( + '/[\x80-\xFF]+/', + function ($m) { return utf8_encode($m[0]); }, + $data + ); + $data = str_replace( + array('¤', '¦', '¨', '´', '¸', '¼', '½', '¾'), + array('€', 'Š', 'š', 'Ž', 'ž', 'Œ', 'œ', 'Ÿ'), + $data + ); + } + } +} diff --git a/vendor/myclabs/deep-copy/.github/FUNDING.yml b/vendor/myclabs/deep-copy/.github/FUNDING.yml new file mode 100644 index 0000000000..b8da664ddc --- /dev/null +++ b/vendor/myclabs/deep-copy/.github/FUNDING.yml @@ -0,0 +1,12 @@ +# These are supported funding model platforms + +github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: "packagist/myclabs/deep-copy" +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/vendor/myclabs/deep-copy/LICENSE b/vendor/myclabs/deep-copy/LICENSE new file mode 100644 index 0000000000..c3e835001c --- /dev/null +++ b/vendor/myclabs/deep-copy/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2013 My C-Sense + +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/myclabs/deep-copy/README.md b/vendor/myclabs/deep-copy/README.md new file mode 100644 index 0000000000..007ad5bb8f --- /dev/null +++ b/vendor/myclabs/deep-copy/README.md @@ -0,0 +1,375 @@ +# DeepCopy + +DeepCopy helps you create deep copies (clones) of your objects. It is designed to handle cycles in the association graph. + +[![Build Status](https://travis-ci.org/myclabs/DeepCopy.png?branch=1.x)](https://travis-ci.org/myclabs/DeepCopy) +[![Coverage Status](https://coveralls.io/repos/myclabs/DeepCopy/badge.png?branch=1.x)](https://coveralls.io/r/myclabs/DeepCopy?branch=1.x) +[![Scrutinizer Quality Score](https://scrutinizer-ci.com/g/myclabs/DeepCopy/badges/quality-score.png?s=2747100c19b275f93a777e3297c6c12d1b68b934)](https://scrutinizer-ci.com/g/myclabs/DeepCopy/) +[![Total Downloads](https://poser.pugx.org/myclabs/deep-copy/downloads.svg)](https://packagist.org/packages/myclabs/deep-copy) + +## Table of Contents + +1. [How](#how) +1. [Why](#why) + 1. [Using simply `clone`](#using-simply-clone) + 1. [Overridding `__clone()`](#overridding-__clone) + 1. [With `DeepCopy`](#with-deepcopy) +1. [How it works](#how-it-works) +1. [Going further](#going-further) + 1. [Matchers](#matchers) + 1. [Property name](#property-name) + 1. [Specific property](#specific-property) + 1. [Type](#type) + 1. [Filters](#filters) + 1. [`SetNullFilter`](#setnullfilter-filter) + 1. [`KeepFilter`](#keepfilter-filter) + 1. [`DoctrineCollectionFilter`](#doctrinecollectionfilter-filter) + 1. [`DoctrineEmptyCollectionFilter`](#doctrineemptycollectionfilter-filter) + 1. [`DoctrineProxyFilter`](#doctrineproxyfilter-filter) + 1. [`ReplaceFilter`](#replacefilter-type-filter) + 1. [`ShallowCopyFilter`](#shallowcopyfilter-type-filter) +1. [Edge cases](#edge-cases) +1. [Contributing](#contributing) + 1. [Tests](#tests) + + +## How? + +Install with Composer: + +```json +composer require myclabs/deep-copy +``` + +Use simply: + +```php +use DeepCopy\DeepCopy; + +$copier = new DeepCopy(); +$myCopy = $copier->copy($myObject); +``` + + +## Why? + +- How do you create copies of your objects? + +```php +$myCopy = clone $myObject; +``` + +- How do you create **deep** copies of your objects (i.e. copying also all the objects referenced in the properties)? + +You use [`__clone()`](http://www.php.net/manual/en/language.oop5.cloning.php#object.clone) and implement the behavior +yourself. + +- But how do you handle **cycles** in the association graph? + +Now you're in for a big mess :( + +![association graph](doc/graph.png) + + +### Using simply `clone` + +![Using clone](doc/clone.png) + + +### Overridding `__clone()` + +![Overridding __clone](doc/deep-clone.png) + + +### With `DeepCopy` + +![With DeepCopy](doc/deep-copy.png) + + +## How it works + +DeepCopy recursively traverses all the object's properties and clones them. To avoid cloning the same object twice it +keeps a hash map of all instances and thus preserves the object graph. + +To use it: + +```php +use function DeepCopy\deep_copy; + +$copy = deep_copy($var); +``` + +Alternatively, you can create your own `DeepCopy` instance to configure it differently for example: + +```php +use DeepCopy\DeepCopy; + +$copier = new DeepCopy(true); + +$copy = $copier->copy($var); +``` + +You may want to roll your own deep copy function: + +```php +namespace Acme; + +use DeepCopy\DeepCopy; + +function deep_copy($var) +{ + static $copier = null; + + if (null === $copier) { + $copier = new DeepCopy(true); + } + + return $copier->copy($var); +} +``` + + +## Going further + +You can add filters to customize the copy process. + +The method to add a filter is `DeepCopy\DeepCopy::addFilter($filter, $matcher)`, +with `$filter` implementing `DeepCopy\Filter\Filter` +and `$matcher` implementing `DeepCopy\Matcher\Matcher`. + +We provide some generic filters and matchers. + + +### Matchers + + - `DeepCopy\Matcher` applies on a object attribute. + - `DeepCopy\TypeMatcher` applies on any element found in graph, including array elements. + + +#### Property name + +The `PropertyNameMatcher` will match a property by its name: + +```php +use DeepCopy\Matcher\PropertyNameMatcher; + +// Will apply a filter to any property of any objects named "id" +$matcher = new PropertyNameMatcher('id'); +``` + + +#### Specific property + +The `PropertyMatcher` will match a specific property of a specific class: + +```php +use DeepCopy\Matcher\PropertyMatcher; + +// Will apply a filter to the property "id" of any objects of the class "MyClass" +$matcher = new PropertyMatcher('MyClass', 'id'); +``` + + +#### Type + +The `TypeMatcher` will match any element by its type (instance of a class or any value that could be parameter of +[gettype()](http://php.net/manual/en/function.gettype.php) function): + +```php +use DeepCopy\TypeMatcher\TypeMatcher; + +// Will apply a filter to any object that is an instance of Doctrine\Common\Collections\Collection +$matcher = new TypeMatcher('Doctrine\Common\Collections\Collection'); +``` + + +### Filters + +- `DeepCopy\Filter` applies a transformation to the object attribute matched by `DeepCopy\Matcher` +- `DeepCopy\TypeFilter` applies a transformation to any element matched by `DeepCopy\TypeMatcher` + + +#### `SetNullFilter` (filter) + +Let's say for example that you are copying a database record (or a Doctrine entity), so you want the copy not to have +any ID: + +```php +use DeepCopy\DeepCopy; +use DeepCopy\Filter\SetNullFilter; +use DeepCopy\Matcher\PropertyNameMatcher; + +$object = MyClass::load(123); +echo $object->id; // 123 + +$copier = new DeepCopy(); +$copier->addFilter(new SetNullFilter(), new PropertyNameMatcher('id')); + +$copy = $copier->copy($object); + +echo $copy->id; // null +``` + + +#### `KeepFilter` (filter) + +If you want a property to remain untouched (for example, an association to an object): + +```php +use DeepCopy\DeepCopy; +use DeepCopy\Filter\KeepFilter; +use DeepCopy\Matcher\PropertyMatcher; + +$copier = new DeepCopy(); +$copier->addFilter(new KeepFilter(), new PropertyMatcher('MyClass', 'category')); + +$copy = $copier->copy($object); +// $copy->category has not been touched +``` + + +#### `DoctrineCollectionFilter` (filter) + +If you use Doctrine and want to copy an entity, you will need to use the `DoctrineCollectionFilter`: + +```php +use DeepCopy\DeepCopy; +use DeepCopy\Filter\Doctrine\DoctrineCollectionFilter; +use DeepCopy\Matcher\PropertyTypeMatcher; + +$copier = new DeepCopy(); +$copier->addFilter(new DoctrineCollectionFilter(), new PropertyTypeMatcher('Doctrine\Common\Collections\Collection')); + +$copy = $copier->copy($object); +``` + + +#### `DoctrineEmptyCollectionFilter` (filter) + +If you use Doctrine and want to copy an entity who contains a `Collection` that you want to be reset, you can use the +`DoctrineEmptyCollectionFilter` + +```php +use DeepCopy\DeepCopy; +use DeepCopy\Filter\Doctrine\DoctrineEmptyCollectionFilter; +use DeepCopy\Matcher\PropertyMatcher; + +$copier = new DeepCopy(); +$copier->addFilter(new DoctrineEmptyCollectionFilter(), new PropertyMatcher('MyClass', 'myProperty')); + +$copy = $copier->copy($object); + +// $copy->myProperty will return an empty collection +``` + + +#### `DoctrineProxyFilter` (filter) + +If you use Doctrine and use cloning on lazy loaded entities, you might encounter errors mentioning missing fields on a +Doctrine proxy class (...\\\_\_CG\_\_\Proxy). +You can use the `DoctrineProxyFilter` to load the actual entity behind the Doctrine proxy class. +**Make sure, though, to put this as one of your very first filters in the filter chain so that the entity is loaded +before other filters are applied!** + +```php +use DeepCopy\DeepCopy; +use DeepCopy\Filter\Doctrine\DoctrineProxyFilter; +use DeepCopy\Matcher\Doctrine\DoctrineProxyMatcher; + +$copier = new DeepCopy(); +$copier->addFilter(new DoctrineProxyFilter(), new DoctrineProxyMatcher()); + +$copy = $copier->copy($object); + +// $copy should now contain a clone of all entities, including those that were not yet fully loaded. +``` + + +#### `ReplaceFilter` (type filter) + +1. If you want to replace the value of a property: + +```php +use DeepCopy\DeepCopy; +use DeepCopy\Filter\ReplaceFilter; +use DeepCopy\Matcher\PropertyMatcher; + +$copier = new DeepCopy(); +$callback = function ($currentValue) { + return $currentValue . ' (copy)' +}; +$copier->addFilter(new ReplaceFilter($callback), new PropertyMatcher('MyClass', 'title')); + +$copy = $copier->copy($object); + +// $copy->title will contain the data returned by the callback, e.g. 'The title (copy)' +``` + +2. If you want to replace whole element: + +```php +use DeepCopy\DeepCopy; +use DeepCopy\TypeFilter\ReplaceFilter; +use DeepCopy\TypeMatcher\TypeMatcher; + +$copier = new DeepCopy(); +$callback = function (MyClass $myClass) { + return get_class($myClass); +}; +$copier->addTypeFilter(new ReplaceFilter($callback), new TypeMatcher('MyClass')); + +$copy = $copier->copy([new MyClass, 'some string', new MyClass]); + +// $copy will contain ['MyClass', 'some string', 'MyClass'] +``` + + +The `$callback` parameter of the `ReplaceFilter` constructor accepts any PHP callable. + + +#### `ShallowCopyFilter` (type filter) + +Stop *DeepCopy* from recursively copying element, using standard `clone` instead: + +```php +use DeepCopy\DeepCopy; +use DeepCopy\TypeFilter\ShallowCopyFilter; +use DeepCopy\TypeMatcher\TypeMatcher; +use Mockery as m; + +$this->deepCopy = new DeepCopy(); +$this->deepCopy->addTypeFilter( + new ShallowCopyFilter, + new TypeMatcher(m\MockInterface::class) +); + +$myServiceWithMocks = new MyService(m::mock(MyDependency1::class), m::mock(MyDependency2::class)); +// All mocks will be just cloned, not deep copied +``` + + +## Edge cases + +The following structures cannot be deep-copied with PHP Reflection. As a result they are shallow cloned and filters are +not applied. There is two ways for you to handle them: + +- Implement your own `__clone()` method +- Use a filter with a type matcher + + +## Contributing + +DeepCopy is distributed under the MIT license. + + +### Tests + +Running the tests is simple: + +```php +vendor/bin/phpunit +``` + +### Support + +Get professional support via [the Tidelift Subscription](https://tidelift.com/subscription/pkg/packagist-myclabs-deep-copy?utm_source=packagist-myclabs-deep-copy&utm_medium=referral&utm_campaign=readme). diff --git a/vendor/myclabs/deep-copy/composer.json b/vendor/myclabs/deep-copy/composer.json new file mode 100644 index 0000000000..45656c916d --- /dev/null +++ b/vendor/myclabs/deep-copy/composer.json @@ -0,0 +1,38 @@ +{ + "name": "myclabs/deep-copy", + "type": "library", + "description": "Create deep copies (clones) of your objects", + "keywords": ["clone", "copy", "duplicate", "object", "object graph"], + "license": "MIT", + + "autoload": { + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + }, + "files": [ + "src/DeepCopy/deep_copy.php" + ] + }, + "autoload-dev": { + "psr-4": { + "DeepCopy\\": "fixtures/", + "DeepCopyTest\\": "tests/DeepCopyTest/" + } + }, + + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/collections": "^1.0", + "doctrine/common": "^2.6", + "phpunit/phpunit": "^7.1" + }, + "replace": { + "myclabs/deep-copy": "self.version" + }, + + "config": { + "sort-packages": true + } +} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/DeepCopy.php b/vendor/myclabs/deep-copy/src/DeepCopy/DeepCopy.php new file mode 100644 index 0000000000..15e5c6893f --- /dev/null +++ b/vendor/myclabs/deep-copy/src/DeepCopy/DeepCopy.php @@ -0,0 +1,298 @@ + Filter, 'matcher' => Matcher] pairs. + */ + private $filters = []; + + /** + * Type Filters to apply. + * + * @var array Array of ['filter' => Filter, 'matcher' => Matcher] pairs. + */ + private $typeFilters = []; + + /** + * @var bool + */ + private $skipUncloneable = false; + + /** + * @var bool + */ + private $useCloneMethod; + + /** + * @param bool $useCloneMethod If set to true, when an object implements the __clone() function, it will be used + * instead of the regular deep cloning. + */ + public function __construct($useCloneMethod = false) + { + $this->useCloneMethod = $useCloneMethod; + + $this->addTypeFilter(new ArrayObjectFilter($this), new TypeMatcher(ArrayObject::class)); + $this->addTypeFilter(new DateIntervalFilter(), new TypeMatcher(DateInterval::class)); + $this->addTypeFilter(new SplDoublyLinkedListFilter($this), new TypeMatcher(SplDoublyLinkedList::class)); + } + + /** + * If enabled, will not throw an exception when coming across an uncloneable property. + * + * @param $skipUncloneable + * + * @return $this + */ + public function skipUncloneable($skipUncloneable = true) + { + $this->skipUncloneable = $skipUncloneable; + + return $this; + } + + /** + * Deep copies the given object. + * + * @param mixed $object + * + * @return mixed + */ + public function copy($object) + { + $this->hashMap = []; + + return $this->recursiveCopy($object); + } + + public function addFilter(Filter $filter, Matcher $matcher) + { + $this->filters[] = [ + 'matcher' => $matcher, + 'filter' => $filter, + ]; + } + + public function prependFilter(Filter $filter, Matcher $matcher) + { + array_unshift($this->filters, [ + 'matcher' => $matcher, + 'filter' => $filter, + ]); + } + + public function addTypeFilter(TypeFilter $filter, TypeMatcher $matcher) + { + $this->typeFilters[] = [ + 'matcher' => $matcher, + 'filter' => $filter, + ]; + } + + private function recursiveCopy($var) + { + // Matches Type Filter + if ($filter = $this->getFirstMatchedTypeFilter($this->typeFilters, $var)) { + return $filter->apply($var); + } + + // Resource + if (is_resource($var)) { + return $var; + } + + // Array + if (is_array($var)) { + return $this->copyArray($var); + } + + // Scalar + if (! is_object($var)) { + return $var; + } + + // Object + return $this->copyObject($var); + } + + /** + * Copy an array + * @param array $array + * @return array + */ + private function copyArray(array $array) + { + foreach ($array as $key => $value) { + $array[$key] = $this->recursiveCopy($value); + } + + return $array; + } + + /** + * Copies an object. + * + * @param object $object + * + * @throws CloneException + * + * @return object + */ + private function copyObject($object) + { + $objectHash = spl_object_hash($object); + + if (isset($this->hashMap[$objectHash])) { + return $this->hashMap[$objectHash]; + } + + $reflectedObject = new ReflectionObject($object); + $isCloneable = $reflectedObject->isCloneable(); + + if (false === $isCloneable) { + if ($this->skipUncloneable) { + $this->hashMap[$objectHash] = $object; + + return $object; + } + + throw new CloneException( + sprintf( + 'The class "%s" is not cloneable.', + $reflectedObject->getName() + ) + ); + } + + $newObject = clone $object; + $this->hashMap[$objectHash] = $newObject; + + if ($this->useCloneMethod && $reflectedObject->hasMethod('__clone')) { + return $newObject; + } + + if ($newObject instanceof DateTimeInterface || $newObject instanceof DateTimeZone) { + return $newObject; + } + + foreach (ReflectionHelper::getProperties($reflectedObject) as $property) { + $this->copyObjectProperty($newObject, $property); + } + + return $newObject; + } + + private function copyObjectProperty($object, ReflectionProperty $property) + { + // Ignore static properties + if ($property->isStatic()) { + return; + } + + // Apply the filters + foreach ($this->filters as $item) { + /** @var Matcher $matcher */ + $matcher = $item['matcher']; + /** @var Filter $filter */ + $filter = $item['filter']; + + if ($matcher->matches($object, $property->getName())) { + $filter->apply( + $object, + $property->getName(), + function ($object) { + return $this->recursiveCopy($object); + } + ); + + // If a filter matches, we stop processing this property + return; + } + } + + $property->setAccessible(true); + + // Ignore uninitialized properties (for PHP >7.4) + if (method_exists($property, 'isInitialized') && !$property->isInitialized($object)) { + return; + } + + $propertyValue = $property->getValue($object); + + // Copy the property + $property->setValue($object, $this->recursiveCopy($propertyValue)); + } + + /** + * Returns first filter that matches variable, `null` if no such filter found. + * + * @param array $filterRecords Associative array with 2 members: 'filter' with value of type {@see TypeFilter} and + * 'matcher' with value of type {@see TypeMatcher} + * @param mixed $var + * + * @return TypeFilter|null + */ + private function getFirstMatchedTypeFilter(array $filterRecords, $var) + { + $matched = $this->first( + $filterRecords, + function (array $record) use ($var) { + /* @var TypeMatcher $matcher */ + $matcher = $record['matcher']; + + return $matcher->matches($var); + } + ); + + return isset($matched) ? $matched['filter'] : null; + } + + /** + * Returns first element that matches predicate, `null` if no such element found. + * + * @param array $elements Array of ['filter' => Filter, 'matcher' => Matcher] pairs. + * @param callable $predicate Predicate arguments are: element. + * + * @return array|null Associative array with 2 members: 'filter' with value of type {@see TypeFilter} and 'matcher' + * with value of type {@see TypeMatcher} or `null`. + */ + private function first(array $elements, callable $predicate) + { + foreach ($elements as $element) { + if (call_user_func($predicate, $element)) { + return $element; + } + } + + return null; + } +} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php b/vendor/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php new file mode 100644 index 0000000000..c046706a27 --- /dev/null +++ b/vendor/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php @@ -0,0 +1,9 @@ +setAccessible(true); + $oldCollection = $reflectionProperty->getValue($object); + + $newCollection = $oldCollection->map( + function ($item) use ($objectCopier) { + return $objectCopier($item); + } + ); + + $reflectionProperty->setValue($object, $newCollection); + } +} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php new file mode 100644 index 0000000000..7b33fd5478 --- /dev/null +++ b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php @@ -0,0 +1,28 @@ +setAccessible(true); + + $reflectionProperty->setValue($object, new ArrayCollection()); + } +} \ No newline at end of file diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php new file mode 100644 index 0000000000..8bee8f769a --- /dev/null +++ b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php @@ -0,0 +1,22 @@ +__load(); + } +} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php new file mode 100644 index 0000000000..85ba18ce11 --- /dev/null +++ b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php @@ -0,0 +1,18 @@ +callback = $callable; + } + + /** + * Replaces the object property by the result of the callback called with the object property. + * + * {@inheritdoc} + */ + public function apply($object, $property, $objectCopier) + { + $reflectionProperty = ReflectionHelper::getProperty($object, $property); + $reflectionProperty->setAccessible(true); + + $value = call_user_func($this->callback, $reflectionProperty->getValue($object)); + + $reflectionProperty->setValue($object, $value); + } +} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php new file mode 100644 index 0000000000..bea86b8848 --- /dev/null +++ b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php @@ -0,0 +1,24 @@ +setAccessible(true); + $reflectionProperty->setValue($object, null); + } +} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php new file mode 100644 index 0000000000..ec8856f503 --- /dev/null +++ b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php @@ -0,0 +1,22 @@ +class = $class; + $this->property = $property; + } + + /** + * Matches a specific property of a specific class. + * + * {@inheritdoc} + */ + public function matches($object, $property) + { + return ($object instanceof $this->class) && $property == $this->property; + } +} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php new file mode 100644 index 0000000000..c8ec0d2bc1 --- /dev/null +++ b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php @@ -0,0 +1,32 @@ +property = $property; + } + + /** + * Matches a property by its name. + * + * {@inheritdoc} + */ + public function matches($object, $property) + { + return $property == $this->property; + } +} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php new file mode 100644 index 0000000000..a6b0c0bc52 --- /dev/null +++ b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php @@ -0,0 +1,46 @@ +propertyType = $propertyType; + } + + /** + * {@inheritdoc} + */ + public function matches($object, $property) + { + try { + $reflectionProperty = ReflectionHelper::getProperty($object, $property); + } catch (ReflectionException $exception) { + return false; + } + + $reflectionProperty->setAccessible(true); + + return $reflectionProperty->getValue($object) instanceof $this->propertyType; + } +} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php b/vendor/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php new file mode 100644 index 0000000000..742410cb2a --- /dev/null +++ b/vendor/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php @@ -0,0 +1,78 @@ +getProperties() does not return private properties from ancestor classes. + * + * @author muratyaman@gmail.com + * @see http://php.net/manual/en/reflectionclass.getproperties.php + * + * @param ReflectionClass $ref + * + * @return ReflectionProperty[] + */ + public static function getProperties(ReflectionClass $ref) + { + $props = $ref->getProperties(); + $propsArr = array(); + + foreach ($props as $prop) { + $propertyName = $prop->getName(); + $propsArr[$propertyName] = $prop; + } + + if ($parentClass = $ref->getParentClass()) { + $parentPropsArr = self::getProperties($parentClass); + foreach ($propsArr as $key => $property) { + $parentPropsArr[$key] = $property; + } + + return $parentPropsArr; + } + + return $propsArr; + } + + /** + * Retrieves property by name from object and all its ancestors. + * + * @param object|string $object + * @param string $name + * + * @throws PropertyException + * @throws ReflectionException + * + * @return ReflectionProperty + */ + public static function getProperty($object, $name) + { + $reflection = is_object($object) ? new ReflectionObject($object) : new ReflectionClass($object); + + if ($reflection->hasProperty($name)) { + return $reflection->getProperty($name); + } + + if ($parentClass = $reflection->getParentClass()) { + return self::getProperty($parentClass->getName(), $name); + } + + throw new PropertyException( + sprintf( + 'The class "%s" doesn\'t have a property with the given name: "%s".', + is_object($object) ? get_class($object) : $object, + $name + ) + ); + } +} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php new file mode 100644 index 0000000000..becd1cfffd --- /dev/null +++ b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php @@ -0,0 +1,33 @@ + $propertyValue) { + $copy->{$propertyName} = $propertyValue; + } + + return $copy; + } +} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php new file mode 100644 index 0000000000..164f8b8e26 --- /dev/null +++ b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php @@ -0,0 +1,30 @@ +callback = $callable; + } + + /** + * {@inheritdoc} + */ + public function apply($element) + { + return call_user_func($this->callback, $element); + } +} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php new file mode 100644 index 0000000000..a5fbd7a2b4 --- /dev/null +++ b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php @@ -0,0 +1,17 @@ +copier = $copier; + } + + /** + * {@inheritdoc} + */ + public function apply($arrayObject) + { + $clone = clone $arrayObject; + foreach ($arrayObject->getArrayCopy() as $k => $v) { + $clone->offsetSet($k, $this->copier->copy($v)); + } + + return $clone; + } +} + diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php new file mode 100644 index 0000000000..c5644cff86 --- /dev/null +++ b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php @@ -0,0 +1,10 @@ +copier = $copier; + } + + /** + * {@inheritdoc} + */ + public function apply($element) + { + $newElement = clone $element; + + $copy = $this->createCopyClosure(); + + return $copy($newElement); + } + + private function createCopyClosure() + { + $copier = $this->copier; + + $copy = function (SplDoublyLinkedList $list) use ($copier) { + // Replace each element in the list with a deep copy of itself + for ($i = 1; $i <= $list->count(); $i++) { + $copy = $copier->recursiveCopy($list->shift()); + + $list->push($copy); + } + + return $list; + }; + + return Closure::bind($copy, null, DeepCopy::class); + } +} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php new file mode 100644 index 0000000000..5785a7da9e --- /dev/null +++ b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php @@ -0,0 +1,13 @@ +type = $type; + } + + /** + * @param mixed $element + * + * @return boolean + */ + public function matches($element) + { + return is_object($element) ? is_a($element, $this->type) : gettype($element) === $this->type; + } +} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/deep_copy.php b/vendor/myclabs/deep-copy/src/DeepCopy/deep_copy.php new file mode 100644 index 0000000000..55dcc92617 --- /dev/null +++ b/vendor/myclabs/deep-copy/src/DeepCopy/deep_copy.php @@ -0,0 +1,20 @@ +copy($value); + } +} diff --git a/vendor/neutron/temporary-filesystem/.gitignore b/vendor/neutron/temporary-filesystem/.gitignore new file mode 100644 index 0000000000..c573005eff --- /dev/null +++ b/vendor/neutron/temporary-filesystem/.gitignore @@ -0,0 +1,5 @@ +vendor +composer.phar +composer.lock +.phpunit.result.cache +/tests/phpunit_report/ diff --git a/vendor/neutron/temporary-filesystem/.travis.yml b/vendor/neutron/temporary-filesystem/.travis.yml new file mode 100644 index 0000000000..d9de188463 --- /dev/null +++ b/vendor/neutron/temporary-filesystem/.travis.yml @@ -0,0 +1,49 @@ +language: php + +php: + - 5.6 + - 7.0 + - 7.1 + - 7.2 + - 7.3 + - 7.4 + +sudo: false + +cache: + directories: + - $HOME/.composer + +matrix: + include: + - php: 5.6 + env: COMPOSER_FLAGS="--prefer-lowest" + SYMFONY_VERSION=2.* + - php: 5.6 + env: SYMFONY_VERSION=2.3.* + - php: 5.6 + env: SYMFONY_VERSION=2.7.* + - php: 7.0 + env: SYMFONY_VERSION=2.8.*@dev + - php: 7.0 + env: SYMFONY_VERSION=3.0.* + - php: 7.0 + env: SYMFONY_VERSION=3.0.*@dev + - php: 7.1 + env: SYMFONY_VERSION=4.* + - php: 7.2 + env: SYMFONY_VERSION=5.* + - php: 7.3 + env: SYMFONY_VERSION=5.* + - php: 7.4 + env: SYMFONY_VERSION=5.* + +before_install: + - composer self-update + - if [ "COMPOSER_FLAGS" == "--prefer-lowest" ]; then composer require "roave/security-advisories" dev-master --no-update; fi; + - if [ "$SYMFONY_VERSION" != "" ]; then composer require "symfony/symfony:${SYMFONY_VERSION}" --no-update; fi; + +install: composer update --prefer-source $COMPOSER_FLAGS + +script: + - vendor/bin/simple-phpunit diff --git a/vendor/neutron/temporary-filesystem/CHANGELOG.md b/vendor/neutron/temporary-filesystem/CHANGELOG.md new file mode 100644 index 0000000000..5e14599310 --- /dev/null +++ b/vendor/neutron/temporary-filesystem/CHANGELOG.md @@ -0,0 +1,34 @@ +CHANGELOG +========= + +* 2.2.0 (2016-03-05) + * Support Symfony with all 2.x LTS versions and 3.0, add big travis matrix (@patkar) + * Update php unit to old stable (@patkar) + * Test with lowest (security release) version and php 5.3 (@patkar) + * Support PHP 5.6, 7.0, and HHVM and use docker with cache on travis (@patkar) + * Composer cleanup, ignore lock file (@patkar) + +* 2.1.1 (2013-10-10) + + * Add a factory for the Manager + +* 2.1.0 (2013-08-06) + + * Use custom IOException instead of Symfony one. + * Add a TemporaryFilesystemInterface. + * Add optional directory prefix to createTemporaryDirectory. + * Add temporary files manager. + +* 2.0.1 (2013-04-09) + + * Add TemporaryFilesystem::createTemporaryFile method + +* 2.0.0 (2013-04-08) + + * Switch from inheritance to composition design + * Add TemporaryFilesystem::create method + * Add TemporaryFilesystem::createTemporaryDirectory method + +* 1.0.0 (2012-11-02) + + * First tagged release diff --git a/vendor/neutron/temporary-filesystem/LICENSE b/vendor/neutron/temporary-filesystem/LICENSE new file mode 100644 index 0000000000..2b3c396c45 --- /dev/null +++ b/vendor/neutron/temporary-filesystem/LICENSE @@ -0,0 +1,21 @@ +TemporaryFilesystem is released with MIT License : + +Copyright (c) 2012 Alchemy + +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/neutron/temporary-filesystem/README.md b/vendor/neutron/temporary-filesystem/README.md new file mode 100644 index 0000000000..dd2f1f40cf --- /dev/null +++ b/vendor/neutron/temporary-filesystem/README.md @@ -0,0 +1,72 @@ +# TemporaryFilesystem + +TemporaryFilesystem propose an API for temprary filesystem based on [Symfony +Filesystem Component](https://github.com/symfony/filesystem). + +[![Build Status](https://travis-ci.org/romainneutron/Temporary-Filesystem.png?branch=master)](https://travis-ci.org/romainneutron/Temporary-Filesystem) + +## Usage + +```php +use Neutron\TemporaryFilesystem\TemporaryFilesystem; + +$fs = TemporaryFilesystem::create(); +``` + +## API Examples : + +### CreateTemporaryDirectory + +CreateTemporaryDirectory creates a temporary directory with an optional mode : + +```php +$tempDir = $fs->createTemporaryDirectory($mode = 0755); +``` + +### CreateTemporaryFile + +CreateTemporaryFile creates an empty files in the temporary folder: + +```php +$fs->createTemporaryFile(); + +// return an empty temporary files with a "thumb-" +// prefix, '.dcm' as suffix and 'jpg' as extension +$fs->createTemporaryFile('thumb-', '.dcm', 'jpg'); +``` + +### CreateTemporaryFiles + +CreateTemporaryFiles creates a set of empty files in the temporary folder: + +```php +// return an array of 5 path to temporary files +$fs->createTemporaryFiles(5); + +// return an array of 5 path to empty temporary files with a "thumb-" +// prefix, '.dcm' as suffix and 'jpg' as extension +$fs->createTemporaryFiles(20, 'thumb-', '.dcm', 'jpg'); +``` + +This method is useful when dealing with libraries which encode images +depending on the filename extension. + +### CreateEmptyFile + +CreateEmptyFile creates an empty file in the specified folder: + +```php +// return a path to an empty file inside the current working directory +$fs->createEmptyFile(getcwd()); + +// return a path to an empty file in the "/home/romain" directory. The file +// has "original." as prefix, ".raw" as suffix and "CR2" as extension. +$fs->createEmptyFile("/home/romain", 'original.', '.raw', 'CR2'); +``` + +This method is particularly useful when dealing with concurrent process +writing in the same directory. + +# License + +Released under the MIT license diff --git a/vendor/neutron/temporary-filesystem/composer.json b/vendor/neutron/temporary-filesystem/composer.json new file mode 100644 index 0000000000..36ff02fd74 --- /dev/null +++ b/vendor/neutron/temporary-filesystem/composer.json @@ -0,0 +1,23 @@ +{ + "name": "neutron/temporary-filesystem", + "description": "Symfony filesystem extension to handle temporary files", + "license": "MIT", + "authors": [ + { + "name": "Romain Neutron", + "email": "imprec@gmail.com" + } + ], + "require": { + "php": "^5.6 || ^7.0", + "symfony/filesystem": "^2.3 || ^3.0 || ^4.0 || ^5.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^5.0.4" + }, + "autoload": { + "psr-0": { + "Neutron": "src" + } + } +} diff --git a/vendor/neutron/temporary-filesystem/phpunit.xml.dist b/vendor/neutron/temporary-filesystem/phpunit.xml.dist new file mode 100644 index 0000000000..ddbe4be4cc --- /dev/null +++ b/vendor/neutron/temporary-filesystem/phpunit.xml.dist @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + tests + + + + + src/ + + + + diff --git a/vendor/neutron/temporary-filesystem/src/Neutron/TemporaryFilesystem/IOException.php b/vendor/neutron/temporary-filesystem/src/Neutron/TemporaryFilesystem/IOException.php new file mode 100644 index 0000000000..6ee2136b02 --- /dev/null +++ b/vendor/neutron/temporary-filesystem/src/Neutron/TemporaryFilesystem/IOException.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Neutron\TemporaryFilesystem; + +class IOException extends \RuntimeException +{ +} diff --git a/vendor/neutron/temporary-filesystem/src/Neutron/TemporaryFilesystem/Manager.php b/vendor/neutron/temporary-filesystem/src/Neutron/TemporaryFilesystem/Manager.php new file mode 100644 index 0000000000..89090ed8ac --- /dev/null +++ b/vendor/neutron/temporary-filesystem/src/Neutron/TemporaryFilesystem/Manager.php @@ -0,0 +1,156 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Neutron\TemporaryFilesystem; + +use Symfony\Component\Filesystem\Filesystem; +use Symfony\Component\Filesystem\Exception\IOException as SfIOException; + +class Manager implements TemporaryFilesystemInterface +{ + /** @var Filesystem */ + private $fs; + /** @var TemporaryFilesystem */ + private $tmpFs; + /** @var array */ + private $files = array(); + + const DEFAULT_SCOPE = '_tmp_fs_'; + + public function __construct(TemporaryFilesystemInterface $tmpFs, Filesystem $fs) + { + $this->fs = $fs; + $this->tmpFs = $tmpFs; + + register_shutdown_function(array($this, 'clean'), null, false); + } + + /** + * {@inheritdoc} + */ + public function createEmptyFile($basePath, $prefix = self::DEFAULT_SCOPE, $suffix = null, $extension = null, $maxTry = 65536) + { + $file = $this->tmpFs->createEmptyFile($basePath, $prefix, $suffix, $extension, $maxTry); + $this->add($file, $prefix); + + return $file; + } + + /** + * {@inheritdoc} + */ + public function createTemporaryDirectory($mode = 0777, $maxTry = 65536, $prefix = self::DEFAULT_SCOPE) + { + $dir = $this->tmpFs->createTemporaryDirectory($mode, $maxTry, $prefix); + $this->add($dir, $prefix); + + return $dir; + } + + /** + * {@inheritdoc} + */ + public function createTemporaryFile($prefix = self::DEFAULT_SCOPE, $suffix = null, $extension = null, $maxTry = 65536) + { + $file = $this->tmpFs->createTemporaryFile($prefix, $suffix, $extension, $maxTry); + $this->add($file, $prefix); + + return $file; + } + + /** + * {@inheritdoc} + */ + public function createTemporaryFiles($quantity = 1, $prefix = self::DEFAULT_SCOPE, $suffix = null, $extension = null, $maxTry = 65536) + { + $files = $this->tmpFs->createTemporaryFiles($quantity, $prefix, $suffix, $extension, $maxTry); + $this->add($files, $prefix); + + return $files; + } + + /** + * Adds file to be handled by the manager. + * + * @param string|array $files + * @param string $scope + * + * @return Manager + */ + public function add($files, $scope = self::DEFAULT_SCOPE) + { + if (!is_array($files)) { + $files = array($files); + } + if ('' === trim($scope)) { + $scope = self::DEFAULT_SCOPE; + } + if (!isset($this->files[$scope])) { + $this->files[$scope] = array(); + } + + $this->files[$scope] = array_merge($this->files[$scope], $files); + + return $this; + } + + /** + * Removes all managed files in a scope. If no scope provided, all scopes + * are cleared. + * + * @param string $scope + * + * @return Manager + * + * @throws IOException + */ + public function clean($scope = null, $throwException = true) + { + if (null !== $scope) { + $this->cleanScope($scope, $throwException); + } else { + foreach ($this->files as $scope => $files) { + $this->cleanScope($scope, $throwException); + } + } + + return $this; + } + + /** + * Factory for the Manager + * + * @return Manager + */ + public static function create() + { + $fs = new Filesystem(); + + return new static(new TemporaryFilesystem($fs), $fs); + } + + private function cleanScope($scope, $throwException) + { + if (!isset($this->files[$scope])) { + return; + } + + try { + $this->fs->remove($this->files[$scope]); + unset($this->files[$scope]); + } catch (SfIOException $e) { + unset($this->files[$scope]); + if ($throwException) { + throw new IOException('Unable to remove all the files', $e->getCode(), $e); + } + } + } +} diff --git a/vendor/neutron/temporary-filesystem/src/Neutron/TemporaryFilesystem/TemporaryFilesystem.php b/vendor/neutron/temporary-filesystem/src/Neutron/TemporaryFilesystem/TemporaryFilesystem.php new file mode 100644 index 0000000000..553c05e2b6 --- /dev/null +++ b/vendor/neutron/temporary-filesystem/src/Neutron/TemporaryFilesystem/TemporaryFilesystem.php @@ -0,0 +1,132 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Neutron\TemporaryFilesystem; + +use Symfony\Component\Filesystem\Filesystem; +use Symfony\Component\Filesystem\Exception\IOException as SfIOException; + +class TemporaryFilesystem implements TemporaryFilesystemInterface +{ + /** @var Filesystem */ + private $filesystem; + + public function __construct(Filesystem $filesystem) + { + $this->filesystem = $filesystem; + } + + /** + * {@inheritdoc} + */ + public function createTemporaryDirectory($mode = 0777, $maxTry = 65536, $prefix = null) + { + $basePath = sys_get_temp_dir(); + // Remove trailing slashes if present + $basePath = rtrim($basePath, DIRECTORY_SEPARATOR); + + while ($maxTry > 0) { + $dir = $basePath . DIRECTORY_SEPARATOR + . $prefix . base_convert(mt_rand(0x19A100, 0x39AA3FF), 10, 36); + + if (false === file_exists($dir)) { + try { + $this->filesystem->mkdir($dir, $mode); + } catch (SfIOException $e) { + throw new IOException('Unable to make directory', $e->getCode(), $e); + } + + return $dir; + } + + $maxTry --; + } + + throw new IOException('Unable to generate a temporary directory'); + } + + /** + * {@inheritdoc} + */ + public function createTemporaryFiles($quantity = 1, $prefix = null, $suffix = null, $extension = null, $maxTry = 65536) + { + if ($quantity < 1) { + throw new \InvalidArgumentException('Invalid temporary files quantity'); + } + + $files = array(); + + while ($quantity > 0) { + $files[] = $this->createEmptyFile(sys_get_temp_dir(), $prefix, $suffix, $extension, $maxTry); + $quantity --; + } + + return $files; + } + + /** + * {@inheritdoc} + */ + public function createTemporaryFile($prefix = null, $suffix = null, $extension = null, $maxTry = 65536) + { + $files = $this->createTemporaryFiles(1, $prefix, $suffix, $extension, $maxTry); + + return array_pop($files); + } + + /** + * {@inheritdoc} + */ + public function createEmptyFile($basePath, $prefix = null, $suffix = null, $extension = null, $maxTry = 65536) + { + if (false === is_dir($basePath) || false === is_writeable($basePath)) { + throw new IOException(sprintf('`%s` should be a writeable directory', $basePath)); + } + + if ($suffix === null && $extension === null) { + if (false === $file = @tempnam($basePath, $prefix)) { + throw new IOException('Unable to generate a temporary filename'); + } + + return $file; + } + + while ($maxTry > 0) { + $file = $basePath . DIRECTORY_SEPARATOR + . $prefix . base_convert(mt_rand(0x19A100, 0x39AA3FF), 10, 36) . $suffix + . ( $extension ? '.' . $extension : ''); + + if (false === file_exists($file)) { + try { + $this->filesystem->touch($file); + } catch (SfIOException $e) { + throw new IOException('Unable to touch file', $e->getCode(), $e); + } + + return $file; + } + + $maxTry --; + } + + throw new IOException('Unable to generate a temporary filename'); + } + + /** + * Creates a TemporaryFilesystem + * + * @return TemporaryFilesystem + */ + public static function create() + { + return new static(new Filesystem()); + } +} diff --git a/vendor/neutron/temporary-filesystem/src/Neutron/TemporaryFilesystem/TemporaryFilesystemInterface.php b/vendor/neutron/temporary-filesystem/src/Neutron/TemporaryFilesystem/TemporaryFilesystemInterface.php new file mode 100644 index 0000000000..973301e8a9 --- /dev/null +++ b/vendor/neutron/temporary-filesystem/src/Neutron/TemporaryFilesystem/TemporaryFilesystemInterface.php @@ -0,0 +1,84 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Neutron\TemporaryFilesystem; + +interface TemporaryFilesystemInterface +{ + /** + * Creates a temporary directory. + * + * @param octal $mode The directory mode + * @param integer $maxTry The maximum number of trials + * @param string $prefix The directory prefix + * + * @return string The name of the created directory + * + * @throws IOException In case the directory could not be created + */ + public function createTemporaryDirectory($mode = 0777, $maxTry = 65536, $prefix = null); + + /** + * Creates an array of temporary files. + * + * Temporary files are created inside the system temporary folder. You must + * removed them manually at the end of use. + * + * @param integer $quantity The quantity of temporary files requested + * @param string $prefix The prefix of the files + * @param string $suffix The suffix of the files + * @param string $extension The extension of the files + * @param integer $maxTry The maximum number of trials to create one temporary file + * + * @return array An array of filenames + * + * @throws \InvalidArgumentException In case you provide a wrong argument + * @throws IOException In case of failure + */ + public function createTemporaryFiles($quantity = 1, $prefix = null, $suffix = null, $extension = null, $maxTry = 65536); + + /** + * Creates a temporary file. + * + * Temporary files are created inside the system temporary folder. You must + * removed them manually at the end of use. + * + * @param string $prefix The prefix of the files + * @param string $suffix The suffix of the files + * @param string $extension The extension of the files + * @param integer $maxTry The maximum number of trials to create one temporary file + * + * @return array An array of filenames + * + * @throws \InvalidArgumentException In case you provide a wrong argument + * @throws IOException In case of failure + */ + public function createTemporaryFile($prefix = null, $suffix = null, $extension = null, $maxTry = 65536); + + /** + * Create an empty file in the specified directory. + * + * The new file is created in the requested directory and will fit the + * the given parameters. Please note that the filename contains some + * random caracters. + * + * @param string $basePath The directory where to create the file + * @param string $prefix The prefix of the file + * @param string $suffix The suffix of the file + * @param string $extension The extension of the file + * @param integer $maxTry The maximum number of trials to create the file + * + * @return string The path of the created file + * + * @throws IOException in case of failure + */ + public function createEmptyFile($basePath, $prefix = null, $suffix = null, $extension = null, $maxTry = 65536); +} diff --git a/vendor/neutron/temporary-filesystem/tests/Neutron/TemporaryFilesystem/Tests/ManagerTest.php b/vendor/neutron/temporary-filesystem/tests/Neutron/TemporaryFilesystem/Tests/ManagerTest.php new file mode 100644 index 0000000000..a3f8ab8a6a --- /dev/null +++ b/vendor/neutron/temporary-filesystem/tests/Neutron/TemporaryFilesystem/Tests/ManagerTest.php @@ -0,0 +1,302 @@ +createFsMock(); + $fs->expects($this->once()) + ->method('remove') + ->with(array('/path/to/empty/file')); + + $tmpFs = $this->createTmpFsMock(); + $tmpFs->expects($this->once()) + ->method('createEmptyFile') + ->with($basePath, $prefix, $suffix, $extension, $maxTry) + ->will($this->returnValue('/path/to/empty/file')); + + $manager = new Manager($tmpFs, $fs); + $this->assertEquals('/path/to/empty/file', $manager->createEmptyFile($basePath, $prefix, $suffix, $extension, $maxTry)); + $manager->clean($prefix); + } + + public function testCreateEmptyFileAndCleanOtherScope() + { + $basePath = 'basePath'; + $prefix = 'prefix'; + $suffix = 'suffix'; + $extension = 'extension'; + $maxTry = 'maxtry'; + + $fs = $this->createFsMock(); + $fs->expects($this->never()) + ->method('remove'); + + $tmpFs = $this->createTmpFsMock(); + $tmpFs->expects($this->once()) + ->method('createEmptyFile') + ->with($basePath, $prefix, $suffix, $extension, $maxTry) + ->will($this->returnValue('/path/to/empty/file')); + + $manager = new Manager($tmpFs, $fs); + $this->assertEquals('/path/to/empty/file', $manager->createEmptyFile($basePath, $prefix, $suffix, $extension, $maxTry)); + $manager->clean('other prefix'); + } + + public function testCreateEmptyFileAndCleanScopes() + { + $basePath = 'basePath'; + $prefix = 'prefix'; + $suffix = 'suffix'; + $extension = 'extension'; + $maxTry = 'maxtry'; + + $fs = $this->createFsMock(); + $fs->expects($this->once()) + ->method('remove') + ->with(array('/path/to/empty/file')); + + $tmpFs = $this->createTmpFsMock(); + $tmpFs->expects($this->once()) + ->method('createEmptyFile') + ->with($basePath, $prefix, $suffix, $extension, $maxTry) + ->will($this->returnValue('/path/to/empty/file')); + + $manager = new Manager($tmpFs, $fs); + $this->assertEquals('/path/to/empty/file', $manager->createEmptyFile($basePath, $prefix, $suffix, $extension, $maxTry)); + $manager->clean(); + } + + public function testCreateTemporaryDirectoryAndCleanScope() + { + $mode = 'mode'; + $prefix = 'prefix'; + $maxTry = 'maxtry'; + + $fs = $this->createFsMock(); + $fs->expects($this->once()) + ->method('remove') + ->with(array('/path/to/dir')); + + $tmpFs = $this->createTmpFsMock(); + $tmpFs->expects($this->once()) + ->method('createTemporaryDirectory') + ->with($mode, $maxTry, $prefix) + ->will($this->returnValue('/path/to/dir')); + + $manager = new Manager($tmpFs, $fs); + $this->assertEquals('/path/to/dir', $manager->createTemporaryDirectory($mode, $maxTry, $prefix)); + $manager->clean($prefix); + } + + public function testCreateTemporaryDirectoryAndCleanOtherScope() + { + $mode = 'mode'; + $prefix = 'prefix'; + $maxTry = 'maxtry'; + + $fs = $this->createFsMock(); + $fs->expects($this->never()) + ->method('remove'); + + $tmpFs = $this->createTmpFsMock(); + $tmpFs->expects($this->once()) + ->method('createTemporaryDirectory') + ->with($mode, $maxTry, $prefix) + ->will($this->returnValue('/path/to/dir')); + + $manager = new Manager($tmpFs, $fs); + $this->assertEquals('/path/to/dir', $manager->createTemporaryDirectory($mode, $maxTry, $prefix)); + $manager->clean('other prefix'); + } + + public function testCreateTemporaryDirectoryAndCleanScopes() + { + $mode = 'mode'; + $prefix = 'prefix'; + $maxTry = 'maxtry'; + + $fs = $this->createFsMock(); + $fs->expects($this->once()) + ->method('remove') + ->with(array('/path/to/dir')); + + $tmpFs = $this->createTmpFsMock(); + $tmpFs->expects($this->once()) + ->method('createTemporaryDirectory') + ->with($mode, $maxTry, $prefix) + ->will($this->returnValue('/path/to/dir')); + + $manager = new Manager($tmpFs, $fs); + $this->assertEquals('/path/to/dir', $manager->createTemporaryDirectory($mode, $maxTry, $prefix)); + $manager->clean(); + } + + public function testCreateTemporaryFileAndCleanScope() + { + $prefix = 'prefix'; + $suffix = 'suffix'; + $extension = 'extension'; + $maxTry = 'maxtry'; + + $fs = $this->createFsMock(); + $fs->expects($this->once()) + ->method('remove') + ->with(array('/path/to/file')); + + $tmpFs = $this->createTmpFsMock(); + $tmpFs->expects($this->once()) + ->method('createTemporaryFile') + ->with($prefix, $suffix, $extension, $maxTry) + ->will($this->returnValue('/path/to/file')); + + $manager = new Manager($tmpFs, $fs); + $this->assertEquals('/path/to/file', $manager->createTemporaryFile($prefix, $suffix, $extension, $maxTry)); + $manager->clean($prefix); + } + + public function testCreateTemporaryFileAndCleanOtherScope() + { + $prefix = 'prefix'; + $suffix = 'suffix'; + $extension = 'extension'; + $maxTry = 'maxtry'; + + $fs = $this->createFsMock(); + $fs->expects($this->never()) + ->method('remove'); + + $tmpFs = $this->createTmpFsMock(); + $tmpFs->expects($this->once()) + ->method('createTemporaryFile') + ->with($prefix, $suffix, $extension, $maxTry) + ->will($this->returnValue('/path/to/file')); + + $manager = new Manager($tmpFs, $fs); + $this->assertEquals('/path/to/file', $manager->createTemporaryFile($prefix, $suffix, $extension, $maxTry)); + $manager->clean('other prefix'); + } + + public function testCreateTemporaryFileAndCleanScopes() + { + $prefix = 'prefix'; + $suffix = 'suffix'; + $extension = 'extension'; + $maxTry = 'maxtry'; + + $fs = $this->createFsMock(); + $fs->expects($this->once()) + ->method('remove') + ->with(array('/path/to/file')); + + $tmpFs = $this->createTmpFsMock(); + $tmpFs->expects($this->once()) + ->method('createTemporaryFile') + ->with($prefix, $suffix, $extension, $maxTry) + ->will($this->returnValue('/path/to/file')); + + $manager = new Manager($tmpFs, $fs); + $this->assertEquals('/path/to/file', $manager->createTemporaryFile($prefix, $suffix, $extension, $maxTry)); + $manager->clean(); + } + + public function testCreateTemporaryFilesAndCleanScope() + { + $prefix = 'prefix'; + $suffix = 'suffix'; + $extension = 'extension'; + $maxTry = 'maxtry'; + $quantity = 123; + + $fs = $this->createFsMock(); + $fs->expects($this->once()) + ->method('remove') + ->with(array('/path/to/file')); + + $tmpFs = $this->createTmpFsMock(); + $tmpFs->expects($this->once()) + ->method('createTemporaryFiles') + ->with($quantity, $prefix, $suffix, $extension, $maxTry) + ->will($this->returnValue(array('/path/to/file'))); + + $manager = new Manager($tmpFs, $fs); + $this->assertEquals(array('/path/to/file'), $manager->createTemporaryFiles($quantity, $prefix, $suffix, $extension, $maxTry)); + $manager->clean($prefix); + } + + public function testCreateTemporaryFilesAndCleanOtherScope() + { + $prefix = 'prefix'; + $suffix = 'suffix'; + $extension = 'extension'; + $maxTry = 'maxtry'; + $quantity = 123; + + $fs = $this->createFsMock(); + $fs->expects($this->never()) + ->method('remove'); + + $tmpFs = $this->createTmpFsMock(); + $tmpFs->expects($this->once()) + ->method('createTemporaryFiles') + ->with($quantity, $prefix, $suffix, $extension, $maxTry) + ->will($this->returnValue(array('/path/to/file'))); + + $manager = new Manager($tmpFs, $fs); + $this->assertEquals(array('/path/to/file'), $manager->createTemporaryFiles($quantity, $prefix, $suffix, $extension, $maxTry)); + $manager->clean('other prefix'); + } + + public function testCreateTemporaryFilesAndCleanScopes() + { + $prefix = 'prefix'; + $suffix = 'suffix'; + $extension = 'extension'; + $maxTry = 'maxtry'; + $quantity = 123; + + $fs = $this->createFsMock(); + $fs->expects($this->once()) + ->method('remove') + ->with(array('/path/to/file')); + + $tmpFs = $this->createTmpFsMock(); + $tmpFs->expects($this->once()) + ->method('createTemporaryFiles') + ->with($quantity, $prefix, $suffix, $extension, $maxTry) + ->will($this->returnValue(array('/path/to/file'))); + + $manager = new Manager($tmpFs, $fs); + $this->assertEquals(array('/path/to/file'), $manager->createTemporaryFiles($quantity, $prefix, $suffix, $extension, $maxTry)); + $manager->clean(); + } + + public function testCreate() + { + $this->assertInstanceOf('Neutron\TemporaryFilesystem\Manager', Manager::create()); + } + + private function createTmpFsMock() + { + return $this->getMockBuilder('Neutron\TemporaryFilesystem\TemporaryFilesystemInterface')->getMock(); + } + + private function createFsMock() + { + return $this + ->getMockBuilder('Symfony\Component\Filesystem\Filesystem') + ->disableOriginalConstructor() + ->getMock(); + } +} diff --git a/vendor/neutron/temporary-filesystem/tests/Neutron/TemporaryFilesystem/Tests/TemporaryFilesystemTest.php b/vendor/neutron/temporary-filesystem/tests/Neutron/TemporaryFilesystem/Tests/TemporaryFilesystemTest.php new file mode 100644 index 0000000000..564568f0d6 --- /dev/null +++ b/vendor/neutron/temporary-filesystem/tests/Neutron/TemporaryFilesystem/Tests/TemporaryFilesystemTest.php @@ -0,0 +1,201 @@ +workspace = sys_get_temp_dir().DIRECTORY_SEPARATOR.time().rand(0, 1000); + mkdir($this->workspace, 0777, true); + $this->workspace = realpath($this->workspace); + $this->filesystem = TemporaryFilesystem::create(); + } + + public function tearDown() + { + $this->clean($this->workspace); + } + + public function testCreate() + { + $this->assertInstanceOf('Neutron\TemporaryFilesystem\TemporaryFilesystem', TemporaryFilesystem::create()); + } + + public function testConctruct() + { + $this->assertInstanceOf('Neutron\TemporaryFilesystem\TemporaryFilesystem', new TemporaryFilesystem(new Filesystem())); + } + + /** + * @param string $file + */ + private function clean($file) + { + if (is_dir($file) && !is_link($file)) { + $dir = new \FilesystemIterator($file); + foreach ($dir as $childFile) { + $this->clean($childFile); + } + + rmdir($file); + } else { + unlink($file); + } + } + + /** + * @dataProvider provideFilesToCreate + */ + public function testCreateEmptyFile($prefix, $suffix, $extension, $maxTry, $pattern) + { + $createDir = $this->workspace . DIRECTORY_SEPARATOR . 'book-dir'; + mkdir($createDir); + + $file = $this->filesystem->createEmptyFile($createDir, $prefix, $suffix, $extension, $maxTry); + $this->assertTrue(file_exists($file)); + $this->assertEquals($createDir, dirname($file)); + $this->assertEquals(0, filesize($file)); + $this->assertRegExp($pattern, basename($file)); + unlink($file); + } + + public function testCreateTemporaryDir() + { + $dir = $this->filesystem->createTemporaryDirectory(); + $this->assertTrue(file_exists($dir)); + $this->assertTrue(is_dir($dir)); + rmdir($dir); + } + + public function testCreateTemporaryDirWithPrefix() + { + $dir = $this->filesystem->createTemporaryDirectory(0777, 200, 'neutron'); + $this->assertTrue(file_exists($dir)); + $this->assertTrue(is_dir($dir)); + $this->assertStringContainsString('neutron', $dir); + rmdir($dir); + } + + public function provideFilesToCreate() + { + return array( + array(null, null, null, 10, '/\w{5}/'), + array('romain', null, null, 10, '/romain\w{5}/'), + array(null, 'neutron', null, 10, '/\w{5}neutron/'), + array(null, null, 'io', 10, '/\w{5}\.io/'), + array('romain', null, 'io', 10, '/romain\w{5}\.io/'), + array(null, 'neutron', 'io', 10, '/\w{5}neutron\.io/'), + array('romain', 'neutron', 'io', 10, '/romain\w{5}neutron\.io/'), + ); + } + + public function testCreateEmptyFileInvalidDir() + { + $this->expectException(IOException::class); + + $createDir = $this->workspace . DIRECTORY_SEPARATOR . 'invalid-book-dir'; + + $this->filesystem->createEmptyFile($createDir); + } + + public function testCreateEmptyFileInvalidDirSecondMethod() + { + $this->expectException(IOException::class); + + $createDir = $this->workspace . DIRECTORY_SEPARATOR . 'invalid-book-dir'; + + $this->filesystem->createEmptyFile($createDir, 'romain', 'neutron'); + } + + public function testCreateEmptyFileFails() + { + $this->expectException(IOException::class); + + $createDir = $this->workspace . DIRECTORY_SEPARATOR . 'book-dir'; + mkdir($createDir); + + $this->filesystem->createEmptyFile($createDir, 'romain', 'neutron', null, 0); + } + + public function testCreateEmptyFileOnFile() + { + $this->expectException(IOException::class); + + $createDir = $this->workspace . DIRECTORY_SEPARATOR . 'book-dir'; + touch($createDir); + + $this->filesystem->createEmptyFile($createDir, null, null, null); + } + + public function testCreateEmptyFileOnFileSecondMethod() + { + $this->expectException(IOException::class); + + $createDir = $this->workspace . DIRECTORY_SEPARATOR . 'book-dir'; + touch($createDir); + + $this->filesystem->createEmptyFile($createDir, 'romain', 'neutron', 'io'); + } + + /** + * @dataProvider provideFilesToCreate + */ + public function testTemporaryFiles($prefix, $suffix, $extension, $maxTry, $pattern) + { + $files = $this->filesystem->createTemporaryFiles(3, $prefix, $suffix, $extension, $maxTry); + $this->assertEquals(3, count($files)); + + foreach ($files as $file) { + $this->assertTrue(file_exists($file)); + $this->assertEquals(realpath(sys_get_temp_dir()), realpath(dirname($file))); + $this->assertEquals(0, filesize($file)); + $this->assertRegExp($pattern, basename($file)); + } + } + + /** + * @dataProvider provideFilesToCreate + */ + public function testTemporaryFile($prefix, $suffix, $extension, $maxTry, $pattern) + { + $file = $this->filesystem->createTemporaryFile($prefix, $suffix, $extension, $maxTry); + $this->assertIsString($file); + + $this->assertTrue(file_exists($file)); + $this->assertEquals(realpath(sys_get_temp_dir()), realpath(dirname($file))); + $this->assertEquals(0, filesize($file)); + $this->assertRegExp($pattern, basename($file)); + } + + public function testTemporaryFilesFails() + { + $this->expectException(IOException::class); + + $this->filesystem->createTemporaryFiles(3, 'prefix', 'suffix', null, 0); + } + + public function testTemporaryFilesInvalidQuantity() + { + $this->expectException(\InvalidArgumentException::class); + + $this->filesystem->createTemporaryFiles(0); + } +} diff --git a/vendor/neutron/temporary-filesystem/tests/bootstrap.php b/vendor/neutron/temporary-filesystem/tests/bootstrap.php new file mode 100644 index 0000000000..95b5803809 --- /dev/null +++ b/vendor/neutron/temporary-filesystem/tests/bootstrap.php @@ -0,0 +1,4 @@ +add('Neutron\TemporaryFilesystem\Tests', __DIR__ . '/../tests'); diff --git a/vendor/nikic/php-parser/.travis.yml b/vendor/nikic/php-parser/.travis.yml new file mode 100644 index 0000000000..445913ffe1 --- /dev/null +++ b/vendor/nikic/php-parser/.travis.yml @@ -0,0 +1,14 @@ +language: php + +php: + - 5.3 + - 5.4 + - 5.5 + - 5.6 + - 7.0 + - hhvm + +matrix: + allow_failures: + - php: 7.0 + fast_finish: true diff --git a/vendor/nikic/php-parser/CHANGELOG.md b/vendor/nikic/php-parser/CHANGELOG.md new file mode 100644 index 0000000000..75605cc967 --- /dev/null +++ b/vendor/nikic/php-parser/CHANGELOG.md @@ -0,0 +1,253 @@ +Version 1.4.2-dev +----------------- + +Nothing yet. + +Version 1.4.1 (2015-09-19) +-------------------------- + +### Fixed + +* Fixed issue with too many newlines being stripped at the end of heredoc/nowdoc strings in some + cases. (#227) + +Version 1.4.0 (2015-07-14) +-------------------------- + +### Added + +* Added interface `PhpParser\Node\FunctionLike`, which is implemented by `Stmt\ClassMethod`, + `Stmt\Function_` and `Expr\Closure` nodes. This interface provides getters for their common + subnodes. +* Added `Node\Stmt\ClassLike::getMethod()` to look up a specific method on a class/interface/trait. + +### Fixed + +* Fixed `isPublic()` return value for implicitly public properties and methods that define and + additional modifier like `static` or `abstract`. +* Properties are now accepted by the trait builder. +* Fixed `__HALT_COMPILER_OFFSET__` support on HHVM. + +Version 1.3.0 (2015-05-02) +-------------------------- + +### Added + +* Errors can now store the attributes of the node/token where the error occurred. Previously only the start line was + stored. +* If file positions are enabled in the lexer, errors can now provide column information if it is available. See + [documentation](https://github.com/nikic/PHP-Parser/blob/master/doc/component/Error.markdown#column-information). +* The parser now provides an experimental error recovery mode, which can be enabled by disabling the `throwOnError` + parser option. In this mode the parser will try to construct a partial AST even if the code is not valid PHP. See + [documentation](https://github.com/nikic/PHP-Parser/blob/master/doc/component/Error.markdown#error-recovery). +* Added support for PHP 7 `yield from` expression. It is represented by `Expr\YieldFrom`. +* Added support for PHP 7 anonymous classes. These are represented by ordinary `Stmt\Class_` nodes with the name set to + `null`. Furthermore this implies that `Expr\New_` can now contain a `Stmt\Class_` in its `class` subnode. + +### Fixed + +* Fixed registration of PHP 7 aliases, for the case where the old name was used before the new name. +* Fixed handling of precedence when pretty-printing `print` expressions. +* Floating point numbers are now pretty-printed with a higher precision. +* Checks for special class names like `self` are now case-insensitive. + +Version 1.2.2 (2015-04-03) +-------------------------- + +* The `NameResolver` now resolves parameter type hints when entering the function/method/closure node. As such other + visitors running after it will be able to make use of the resolved names at that point already. +* The autoloader no longer sets the `unserialize_callback_func` ini option on registration - this is not necessary and + may cause issues when running PhpUnit tests with process isolation. + +Version 1.2.1 (2015-03-24) +-------------------------- + +* Fixed registration of the aliases introduced in 1.2.0. Previously the old class names could not be used in + `instanceof` checks under some circumstances. + +Version 1.2.0 (2015-03-22) +-------------------------- + +### Changed + +* To ensure compatibility with PHP 7, the following node classes have been renamed: + + OLD => NEW + PhpParser\Node\Expr\Cast\Bool => PhpParser\Node\Expr\Cast\Bool_ + PhpParser\Node\Expr\Cast\Int => PhpParser\Node\Expr\Cast\Int_ + PhpParser\Node\Expr\Cast\Object => PhpParser\Node\Expr\Cast\Object_ + PhpParser\Node\Expr\Cast\String => PhpParser\Node\Expr\Cast\String_ + PhpParser\Node\Scalar\String => PhpParser\Node\Scalar\String_ + + **The previous class names are still supported as aliases.** However it is strongly encouraged to use the new names + in order to make your code compatible with PHP 7. + +* Subnodes are now stored using real properties instead of an array. This improves performance and memory usage of the + initial parse and subsequent node tree operations. The `NodeAbstract` class still supports the old way of specifying + subnodes, however this is *deprecated*. In any case properties that are assigned to a node after creation will no + longer be considered as subnodes. + +* Methods and property declarations will no longer set the `Stmt\Class_::MODIFIER_PUBLIC` flag if no visibility is + explicitly given. However the `isPublic()` method will continue to return true. This allows you to distinguish whether + a method/property is explicitly or implicitly public and control the pretty printer output more precisely. + +* The `Stmt\Class_`, `Stmt\Interface_` and `Stmt\Trait_` nodes now inherit from `Stmt\ClassLike`, which provides a + `getMethods()` method. Previously this method was only available on `Stmt\Class_`. + +* Support including the `bootstrap.php` file multiple times. + +* Make documentation and tests part of the release tarball again. + +* Improve support for HHVM and PHP 7. + +### Added + +* Added support for PHP 7 return type declarations. This adds an additional `returnType` subnode to `Stmt\Function_`, + `Stmt\ClassMethod` and `Expr\Closure`. + +* Added support for the PHP 7 null coalesce operator `??`. The operator is represented by `Expr\BinaryOp\Coalesce`. + +* Added support for the PHP 7 spaceship operator `<=>`. The operator is represented by `Expr\BinaryOp\Spaceship`. + +* Added use builder. + +* Added global namespace support to the namespace builder. + +* Added a constructor flag to `NodeTraverser`, which disables cloning of nodes. + +Version 1.1.0 (2015-01-18) +-------------------------- + +* Methods that do not specify an explicit visibility (e.g. `function method()`) will now have the `MODIFIER_PUBLIC` + flag set. This also means that their `isPublic()` method will return true. + +* Declaring a property as abstract or final is now an error. + +* The `Lexer` and `Lexer\Emulative` classes now accept an `$options` array in their constructors. Currently only the + `usedAttributes` option is supported, which determines which attributes will be added to AST nodes. In particular + it is now possible to add information on the token and file positions corresponding to a node. For more details see + the [Lexer component](https://github.com/nikic/PHP-Parser/blob/master/doc/component/Lexer.markdown) documentation. + +* Node visitors can now return `NodeTraverser::DONT_TRAVERSE_CHILDREN` from `enterNode()` in order to skip all children + of the current node, for all visitors. + +* Added builders for traits and namespaces. + +* The class, interface, trait, function, method and property builders now support adding doc comments using the + `setDocComment()` method. + +* Added support for fully-qualified and namespace-relative names in builders. No longer allow use of name component + arrays. + +* Do not add documentation and tests to distribution archive files. + +Version 1.0.2 (2014-11-04) +-------------------------- + +* The `NameResolver` visitor now also resolves names in trait adaptations (aliases and precedence declarations). + +* Remove stray whitespace when pretty-printing trait adaptations that only change visibility. + +Version 1.0.1 (2014-10-14) +-------------------------- + +* Disallow `new` expressions without a class name. Previously `new;` was accidentally considered to be valid code. + +* Support T_ONUMBER token used by HHVM. + +* Add ability to directly pass code to the `php-parse.php` script. + +* Prevent truncation of `var_dump()` output in the `php-parse.php` script if XDebug is used. + +Version 1.0.0 (2014-09-12) +-------------------------- + +* [BC] Removed deprecated `Template` and `TemplateLoader` classes. + +* Fixed XML unserializer to properly work with new namespaced node names. + +Version 1.0.0-beta2 (2014-08-31) +-------------------------------- + +* [PHP 5.6] Updated support for constant scalar expressions to comply with latest changes. This means that arrays + and array dimension fetches are now supported as well. + +* [PHP 5.6] Direct array dereferencing of constants is supported now, i.e. both `FOO[0]` and `Foo::BAR[0]` are valid + now. + +* Fixed handling of special class names (`self`, `parent` and `static`) in the name resolver to be case insensitive. + Additionally the name resolver now enforces that special class names are only used as unqualified names, e.g. `\self` + is considered invalid. + +* The case of references to the `static` class name is now preserved. Previously `static` was always lowercased, + regardless of the case used in the source code. + +* The autoloader now only requires a file if it exists. This allows usages like + `class_exists('PhpParser\NotExistingClass')`. + +* Added experimental `bin/php-parse.php` script, which is intended to help exploring and debugging the node tree. + +* Separated the parser implemention (in `lib/PhpParser/ParserAbstract.php`) and the generated data (in + `lib/PhpParser/Parser.php`). Furthermore the parser now uses meaningful variable names and contains comments + explaining their usage. + +Version 1.0.0-beta1 (2014-03-27) +-------------------------------- + +* [BC] PHP-Parser now requires PHP 5.3 or newer to run. It is however still possible to *parse* PHP 5.2 source code, + while running on a newer version. + +* [BC] The library has been moved to use namespaces with the `PhpParser` vendor prefix. However, the old names using + underscores are still available as aliases, as such most code should continue running on the new version without + further changes. + + However, code performing dispatch operations on `Node::getType()` may be affected by some of the name changes. For + example a `+` node will now return type `Expr_BinaryOp_Plus` instead of `Expr_Plus`. In particular this may affect + custom pretty printers. + + Due to conflicts with reserved keywords, some class names now end with an underscore, e.g. `PHPParser_Node_Stmt_Class` + is now `PhpParser\Node\Stmt\Class_`. (But as usual, the old name is still available) + +* [PHP 5.6] Added support for the power operator `**` (node `Expr\BinaryOp\Pow`) and the compound power assignment + operator `**=` (node `Expr\AssignOp\Pow`). + +* [PHP 5.6] Added support for variadic functions: `Param` nodes now have `variadic` as a boolean subnode. + +* [PHP 5.6] Added support for argument unpacking: `Arg` nodes now have `unpack` as a boolean subnode. + +* [PHP 5.6] Added support for aliasing of functions and constants. `Stmt\Use_` nodes now have an integral `type` + subnode, which is one of `Stmt\Use_::TYPE_NORMAL` (`use`), `Stmt\Use_::TYPE_FUNCTION` (`use function`) or + `Stmt\Use_::TYPE_CONSTANT` (`use const`). + + The `NameResolver` now also supports resolution of such aliases. + +* [PHP 5.6] Added support for constant scalar expressions. This means that certain expressions are now allowed as the + initializer for constants, properties, parameters, static variables, etc. + +* [BC] Improved pretty printing of empty statements lists, which are now printed as `{\n}` instead of `{\n \n}`. + This changes the behavior of the protected `PrettyPrinterAbstract::pStmts()` method, so custom pretty printing code + making use it of may need to be adjusted. + +* Changed the order of some subnodes to be consistent with their order in the sour code. For example `Stmt\If->cond` + will now appear before `Stmt\If->stmts` etc. + +* Added `Scalar\MagicConstant->getName()`, which returns the name of the magic constant (e.g. `__CLASS__`). + +**The following changes are also included in 0.9.5**: + +* [BC] Deprecated `PHPParser_Template` and `PHPParser_TemplateLoader`. This functionality does not belong in the main project + and - as far as I know - nobody is using it. + +* Add `NodeTraverser::removeVisitor()` method, which removes a visitor from the node traverser. This also modifies the + corresponding `NodeTraverserInterface`. + +* Fix alias resolution in `NameResolver`: Class names are now correctly handled as case-insensitive. + +* The undefined variable error, which is used to the lexer to reset the error state, will no longer interfere with + custom error handlers. + +--- + +**This changelog only includes changes from the 1.0 series. For older changes see the [0.9 series changelog][1].** + + [1]: https://github.com/nikic/PHP-Parser/blob/0.9/CHANGELOG.md diff --git a/vendor/nikic/php-parser/LICENSE b/vendor/nikic/php-parser/LICENSE new file mode 100644 index 0000000000..443210b44a --- /dev/null +++ b/vendor/nikic/php-parser/LICENSE @@ -0,0 +1,31 @@ +Copyright (c) 2011 by Nikita Popov. + +Some 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. + + * The names of the contributors may not 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. \ No newline at end of file diff --git a/vendor/nikic/php-parser/README.md b/vendor/nikic/php-parser/README.md new file mode 100644 index 0000000000..729e19b708 --- /dev/null +++ b/vendor/nikic/php-parser/README.md @@ -0,0 +1,87 @@ +PHP Parser +========== + +This is a PHP 5.2 to PHP 5.6 parser written in PHP. Its purpose is to simplify static code analysis and +manipulation. + +[**Documentation for version 1.x**][doc_1_x] (stable; for running on PHP >= 5.3). + +[Documentation for version 0.9.x][doc_0_9] (unsupported; for running on PHP 5.2). + +In a Nutshell +------------- + +The parser turns PHP source code into an abstract syntax tree. For example, if you pass the following code into the +parser: + +```php + Expr_AssignOp_BitwiseAnd +Expr_AssignBitwiseOr => Expr_AssignOp_BitwiseOr +Expr_AssignBitwiseXor => Expr_AssignOp_BitwiseXor +Expr_AssignConcat => Expr_AssignOp_Concat +Expr_AssignDiv => Expr_AssignOp_Div +Expr_AssignMinus => Expr_AssignOp_Minus +Expr_AssignMod => Expr_AssignOp_Mod +Expr_AssignMul => Expr_AssignOp_Mul +Expr_AssignPlus => Expr_AssignOp_Plus +Expr_AssignShiftLeft => Expr_AssignOp_ShiftLeft +Expr_AssignShiftRight => Expr_AssignOp_ShiftRight + +Expr_BitwiseAnd => Expr_BinaryOp_BitwiseAnd +Expr_BitwiseOr => Expr_BinaryOp_BitwiseOr +Expr_BitwiseXor => Expr_BinaryOp_BitwiseXor +Expr_BooleanAnd => Expr_BinaryOp_BooleanAnd +Expr_BooleanOr => Expr_BinaryOp_BooleanOr +Expr_Concat => Expr_BinaryOp_Concat +Expr_Div => Expr_BinaryOp_Div +Expr_Equal => Expr_BinaryOp_Equal +Expr_Greater => Expr_BinaryOp_Greater +Expr_GreaterOrEqual => Expr_BinaryOp_GreaterOrEqual +Expr_Identical => Expr_BinaryOp_Identical +Expr_LogicalAnd => Expr_BinaryOp_LogicalAnd +Expr_LogicalOr => Expr_BinaryOp_LogicalOr +Expr_LogicalXor => Expr_BinaryOp_LogicalXor +Expr_Minus => Expr_BinaryOp_Minus +Expr_Mod => Expr_BinaryOp_Mod +Expr_Mul => Expr_BinaryOp_Mul +Expr_NotEqual => Expr_BinaryOp_NotEqual +Expr_NotIdentical => Expr_BinaryOp_NotIdentical +Expr_Plus => Expr_BinaryOp_Plus +Expr_ShiftLeft => Expr_BinaryOp_ShiftLeft +Expr_ShiftRight => Expr_BinaryOp_ShiftRight +Expr_Smaller => Expr_BinaryOp_Smaller +Expr_SmallerOrEqual => Expr_BinaryOp_SmallerOrEqual + +Scalar_ClassConst => Scalar_MagicConst_Class +Scalar_DirConst => Scalar_MagicConst_Dir +Scalar_FileConst => Scalar_MagicConst_File +Scalar_FuncConst => Scalar_MagicConst_Function +Scalar_LineConst => Scalar_MagicConst_Line +Scalar_MethodConst => Scalar_MagicConst_Method +Scalar_NSConst => Scalar_MagicConst_Namespace +Scalar_TraitConst => Scalar_MagicConst_Trait +``` + +These changes may affect custom pretty printers and code comparing the return value of `Node::getType()` to specific +strings. + +### Miscellaneous + + * The classes `Template` and `TemplateLoader` have been removed. You should use some other [code generation][code_gen] + project built on top of PHP-Parser instead. + + * The `PrettyPrinterAbstract::pStmts()` method now emits a leading newline if the statement list is not empty. + Custom pretty printers should remove the explicit newline before `pStmts()` calls. + + Old: + + ```php + public function pStmt_Trait(PHPParser_Node_Stmt_Trait $node) { + return 'trait ' . $node->name + . "\n" . '{' . "\n" . $this->pStmts($node->stmts) . "\n" . '}'; + } + ``` + + New: + + ```php + public function pStmt_Trait(Stmt\Trait_ $node) { + return 'trait ' . $node->name + . "\n" . '{' . $this->pStmts($node->stmts) . "\n" . '}'; + } + ``` + + [code_gen]: https://github.com/nikic/PHP-Parser/wiki/Projects-using-the-PHP-Parser#code-generation \ No newline at end of file diff --git a/vendor/nikic/php-parser/bin/php-parse.php b/vendor/nikic/php-parser/bin/php-parse.php new file mode 100644 index 0000000000..c04ff08643 --- /dev/null +++ b/vendor/nikic/php-parser/bin/php-parse.php @@ -0,0 +1,161 @@ +#!/usr/bin/env php + array( + 'startLine', 'endLine', 'startFilePos', 'endFilePos' +))); +$parser = new PhpParser\Parser($lexer); +$dumper = new PhpParser\NodeDumper; +$prettyPrinter = new PhpParser\PrettyPrinter\Standard; +$serializer = new PhpParser\Serializer\XML; + +$traverser = new PhpParser\NodeTraverser(); +$traverser->addVisitor(new PhpParser\NodeVisitor\NameResolver); + +foreach ($files as $file) { + if (strpos($file, ' Code $code\n"; + } else { + if (!file_exists($file)) { + die("File $file does not exist.\n"); + } + + $code = file_get_contents($file); + echo "====> File $file:\n"; + } + + try { + $stmts = $parser->parse($code); + } catch (PhpParser\Error $e) { + if ($attributes['with-column-info'] && $e->hasColumnInfo()) { + $startLine = $e->getStartLine(); + $endLine = $e->getEndLine(); + $startColumn = $e->getStartColumn($code); + $endColumn = $e->getEndColumn($code); + $message .= $e->getRawMessage() . " from $startLine:$startColumn to $endLine:$endColumn"; + } else { + $message = $e->getMessage(); + } + + die($message . "\n"); + } + + foreach ($operations as $operation) { + if ('dump' === $operation) { + echo "==> Node dump:\n"; + echo $dumper->dump($stmts), "\n"; + } elseif ('pretty-print' === $operation) { + echo "==> Pretty print:\n"; + echo $prettyPrinter->prettyPrintFile($stmts), "\n"; + } elseif ('serialize-xml' === $operation) { + echo "==> Serialized XML:\n"; + echo $serializer->serialize($stmts), "\n"; + } elseif ('var-dump' === $operation) { + echo "==> var_dump():\n"; + var_dump($stmts); + } elseif ('resolve-names' === $operation) { + echo "==> Resolved names.\n"; + $stmts = $traverser->traverse($stmts); + } + } +} + +function showHelp($error) { + die($error . "\n\n" . + << false, + ); + + array_shift($args); + $parseOptions = true; + foreach ($args as $arg) { + if (!$parseOptions) { + $files[] = $arg; + continue; + } + + switch ($arg) { + case '--dump': + case '-d': + $operations[] = 'dump'; + break; + case '--pretty-print': + case '-p': + $operations[] = 'pretty-print'; + break; + case '--serialize-xml': + $operations[] = 'serialize-xml'; + break; + case '--var-dump': + $operations[] = 'var-dump'; + break; + case '--resolve-names': + case '-N'; + $operations[] = 'resolve-names'; + break; + case '--with-column-info': + case '-c'; + $attributes['with-column-info'] = true; + break; + case '--': + $parseOptions = false; + break; + default: + if ($arg[0] === '-') { + showHelp("Invalid operation $arg."); + } else { + $files[] = $arg; + } + } + } + + return array($operations, $files, $attributes); +} diff --git a/vendor/nikic/php-parser/composer.json b/vendor/nikic/php-parser/composer.json new file mode 100644 index 0000000000..1fd98a1907 --- /dev/null +++ b/vendor/nikic/php-parser/composer.json @@ -0,0 +1,24 @@ +{ + "name": "nikic/php-parser", + "description": "A PHP parser written in PHP", + "keywords": ["php", "parser"], + "type": "library", + "license": "BSD-3-Clause", + "authors": [ + { + "name": "Nikita Popov" + } + ], + "require": { + "php": ">=5.3", + "ext-tokenizer": "*" + }, + "autoload": { + "files": ["lib/bootstrap.php"] + }, + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + } +} diff --git a/vendor/nikic/php-parser/doc/0_Introduction.markdown b/vendor/nikic/php-parser/doc/0_Introduction.markdown new file mode 100644 index 0000000000..1ffadef99c --- /dev/null +++ b/vendor/nikic/php-parser/doc/0_Introduction.markdown @@ -0,0 +1,81 @@ +Introduction +============ + +This project is a PHP 5.2 to PHP 5.6 parser **written in PHP itself**. + +What is this for? +----------------- + +A parser is useful for [static analysis][0], manipulation of code and basically any other +application dealing with code programmatically. A parser constructs an [Abstract Syntax Tree][1] +(AST) of the code and thus allows dealing with it in an abstract and robust way. + +There are other ways of processing source code. One that PHP supports natively is using the +token stream generated by [`token_get_all`][2]. The token stream is much more low level than +the AST and thus has different applications: It allows to also analyze the exact formatting of +a file. On the other hand the token stream is much harder to deal with for more complex analysis. +For example an AST abstracts away the fact that in PHP variables can be written as `$foo`, but also +as `$$bar`, `${'foobar'}` or even `${!${''}=barfoo()}`. You don't have to worry about recognizing +all the different syntaxes from a stream of tokens. + +Another questions is: Why would I want to have a PHP parser *written in PHP*? Well, PHP might not be +a language especially suited for fast parsing, but processing the AST is much easier in PHP than it +would be in other, faster languages like C. Furthermore the people most probably wanting to do +programmatic PHP code analysis are incidentally PHP developers, not C developers. + +What can it parse? +------------------ + +The parser uses a PHP 5.6 compliant grammar, which is backwards compatible with all PHP version from PHP 5.2 +upwards (and maybe older). + +As the parser is based on the tokens returned by `token_get_all` (which is only able to lex the PHP +version it runs on), additionally a wrapper for emulating new tokens from 5.3, 5.4, 5.5 and 5.6 is provided. +This allows to parse PHP 5.6 source code running on PHP 5.3, for example. This emulation is very hacky and not +perfect, but it should work well on any sane code. + +What output does it produce? +---------------------------- + +The parser produces an [Abstract Syntax Tree][1] (AST) also known as a node tree. How this looks like +can best be seen in an example. The program `parse($code); + // $stmts is an array of statement nodes +} catch (PhpParser\Error $e) { + echo 'Parse Error: ', $e->getMessage(); +} +``` + +A parser instance can be reused to parse multiple files. + +Node tree +--------- + +If you use the above code with `$code = "subNodeName`. The `Stmt\Echo_` node has only one subnode `exprs`. So in order to access it +in the above example you would write `$stmts[0]->exprs`. If you wanted to access the name of the function +call, you would write `$stmts[0]->exprs[1]->name`. + +All nodes also define a `getType()` method that returns the node type. The type is the class name +without the `PhpParser\Node\` prefix and `\` replaced with `_`. It also does not contain a trailing +`_` for reserved-keyword class names. + +It is possible to associate custom metadata with a node using the `setAttribute()` method. This data +can then be retrieved using `hasAttribute()`, `getAttribute()` and `getAttributes()`. + +By default the lexer adds the `startLine`, `endLine` and `comments` attributes. `comments` is an array +of `PhpParser\Comment[\Doc]` instances. + +The start line can also be accessed using `getLine()`/`setLine()` (instead of `getAttribute('startLine')`). +The last doc comment from the `comments` attribute can be obtained using `getDocComment()`. + +Pretty printer +-------------- + +The pretty printer component compiles the AST back to PHP code. As the parser does not retain formatting +information the formatting is done using a specified scheme. Currently there is only one scheme available, +namely `PhpParser\PrettyPrinter\Standard`. + +```php +parse($code); + + // change + $stmts[0] // the echo statement + ->exprs // sub expressions + [0] // the first of them (the string node) + ->value // it's value, i.e. 'Hi ' + = 'Hello '; // change to 'Hello ' + + // pretty print + $code = $prettyPrinter->prettyPrint($stmts); + + echo $code; +} catch (PhpParser\Error $e) { + echo 'Parse Error: ', $e->getMessage(); +} +``` + +The above code will output: + + parse()`, then changed and then +again converted to code using `PhpParser\PrettyPrinter\Standard->prettyPrint()`. + +The `prettyPrint()` method pretty prints a statements array. It is also possible to pretty print only a +single expression using `prettyPrintExpr()`. + +The `prettyPrintFile()` method can be used to print an entire file. This will include the opening `addVisitor(new MyNodeVisitor); + +try { + $code = file_get_contents($fileName); + + // parse + $stmts = $parser->parse($code); + + // traverse + $stmts = $traverser->traverse($stmts); + + // pretty print + $code = $prettyPrinter->prettyPrintFile($stmts); + + echo $code; +} catch (PhpParser\Error $e) { + echo 'Parse Error: ', $e->getMessage(); +} +``` + +The corresponding node visitor might look like this: + +```php +value = 'foo'; + } + } +} +``` + +The above node visitor would change all string literals in the program to `'foo'`. + +All visitors must implement the `PhpParser\NodeVisitor` interface, which defines the following four +methods: + + public function beforeTraverse(array $nodes); + public function enterNode(PhpParser\Node $node); + public function leaveNode(PhpParser\Node $node); + public function afterTraverse(array $nodes); + +The `beforeTraverse()` method is called once before the traversal begins and is passed the nodes the +traverser was called with. This method can be used for resetting values before traversation or +preparing the tree for traversal. + +The `afterTraverse()` method is similar to the `beforeTraverse()` method, with the only difference that +it is called once after the traversal. + +The `enterNode()` and `leaveNode()` methods are called on every node, the former when it is entered, +i.e. before its subnodes are traversed, the latter when it is left. + +All four methods can either return the changed node or not return at all (i.e. `null`) in which +case the current node is not changed. + +The `enterNode()` method can additionally return the value `NodeTraverser::DONT_TRAVERSE_CHILDREN`, +which instructs the traverser to skip all children of the current node. + +The `leaveNode()` method can additionally return the value `NodeTraverser::REMOVE_NODE`, in which +case the current node will be removed from the parent array. Furthermove it is possible to return +an array of nodes, which will be merged into the parent array at the offset of the current node. +I.e. if in `array(A, B, C)` the node `B` should be replaced with `array(X, Y, Z)` the result will +be `array(A, X, Y, Z, C)`. + +Instead of manually implementing the `NodeVisitor` interface you can also extend the `NodeVisitorAbstract` +class, which will define empty default implementations for all the above methods. + +The NameResolver node visitor +----------------------------- + +One visitor is already bundled with the package: `PhpParser\NodeVisitor\NameResolver`. This visitor +helps you work with namespaced code by trying to resolve most names to fully qualified ones. + +For example, consider the following code: + + use A as B; + new B\C(); + +In order to know that `B\C` really is `A\C` you would need to track aliases and namespaces yourself. +The `NameResolver` takes care of that and resolves names as far as possible. + +After running it most names will be fully qualified. The only names that will stay unqualified are +unqualified function and constant names. These are resolved at runtime and thus the visitor can't +know which function they are referring to. In most cases this is a non-issue as the global functions +are meant. + +Also the `NameResolver` adds a `namespacedName` subnode to class, function and constant declarations +that contains the namespaced name instead of only the shortname that is available via `name`. + +Example: Converting namespaced code to pseudo namespaces +-------------------------------------------------------- + +A small example to understand the concept: We want to convert namespaced code to pseudo namespaces +so it works on 5.2, i.e. names like `A\\B` should be converted to `A_B`. Note that such conversions +are fairly complicated if you take PHP's dynamic features into account, so our conversion will +assume that no dynamic features are used. + +We start off with the following base code: + +```php +addVisitor(new PhpParser\NodeVisitor\NameResolver); // we will need resolved names +$traverser->addVisitor(new NodeVisitor\NamespaceConverter); // our own node visitor + +// iterate over all .php files in the directory +$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($inDir)); +$files = new RegexIterator($files, '/\.php$/'); + +foreach ($files as $file) { + try { + // read the file that should be converted + $code = file_get_contents($file); + + // parse + $stmts = $parser->parse($code); + + // traverse + $stmts = $traverser->traverse($stmts); + + // pretty print + $code = $prettyPrinter->prettyPrintFile($stmts); + + // write the converted file to the target directory + file_put_contents( + substr_replace($file->getPathname(), $outDir, 0, strlen($inDir)), + $code + ); + } catch (PhpParser\Error $e) { + echo 'Parse Error: ', $e->getMessage(); + } +} +``` + +Now lets start with the main code, the `NodeVisitor\NamespaceConverter`. One thing it needs to do +is convert `A\\B` style names to `A_B` style ones. + +```php +toString('_')); + } + } +} +``` + +The above code profits from the fact that the `NameResolver` already resolved all names as far as +possible, so we don't need to do that. We only need to create a string with the name parts separated +by underscores instead of backslashes. This is what `$node->toString('_')` does. (If you want to +create a name with backslashes either write `$node->toString()` or `(string) $node`.) Then we create +a new name from the string and return it. Returning a new node replaces the old node. + +Another thing we need to do is change the class/function/const declarations. Currently they contain +only the shortname (i.e. the last part of the name), but they need to contain the complete name inclduing +the namespace prefix: + +```php +toString('_')); + } elseif ($node instanceof Stmt\Class_ + || $node instanceof Stmt\Interface_ + || $node instanceof Stmt\Function_) { + $node->name = $node->namespacedName->toString('_'); + } elseif ($node instanceof Stmt\Const_) { + foreach ($node->consts as $const) { + $const->name = $const->namespacedName->toString('_'); + } + } + } +} +``` + +There is not much more to it than converting the namespaced name to string with `_` as separator. + +The last thing we need to do is remove the `namespace` and `use` statements: + +```php +toString('_')); + } elseif ($node instanceof Stmt\Class_ + || $node instanceof Stmt\Interface_ + || $node instanceof Stmt\Function_) { + $node->name = $node->namespacedName->toString('_'); + } elseif ($node instanceof Stmt\Const_) { + foreach ($node->consts as $const) { + $const->name = $const->namespacedName->toString('_'); + } + } elseif ($node instanceof Stmt\Namespace_) { + // returning an array merges is into the parent array + return $node->stmts; + } elseif ($node instanceof Stmt\Use_) { + // returning false removed the node altogether + return false; + } + } +} +``` + +That's all. diff --git a/vendor/nikic/php-parser/doc/3_Other_node_tree_representations.markdown b/vendor/nikic/php-parser/doc/3_Other_node_tree_representations.markdown new file mode 100644 index 0000000000..069ba9094c --- /dev/null +++ b/vendor/nikic/php-parser/doc/3_Other_node_tree_representations.markdown @@ -0,0 +1,203 @@ +Other node tree representations +=============================== + +It is possible to convert the AST into several textual representations, which serve different uses. + +Simple serialization +-------------------- + +It is possible to serialize the node tree using `serialize()` and also unserialize it using +`unserialize()`. The output is not human readable and not easily processable from anything +but PHP, but it is compact and generates fast. The main application thus is in caching. + +Human readable dumping +---------------------- + +Furthermore it is possible to dump nodes into a human readable format using the `dump` method of +`PhpParser\NodeDumper`. This can be used for debugging. + +```php +parse($code); + + echo $nodeDumper->dump($stmts), "\n"; +} catch (PhpParser\Error $e) { + echo 'Parse Error: ', $e->getMessage(); +} +``` + +The above script will have an output looking roughly like this: + +``` +array( + 0: Stmt_Function( + byRef: false + params: array( + 0: Param( + name: msg + default: null + type: null + byRef: false + ) + ) + stmts: array( + 0: Stmt_Echo( + exprs: array( + 0: Expr_Variable( + name: msg + ) + 1: Scalar_String( + value: + + ) + ) + ) + ) + name: printLine + ) + 1: Expr_FuncCall( + name: Name( + parts: array( + 0: printLine + ) + ) + args: array( + 0: Arg( + value: Scalar_String( + value: Hello World!!! + ) + byRef: false + ) + ) + ) +) +``` + +Serialization to XML +-------------------- + +It is also possible to serialize the node tree to XML using `PhpParser\Serializer\XML->serialize()` +and to unserialize it using `PhpParser\Unserializer\XML->unserialize()`. This is useful for +interfacing with other languages and applications or for doing transformation using XSLT. + +```php +parse($code); + + echo $serializer->serialize($stmts); +} catch (PhpParser\Error $e) { + echo 'Parse Error: ', $e->getMessage(); +} +``` + +Produces: + +```xml + + + + + + + + + + + + msg + + + + + + + + + + + + + + + + + + + + + msg + + + + + + + + + + + + + + + printLine + + + + + + + + printLine + + + + + + + + + + + Hello World!!! + + + + + + + + + + + + +``` \ No newline at end of file diff --git a/vendor/nikic/php-parser/doc/4_Code_generation.markdown b/vendor/nikic/php-parser/doc/4_Code_generation.markdown new file mode 100644 index 0000000000..d8f1825ec3 --- /dev/null +++ b/vendor/nikic/php-parser/doc/4_Code_generation.markdown @@ -0,0 +1,80 @@ +Code generation +=============== + +It is also possible to generate code using the parser, by first creating an Abstract Syntax Tree and then using the +pretty printer to convert it to PHP code. To simplify code generation, the project comes with builders which allow +creating node trees using a fluid interface, instead of instantiating all nodes manually. Builders are available for +the following syntactic elements: + + * namespaces and use statements + * classes, interfaces and traits + * methods, functions and parameters + * properties + +Here is an example: + +```php +namespace('Name\Space') + ->addStmt($factory->use('Some\Other\Thingy')->as('SomeOtherClass')) + ->addStmt($factory->class('SomeClass') + ->extend('SomeOtherClass') + ->implement('A\Few', '\Interfaces') + ->makeAbstract() // ->makeFinal() + + ->addStmt($factory->method('someMethod') + ->makePublic() + ->makeAbstract() // ->makeFinal() + ->addParam($factory->param('someParam')->setTypeHint('SomeClass')) + ->setDocComment('/** + * This method does something. + * + * @param SomeClass And takes a parameter + */') + ) + + ->addStmt($factory->method('anotherMethod') + ->makeProtected() // ->makePublic() [default], ->makePrivate() + ->addParam($factory->param('someParam')->setDefault('test')) + // it is possible to add manually created nodes + ->addStmt(new PhpParser\Node\Expr\Print_(new PhpParser\Node\Expr\Variable('someParam'))) + ) + + // properties will be correctly reordered above the methods + ->addStmt($factory->property('someProperty')->makeProtected()) + ->addStmt($factory->property('anotherProperty')->makePrivate()->setDefault(array(1, 2, 3))) + ) + + ->getNode() +; + +$stmts = array($node); +$prettyPrinter = new PhpParser\PrettyPrinter\Standard(); +echo $prettyPrinter->prettyPrintFile($stmts); +``` + +This will produce the following output with the standard pretty printer: + +```php + array('comments', 'startLine', 'endLine', 'startFilePos', 'endFilePos'), +)); +$parser = new PhpParser\Parser($lexer); + +try { + $stmts = $parser->parse($code); + // ... +} catch (PhpParser\Error $e) { + // ... +} +``` + +Before using column information its availability needs to be checked with `$e->hasColumnInfo()`, as the precise +location of an error cannot always be determined. The methods for retrieving column information also have to be passed +the source code of the parsed file. An example for printing an error: + +```php +if ($e->hasColumnInfo()) { + echo $e->getRawMessage() . ' from ' . $e->getStartLine() . ':' . $e->getStartColumn($code) + . ' to ' . $e->getEndLine() . ':' . $e->getEndColumn($code); +} else { + echo $e->getMessage(); +} +``` + +Both line numbers and column numbers are 1-based. EOF errors will be located at the position one past the end of the +file. + +Error recovery +-------------- + +> **EXPERIMENTAL** + +By default the parser will throw an exception upon encountering the first error during parsing. An alternative mode is +also supported, in which the parser will remember the error, but try to continue parsing the rest of the source code. + +To enable this mode the `throwOnError` parser option needs to be disabled. Any errors that occurred during parsing can +then be retrieved using `$parser->getErrors()`. The `$parser->parse()` method will either return a partial syntax tree +or `null` if recovery fails. + +A usage example: + +```php +$parser = new PhpParser\Parser(new PhpParser\Lexer, array( + 'throwOnError' => false, +)); + +$stmts = $parser->parse($code); +$errors = $parser->getErrors(); + +foreach ($errors as $error) { + // $error is an ordinary PhpParser\Error +} + +if (null !== $stmts) { + // $stmts is a best-effort partial AST +} +``` + +The error recovery implementation is experimental -- it currently won't be able to recover from many types of errors. diff --git a/vendor/nikic/php-parser/doc/component/Lexer.markdown b/vendor/nikic/php-parser/doc/component/Lexer.markdown new file mode 100644 index 0000000000..0bf06b6c58 --- /dev/null +++ b/vendor/nikic/php-parser/doc/component/Lexer.markdown @@ -0,0 +1,146 @@ +Lexer component documentation +============================= + +The lexer is responsible for providing tokens to the parser. The project comes with two lexers: `PhpParser\Lexer` and +`PhpParser\Lexer\Emulative`. The latter is an extension of the former, which adds the ability to emulate tokens of +newer PHP versions and thus allows parsing of new code on older versions. + +This documentation discusses options available for the default lexers and explains how lexers can be extended. + +Lexer options +------------- + +The two default lexers accept an `$options` array in the constructor. Currently only the `'usedAttributes'` option is +supported, which allows you to specify which attributes will be added to the AST nodes. The attributes can then be +accessed using `$node->getAttribute()`, `$node->setAttribute()`, `$node->hasAttribute()` and `$node->getAttributes()` +methods. A sample options array: + +```php +$lexer = new PhpParser\Lexer(array( + 'usedAttributes' => array( + 'comments', 'startLine', 'endLine' + ) +)); +``` + +The attributes used in this example match the default behavior of the lexer. The following attributes are supported: + + * `comments`: Array of `PhpParser\Comment` or `PhpParser\Comment\Doc` instances, representing all comments that occurred + between the previous non-discarded token and the current one. Use of this attribute is required for the + `$node->getDocComment()` method to work. The attribute is also needed if you wish the pretty printer to retain + comments present in the original code. + * `startLine`: Line in which the node starts. This attribute is required for the `$node->getLine()` to work. It is also + required if syntax errors should contain line number information. + * `endLine`: Line in which the node ends. + * `startTokenPos`: Offset into the token array of the first token in the node. + * `endTokenPos`: Offset into the token array of the last token in the node. + * `startFilePos`: Offset into the code string of the first character that is part of the node. + * `endFilePos`: Offset into the code string of the last character that is part of the node. + +### Using token positions + +The token offset information is useful if you wish to examine the exact formatting used for a node. For example the AST +does not distinguish whether a property was declared using `public` or using `var`, but you can retrieve this +information based on the token position: + +```php +function isDeclaredUsingVar(array $tokens, PhpParser\Node\Stmt\Property $prop) { + $i = $prop->getAttribute('startTokenPos'); + return $tokens[$i][0] === T_VAR; +} +``` + +In order to make use of this function, you will have to provide the tokens from the lexer to your node visitor using +code similar to the following: + +```php +class MyNodeVisitor extends PhpParser\NodeVisitorAbstract { + private $tokens; + public function setTokens(array $tokens) { + $this->tokens = $tokens; + } + + public function leaveNode(PhpParser\Node $node) { + if ($node instanceof PhpParser\Node\Stmt\Property) { + var_dump(isDeclaredUsingVar($this->tokens, $node)); + } + } +} + +$lexer = new PhpParser\Lexer(array( + 'usedAttributes' => array( + 'comments', 'startLine', 'endLine', 'startTokenPos', 'endTokenPos' + ) +)); +$parser = new PhpParser\Parser($lexer); + +$visitor = new MyNodeVisitor(); +$traverser = new PhpParser\NodeTraverser(); +$traverser->addVisitor($visitor); + +try { + $stmts = $parser->parse($code); + $visitor->setTokens($lexer->getTokens()); + $stmts = $traverser->traverse($stmts); +} catch (PhpParser\Error $e) { + echo 'Parse Error: ', $e->getMessage(); +} +``` + +The same approach can also be used to perform specific modifications in the code, without changing the formatting in +other places (which is the case when using the pretty printer). + +Lexer extension +--------------- + +A lexer has to define the following public interface: + + void startLexing(string $code); + array getTokens(); + string handleHaltCompiler(); + int getNextToken(string &$value = null, array &$startAttributes = null, array &$endAttributes = null); + +The `startLexing()` method is invoked with the source code that is to be lexed (including the opening tag) whenever the +`parse()` method of the parser is called. It can be used to reset state or preprocess the source code or tokens. + +The `getTokens()` method returns the current token array, in the usual `token_get_all()` format. This method is not +used by the parser (which uses `getNextToken()`), but is useful in combination with the token position attributes. + +The `handleHaltCompiler()` method is called whenever a `T_HALT_COMPILER` token is encountered. It has to return the +remaining string after the construct (not including `();`). + +The `getNextToken()` method returns the ID of the next token (as defined by the `Parser::T_*` constants). If no more +tokens are available it must return `0`, which is the ID of the `EOF` token. Furthermore the string content of the +token should be written into the by-reference `$value` parameter (which will then be available as `$n` in the parser). + +### Attribute handling + +The other two by-ref variables `$startAttributes` and `$endAttributes` define which attributes will eventually be +assigned to the generated nodes: The parser will take the `$startAttributes` from the first token which is part of the +node and the `$endAttributes` from the last token that is part of the node. + +E.g. if the tokens `T_FUNCTION T_STRING ... '{' ... '}'` constitute a node, then the `$startAttributes` from the +`T_FUNCTION` token will be taken and the `$endAttributes` from the `'}'` token. + +An application of custom attributes is storing the original formatting of literals: The parser does not retain +information about the formatting of integers (like decimal vs. hexadecimal) or strings (like used quote type or used +escape sequences). This can be remedied by storing the original value in an attribute: + +```php +class KeepOriginalValueLexer extends PHPParser\Lexer // or PHPParser\Lexer\Emulative +{ + public function getNextToken(&$value = null, &$startAttributes = null, &$endAttributes = null) { + $tokenId = parent::getNextToken($value, $startAttributes, $endAttributes); + + if ($tokenId == PHPParser\Parser::T_CONSTANT_ENCAPSED_STRING // non-interpolated string + || $tokenId == PHPParser\Parser::T_LNUMBER // integer + || $tokenId == PHPParser\Parser::T_DNUMBER // floating point number + ) { + // could also use $startAttributes, doesn't really matter here + $endAttributes['originalValue'] = $value; + } + + return $tokenId; + } +} +``` diff --git a/vendor/nikic/php-parser/grammar/README.md b/vendor/nikic/php-parser/grammar/README.md new file mode 100644 index 0000000000..909f7c1a1e --- /dev/null +++ b/vendor/nikic/php-parser/grammar/README.md @@ -0,0 +1,28 @@ +What do all those files mean? +============================= + + * `zend_language_parser.phpy`: PHP grammer written in a pseudo language + * `analyze.php`: Analyzes the `.phpy`-grammer and outputs some info about it + * `rebuildParser.php`: Preprocesses the `.phpy`-grammar and builds the parser using `kmyacc` + * `kmyacc.php.parser`: A `kmyacc` parser prototype file for PHP + +.phpy pseudo language +===================== + +The `.phpy` file is a normal grammer in `kmyacc` (`yacc`) style, with some transformations +applied to it: + + * Nodes are created using the syntax `Name[..., ...]`. This is transformed into + `new Name(..., ..., attributes())` + * Some function-like constructs are resolved (see `rebuildParser.php` for a list) + * Associative arrays are written as `[key: value, ...]`, which is transformed to + `array('key' => value, ...)` + +Building the parser +=================== + +In order to rebuild the parser, you need [moriyoshi's fork of kmyacc](https://github.com/moriyoshi/kmyacc-forked). +After you compiled/installed it, run the `rebuildParser.php` script. + +By default only the `Parser.php` is built. If you want to additionally emit debug symbols and create `y.output`, run the +script with `--debug`. If you want to retain the preprocessed grammar pass `--keep-tmp-grammar`. diff --git a/vendor/nikic/php-parser/grammar/analyze.php b/vendor/nikic/php-parser/grammar/analyze.php new file mode 100644 index 0000000000..50101dfa96 --- /dev/null +++ b/vendor/nikic/php-parser/grammar/analyze.php @@ -0,0 +1,96 @@ +\'[^\\\\\']*+(?:\\\\.[^\\\\\']*+)*+\') + (?"[^\\\\"]*+(?:\\\\.[^\\\\"]*+)*+") + (?(?&singleQuotedString)|(?&doubleQuotedString)) + (?/\*[^*]*+(?:\*(?!/)[^*]*+)*+\*/) + (?\{[^\'"/{}]*+(?:(?:(?&string)|(?&comment)|(?&code)|/)[^\'"/{}]*+)*+}) +)'; + +const RULE_BLOCK = '(?[a-z_]++):(?[^\'"/{};]*+(?:(?:(?&string)|(?&comment)|(?&code)|/|})[^\'"/{};]*+)*+);'; + +$usedTerminals = array_flip(array( + 'T_VARIABLE', 'T_STRING', 'T_INLINE_HTML', 'T_ENCAPSED_AND_WHITESPACE', + 'T_LNUMBER', 'T_DNUMBER', 'T_CONSTANT_ENCAPSED_STRING', 'T_STRING_VARNAME', 'T_NUM_STRING' +)); +$unusedNonterminals = array_flip(array( + 'case_separator', 'optional_comma' +)); + +function regex($regex) { + return '~' . LIB . '(?:' . str_replace('~', '\~', $regex) . ')~'; +} + +function magicSplit($regex, $string) { + $pieces = preg_split(regex('(?:(?&string)|(?&comment)|(?&code))(*SKIP)(*FAIL)|' . $regex), $string); + + foreach ($pieces as &$piece) { + $piece = trim($piece); + } + + return array_filter($pieces); +} + +echo '
';
+
+////////////////////
+////////////////////
+////////////////////
+
+list($defs, $ruleBlocks) = magicSplit('%%', file_get_contents(GRAMMAR_FILE));
+
+if ('' !== trim(preg_replace(regex(RULE_BLOCK), '', $ruleBlocks))) {
+    die('Not all rule blocks were properly recognized!');
+}
+
+preg_match_all(regex(RULE_BLOCK), $ruleBlocks, $ruleBlocksMatches, PREG_SET_ORDER);
+foreach ($ruleBlocksMatches as $match) {
+    $ruleBlockName = $match['name'];
+    $rules = magicSplit('\|', $match['rules']);
+
+    foreach ($rules as &$rule) {
+        $parts = magicSplit('\s+', $rule);
+        $usedParts = array();
+
+        foreach ($parts as $part) {
+            if ('{' === $part[0]) {
+                preg_match_all('~\$([0-9]+)~', $part, $backReferencesMatches, PREG_SET_ORDER);
+                foreach ($backReferencesMatches as $match) {
+                    $usedParts[$match[1]] = true;
+                }
+            }
+        }
+
+        $i = 1;
+        foreach ($parts as &$part) {
+            if ('/' === $part[0]) {
+                continue;
+            }
+
+            if (isset($usedParts[$i])) {
+                if ('\'' === $part[0] || '{' === $part[0]
+                    || (ctype_upper($part[0]) && !isset($usedTerminals[$part]))
+                    || (ctype_lower($part[0]) && isset($unusedNonterminals[$part]))
+                ) {
+                    $part = '' . $part . '';
+                } else {
+                    $part = '' . $part . '';
+                }
+            } elseif ((ctype_upper($part[0]) && isset($usedTerminals[$part]))
+                      || (ctype_lower($part[0]) && !isset($unusedNonterminals[$part]))
+
+            ) {
+                $part = '' . $part . '';
+            }
+
+            ++$i;
+        }
+
+        $rule = implode(' ', $parts);
+    }
+
+    echo $ruleBlockName, ':', "\n", '      ', implode("\n" . '    | ', $rules), "\n", ';', "\n\n";
+}
\ No newline at end of file
diff --git a/vendor/nikic/php-parser/grammar/kmyacc.php.parser b/vendor/nikic/php-parser/grammar/kmyacc.php.parser
new file mode 100644
index 0000000000..e8f4d5a65c
--- /dev/null
+++ b/vendor/nikic/php-parser/grammar/kmyacc.php.parser
@@ -0,0 +1,100 @@
+semValue
+#semval($,%t) $this->semValue
+#semval(%n) $this->stackPos-(%l-%n)
+#semval(%n,%t) $this->stackPos-(%l-%n)
+
+namespace PhpParser;
+#include;
+
+/* This is an automatically GENERATED file, which should not be manually edited.
+ * Instead edit one of the following:
+ *  * the grammar file grammar/zend_language_parser.phpy
+ *  * the skeleton file grammar/kymacc.php.parser
+ *  * the preprocessing script grammar/rebuildParser.php
+ */
+class Parser extends ParserAbstract
+{
+    protected $tokenToSymbolMapSize = #(YYMAXLEX);
+    protected $actionTableSize = #(YYLAST);
+    protected $gotoTableSize = #(YYGLAST);
+
+    protected $invalidSymbol = #(YYBADCH);
+    protected $errorSymbol = #(YYINTERRTOK);
+    protected $defaultAction = #(YYDEFAULT);
+    protected $unexpectedTokenRule = #(YYUNEXPECTED);
+
+    protected $YY2TBLSTATE  = #(YY2TBLSTATE);
+    protected $YYNLSTATES   = #(YYNLSTATES);
+
+#tokenval
+    const %s = %n;
+#endtokenval
+
+    protected $symbolToName = array(
+        #listvar terminals
+    );
+
+    protected $tokenToSymbol = array(
+        #listvar yytranslate
+    );
+
+    protected $action = array(
+        #listvar yyaction
+    );
+
+    protected $actionCheck = array(
+        #listvar yycheck
+    );
+
+    protected $actionBase = array(
+        #listvar yybase
+    );
+
+    protected $actionDefault = array(
+        #listvar yydefault
+    );
+
+    protected $goto = array(
+        #listvar yygoto
+    );
+
+    protected $gotoCheck = array(
+        #listvar yygcheck
+    );
+
+    protected $gotoBase = array(
+        #listvar yygbase
+    );
+
+    protected $gotoDefault = array(
+        #listvar yygdefault
+    );
+
+    protected $ruleToNonTerminal = array(
+        #listvar yylhs
+    );
+
+    protected $ruleToLength = array(
+        #listvar yylen
+    );
+#if -t
+
+    protected $productions = array(
+        #production-strings;
+    );
+#endif
+#reduce
+
+    protected function reduceRule%n() {
+        %b
+    }
+#noact
+
+    protected function reduceRule%n() {
+        $this->semValue = $this->semStack[$this->stackPos];
+    }
+#endreduce
+}
+#tailcode;
diff --git a/vendor/nikic/php-parser/grammar/rebuildParser.php b/vendor/nikic/php-parser/grammar/rebuildParser.php
new file mode 100644
index 0000000000..5d21a1e4e7
--- /dev/null
+++ b/vendor/nikic/php-parser/grammar/rebuildParser.php
@@ -0,0 +1,228 @@
+\'[^\\\\\']*+(?:\\\\.[^\\\\\']*+)*+\')
+    (?"[^\\\\"]*+(?:\\\\.[^\\\\"]*+)*+")
+    (?(?&singleQuotedString)|(?&doubleQuotedString))
+    (?/\*[^*]*+(?:\*(?!/)[^*]*+)*+\*/)
+    (?\{[^\'"/{}]*+(?:(?:(?&string)|(?&comment)|(?&code)|/)[^\'"/{}]*+)*+})
+)';
+
+const PARAMS = '\[(?[^[\]]*+(?:\[(?¶ms)\][^[\]]*+)*+)\]';
+const ARGS   = '\((?[^()]*+(?:\((?&args)\)[^()]*+)*+)\)';
+
+///////////////////
+/// Main script ///
+///////////////////
+
+echo 'Building temporary preproprocessed grammar file.', "\n";
+
+$grammarCode = file_get_contents($grammarFile);
+
+$grammarCode = resolveNodes($grammarCode);
+$grammarCode = resolveMacros($grammarCode);
+$grammarCode = resolveArrays($grammarCode);
+$grammarCode = resolveStackAccess($grammarCode);
+
+file_put_contents($tmpGrammarFile, $grammarCode);
+
+$additionalArgs = $optionDebug ? '-t -v' : '';
+
+echo "Building parser.\n";
+$output = trim(shell_exec("$kmyacc $additionalArgs -l -m $skeletonFile $tmpGrammarFile 2>&1"));
+echo "Output: \"$output\"\n";
+
+$resultCode = file_get_contents($tmpResultFile);
+$resultCode = removeTrailingWhitespace($resultCode);
+
+ensureDirExists(dirname($parserResultFile));
+file_put_contents($parserResultFile, $resultCode);
+unlink($tmpResultFile);
+
+if (!$optionKeepTmpGrammar) {
+    unlink($tmpGrammarFile);
+}
+
+///////////////////////////////
+/// Preprocessing functions ///
+///////////////////////////////
+
+function resolveNodes($code) {
+    return preg_replace_callback(
+        '~(?[A-Z][a-zA-Z_\\\\]++)\s*' . PARAMS . '~',
+        function($matches) {
+            // recurse
+            $matches['params'] = resolveNodes($matches['params']);
+
+            $params = magicSplit(
+                '(?:' . PARAMS . '|' . ARGS . ')(*SKIP)(*FAIL)|,',
+                $matches['params']
+            );
+
+            $paramCode = '';
+            foreach ($params as $param) {
+                $paramCode .= $param . ', ';
+            }
+
+            return 'new ' . $matches['name'] . '(' . $paramCode . 'attributes())';
+        },
+        $code
+    );
+}
+
+function resolveMacros($code) {
+    return preg_replace_callback(
+        '~\b(?)(?!array\()(?[a-z][A-Za-z]++)' . ARGS . '~',
+        function($matches) {
+            // recurse
+            $matches['args'] = resolveMacros($matches['args']);
+
+            $name = $matches['name'];
+            $args = magicSplit(
+                '(?:' . PARAMS . '|' . ARGS . ')(*SKIP)(*FAIL)|,',
+                $matches['args']
+            );
+
+            if ('attributes' == $name) {
+                assertArgs(0, $args, $name);
+                return '$this->startAttributeStack[#1] + $this->endAttributes';
+            }
+
+            if ('init' == $name) {
+                return '$$ = array(' . implode(', ', $args) . ')';
+            }
+
+            if ('push' == $name) {
+                assertArgs(2, $args, $name);
+
+                return $args[0] . '[] = ' . $args[1] . '; $$ = ' . $args[0];
+            }
+
+            if ('pushNormalizing' == $name) {
+                assertArgs(2, $args, $name);
+
+                return 'if (is_array(' . $args[1] . ')) { $$ = array_merge(' . $args[0] . ', ' . $args[1] . '); } else { ' . $args[0] . '[] = ' . $args[1] . '; $$ = ' . $args[0] . '; }';
+            }
+
+            if ('toArray' == $name) {
+                assertArgs(1, $args, $name);
+
+                return 'is_array(' . $args[0] . ') ? ' . $args[0] . ' : array(' . $args[0] . ')';
+            }
+
+            if ('parseVar' == $name) {
+                assertArgs(1, $args, $name);
+
+                return 'substr(' . $args[0] . ', 1)';
+            }
+
+            if ('parseEncapsed' == $name) {
+                assertArgs(2, $args, $name);
+
+                return 'foreach (' . $args[0] . ' as &$s) { if (is_string($s)) { $s = Node\Scalar\String_::parseEscapeSequences($s, ' . $args[1] . '); } }';
+            }
+
+            if ('parseEncapsedDoc' == $name) {
+                assertArgs(1, $args, $name);
+
+                return 'foreach (' . $args[0] . ' as &$s) { if (is_string($s)) { $s = Node\Scalar\String_::parseEscapeSequences($s, null); } } $s = preg_replace(\'~(\r\n|\n|\r)\z~\', \'\', $s); if (\'\' === $s) array_pop(' . $args[0] . ');';
+            }
+
+            return $matches[0];
+        },
+        $code
+    );
+}
+
+function assertArgs($num, $args, $name) {
+    if ($num != count($args)) {
+        die('Wrong argument count for ' . $name . '().');
+    }
+}
+
+function resolveArrays($code) {
+    return preg_replace_callback(
+        '~' . PARAMS . '~',
+        function ($matches) {
+            $elements = magicSplit(
+                '(?:' . PARAMS . '|' . ARGS . ')(*SKIP)(*FAIL)|,',
+                $matches['params']
+            );
+
+            // don't convert [] to array, it might have different meaning
+            if (empty($elements)) {
+                return $matches[0];
+            }
+
+            $elementCodes = array();
+            foreach ($elements as $element) {
+                // convert only arrays where all elements have keys
+                if (false === strpos($element, ':')) {
+                    return $matches[0];
+                }
+
+                list($key, $value) = explode(':', $element, 2);
+                $elementCodes[] = "'" . $key . "' =>" . $value;
+            }
+
+            return 'array(' . implode(', ', $elementCodes) . ')';
+        },
+        $code
+    );
+}
+
+function resolveStackAccess($code) {
+    $code = preg_replace('/\$\d+/', '$this->semStack[$0]', $code);
+    $code = preg_replace('/#(\d+)/', '$$1', $code);
+    return $code;
+}
+
+function removeTrailingWhitespace($code) {
+    $lines = explode("\n", $code);
+    $lines = array_map('rtrim', $lines);
+    return implode("\n", $lines);
+}
+
+function ensureDirExists($dir) {
+    if (!is_dir($dir)) {
+        mkdir($dir, 0777, true);
+    }
+}
+
+//////////////////////////////
+/// Regex helper functions ///
+//////////////////////////////
+
+function regex($regex) {
+    return '~' . LIB . '(?:' . str_replace('~', '\~', $regex) . ')~';
+}
+
+function magicSplit($regex, $string) {
+    $pieces = preg_split(regex('(?:(?&string)|(?&comment)|(?&code))(*SKIP)(*FAIL)|' . $regex), $string);
+
+    foreach ($pieces as &$piece) {
+        $piece = trim($piece);
+    }
+
+    return array_filter($pieces);
+}
diff --git a/vendor/nikic/php-parser/grammar/zend_language_parser.phpy b/vendor/nikic/php-parser/grammar/zend_language_parser.phpy
new file mode 100644
index 0000000000..9a8cd5cc81
--- /dev/null
+++ b/vendor/nikic/php-parser/grammar/zend_language_parser.phpy
@@ -0,0 +1,994 @@
+%pure_parser
+%expect 2
+
+%left T_INCLUDE T_INCLUDE_ONCE T_EVAL T_REQUIRE T_REQUIRE_ONCE
+%left ','
+%left T_LOGICAL_OR
+%left T_LOGICAL_XOR
+%left T_LOGICAL_AND
+%right T_PRINT
+%right T_YIELD
+%right T_YIELD_FROM
+%left '=' T_PLUS_EQUAL T_MINUS_EQUAL T_MUL_EQUAL T_DIV_EQUAL T_CONCAT_EQUAL T_MOD_EQUAL T_AND_EQUAL T_OR_EQUAL T_XOR_EQUAL T_SL_EQUAL T_SR_EQUAL T_POW_EQUAL
+%left '?' ':'
+%right T_COALESCE
+%left T_BOOLEAN_OR
+%left T_BOOLEAN_AND
+%left '|'
+%left '^'
+%left '&'
+%nonassoc T_IS_EQUAL T_IS_NOT_EQUAL T_IS_IDENTICAL T_IS_NOT_IDENTICAL T_SPACESHIP
+%nonassoc '<' T_IS_SMALLER_OR_EQUAL '>' T_IS_GREATER_OR_EQUAL
+%left T_SL T_SR
+%left '+' '-' '.'
+%left '*' '/' '%'
+%right '!'
+%nonassoc T_INSTANCEOF
+%right '~' T_INC T_DEC T_INT_CAST T_DOUBLE_CAST T_STRING_CAST T_ARRAY_CAST T_OBJECT_CAST T_BOOL_CAST T_UNSET_CAST '@'
+%right T_POW
+%right '['
+%nonassoc T_NEW T_CLONE
+%token T_EXIT
+%token T_IF
+%left T_ELSEIF
+%left T_ELSE
+%left T_ENDIF
+%token T_LNUMBER
+%token T_DNUMBER
+%token T_STRING
+%token T_STRING_VARNAME
+%token T_VARIABLE
+%token T_NUM_STRING
+%token T_INLINE_HTML
+%token T_CHARACTER
+%token T_BAD_CHARACTER
+%token T_ENCAPSED_AND_WHITESPACE
+%token T_CONSTANT_ENCAPSED_STRING
+%token T_ECHO
+%token T_DO
+%token T_WHILE
+%token T_ENDWHILE
+%token T_FOR
+%token T_ENDFOR
+%token T_FOREACH
+%token T_ENDFOREACH
+%token T_DECLARE
+%token T_ENDDECLARE
+%token T_AS
+%token T_SWITCH
+%token T_ENDSWITCH
+%token T_CASE
+%token T_DEFAULT
+%token T_BREAK
+%token T_CONTINUE
+%token T_GOTO
+%token T_FUNCTION
+%token T_CONST
+%token T_RETURN
+%token T_TRY
+%token T_CATCH
+%token T_FINALLY
+%token T_THROW
+%token T_USE
+%token T_INSTEADOF
+%token T_GLOBAL
+%right T_STATIC T_ABSTRACT T_FINAL T_PRIVATE T_PROTECTED T_PUBLIC
+%token T_VAR
+%token T_UNSET
+%token T_ISSET
+%token T_EMPTY
+%token T_HALT_COMPILER
+%token T_CLASS
+%token T_TRAIT
+%token T_INTERFACE
+%token T_EXTENDS
+%token T_IMPLEMENTS
+%token T_OBJECT_OPERATOR
+%token T_DOUBLE_ARROW
+%token T_LIST
+%token T_ARRAY
+%token T_CALLABLE
+%token T_CLASS_C
+%token T_TRAIT_C
+%token T_METHOD_C
+%token T_FUNC_C
+%token T_LINE
+%token T_FILE
+%token T_COMMENT
+%token T_DOC_COMMENT
+%token T_OPEN_TAG
+%token T_OPEN_TAG_WITH_ECHO
+%token T_CLOSE_TAG
+%token T_WHITESPACE
+%token T_START_HEREDOC
+%token T_END_HEREDOC
+%token T_DOLLAR_OPEN_CURLY_BRACES
+%token T_CURLY_OPEN
+%token T_PAAMAYIM_NEKUDOTAYIM
+%token T_NAMESPACE
+%token T_NS_C
+%token T_DIR
+%token T_NS_SEPARATOR
+%token T_ELLIPSIS
+
+%{
+use PhpParser\Node\Expr;
+use PhpParser\Node\Name;
+use PhpParser\Node\Scalar;
+use PhpParser\Node\Stmt;
+%}
+
+%%
+
+start:
+    top_statement_list                                      { $$ = $this->handleNamespaces($1); }
+;
+
+top_statement_list:
+      top_statement_list top_statement                      { pushNormalizing($1, $2); }
+    | /* empty */                                           { init(); }
+;
+
+namespace_name_parts:
+      T_STRING                                              { init($1); }
+    | namespace_name_parts T_NS_SEPARATOR T_STRING          { push($1, $3); }
+;
+
+namespace_name:
+      namespace_name_parts                                  { $$ = Name[$1]; }
+;
+
+top_statement:
+      statement                                             { $$ = $1; }
+    | function_declaration_statement                        { $$ = $1; }
+    | class_declaration_statement                           { $$ = $1; }
+    | T_HALT_COMPILER
+          { $$ = Stmt\HaltCompiler[$this->lexer->handleHaltCompiler()]; }
+    | T_NAMESPACE namespace_name ';'                        { $$ = Stmt\Namespace_[$2, null]; }
+    | T_NAMESPACE namespace_name '{' top_statement_list '}' { $$ = Stmt\Namespace_[$2, $4]; }
+    | T_NAMESPACE '{' top_statement_list '}'                { $$ = Stmt\Namespace_[null,     $3]; }
+    | T_USE use_declarations ';'                            { $$ = Stmt\Use_[$2, Stmt\Use_::TYPE_NORMAL]; }
+    | T_USE T_FUNCTION use_declarations ';'                 { $$ = Stmt\Use_[$3, Stmt\Use_::TYPE_FUNCTION]; }
+    | T_USE T_CONST use_declarations ';'                    { $$ = Stmt\Use_[$3, Stmt\Use_::TYPE_CONSTANT]; }
+    | T_CONST constant_declaration_list ';'                 { $$ = Stmt\Const_[$2]; }
+;
+
+use_declarations:
+      use_declarations ',' use_declaration                  { push($1, $3); }
+    | use_declaration                                       { init($1); }
+;
+
+use_declaration:
+      namespace_name                                        { $$ = Stmt\UseUse[$1, null]; }
+    | namespace_name T_AS T_STRING                          { $$ = Stmt\UseUse[$1, $3]; }
+    | T_NS_SEPARATOR namespace_name                         { $$ = Stmt\UseUse[$2, null]; }
+    | T_NS_SEPARATOR namespace_name T_AS T_STRING           { $$ = Stmt\UseUse[$2, $4]; }
+;
+
+constant_declaration_list:
+      constant_declaration_list ',' constant_declaration    { push($1, $3); }
+    | constant_declaration                                  { init($1); }
+;
+
+constant_declaration:
+    T_STRING '=' static_scalar                              { $$ = Node\Const_[$1, $3]; }
+;
+
+inner_statement_list:
+      inner_statement_list inner_statement                  { pushNormalizing($1, $2); }
+    | /* empty */                                           { init(); }
+;
+
+inner_statement:
+      statement                                             { $$ = $1; }
+    | function_declaration_statement                        { $$ = $1; }
+    | class_declaration_statement                           { $$ = $1; }
+    | T_HALT_COMPILER
+          { throw new Error('__HALT_COMPILER() can only be used from the outermost scope', attributes()); }
+;
+
+statement:
+      '{' inner_statement_list '}'                          { $$ = $2; }
+    | T_IF parentheses_expr statement elseif_list else_single
+          { $$ = Stmt\If_[$2, [stmts: toArray($3), elseifs: $4, else: $5]]; }
+    | T_IF parentheses_expr ':' inner_statement_list new_elseif_list new_else_single T_ENDIF ';'
+          { $$ = Stmt\If_[$2, [stmts: $4, elseifs: $5, else: $6]]; }
+    | T_WHILE parentheses_expr while_statement              { $$ = Stmt\While_[$2, $3]; }
+    | T_DO statement T_WHILE parentheses_expr ';'           { $$ = Stmt\Do_   [$4, toArray($2)]; }
+    | T_FOR '(' for_expr ';'  for_expr ';' for_expr ')' for_statement
+          { $$ = Stmt\For_[[init: $3, cond: $5, loop: $7, stmts: $9]]; }
+    | T_SWITCH parentheses_expr switch_case_list            { $$ = Stmt\Switch_[$2, $3]; }
+    | T_BREAK ';'                                           { $$ = Stmt\Break_[null]; }
+    | T_BREAK expr ';'                                      { $$ = Stmt\Break_[$2]; }
+    | T_CONTINUE ';'                                        { $$ = Stmt\Continue_[null]; }
+    | T_CONTINUE expr ';'                                   { $$ = Stmt\Continue_[$2]; }
+    | T_RETURN ';'                                          { $$ = Stmt\Return_[null]; }
+    | T_RETURN expr ';'                                     { $$ = Stmt\Return_[$2]; }
+    | yield_expr ';'                                        { $$ = $1; }
+    | T_GLOBAL global_var_list ';'                          { $$ = Stmt\Global_[$2]; }
+    | T_STATIC static_var_list ';'                          { $$ = Stmt\Static_[$2]; }
+    | T_ECHO expr_list ';'                                  { $$ = Stmt\Echo_[$2]; }
+    | T_INLINE_HTML                                         { $$ = Stmt\InlineHTML[$1]; }
+    | expr ';'                                              { $$ = $1; }
+    | T_UNSET '(' variables_list ')' ';'                    { $$ = Stmt\Unset_[$3]; }
+    | T_FOREACH '(' expr T_AS foreach_variable ')' foreach_statement
+          { $$ = Stmt\Foreach_[$3, $5[0], [keyVar: null, byRef: $5[1], stmts: $7]]; }
+    | T_FOREACH '(' expr T_AS variable T_DOUBLE_ARROW foreach_variable ')' foreach_statement
+          { $$ = Stmt\Foreach_[$3, $7[0], [keyVar: $5, byRef: $7[1], stmts: $9]]; }
+    | T_DECLARE '(' declare_list ')' declare_statement      { $$ = Stmt\Declare_[$3, $5]; }
+    | ';'                                                   { $$ = array(); /* means: no statement */ }
+    | T_TRY '{' inner_statement_list '}' catches optional_finally
+          { $$ = Stmt\TryCatch[$3, $5, $6]; }
+    | T_THROW expr ';'                                      { $$ = Stmt\Throw_[$2]; }
+    | T_GOTO T_STRING ';'                                   { $$ = Stmt\Goto_[$2]; }
+    | T_STRING ':'                                          { $$ = Stmt\Label[$1]; }
+    | error                                                 { $$ = array(); /* means: no statement */ }
+;
+
+catches:
+      /* empty */                                           { init(); }
+    | catches catch                                         { push($1, $2); }
+;
+
+catch:
+    T_CATCH '(' name T_VARIABLE ')' '{' inner_statement_list '}'
+        { $$ = Stmt\Catch_[$3, parseVar($4), $7]; }
+;
+
+optional_finally:
+      /* empty */                                           { $$ = null; }
+    | T_FINALLY '{' inner_statement_list '}'                { $$ = $3; }
+;
+
+variables_list:
+      variable                                              { init($1); }
+    | variables_list ',' variable                           { push($1, $3); }
+;
+
+optional_ref:
+      /* empty */                                           { $$ = false; }
+    | '&'                                                   { $$ = true; }
+;
+
+optional_ellipsis:
+      /* empty */                                           { $$ = false; }
+    | T_ELLIPSIS                                            { $$ = true; }
+;
+
+function_declaration_statement:
+    T_FUNCTION optional_ref T_STRING '(' parameter_list ')' optional_return_type '{' inner_statement_list '}'
+        { $$ = Stmt\Function_[$3, [byRef: $2, params: $5, returnType: $7, stmts: $9]]; }
+;
+
+class_declaration_statement:
+      class_entry_type T_STRING extends_from implements_list '{' class_statement_list '}'
+          { $$ = Stmt\Class_[$2, [type: $1, extends: $3, implements: $4, stmts: $6]]; }
+    | T_INTERFACE T_STRING interface_extends_list '{' class_statement_list '}'
+          { $$ = Stmt\Interface_[$2, [extends: $3, stmts: $5]]; }
+    | T_TRAIT T_STRING '{' class_statement_list '}'
+          { $$ = Stmt\Trait_[$2, $4]; }
+;
+
+class_entry_type:
+      T_CLASS                                               { $$ = 0; }
+    | T_ABSTRACT T_CLASS                                    { $$ = Stmt\Class_::MODIFIER_ABSTRACT; }
+    | T_FINAL T_CLASS                                       { $$ = Stmt\Class_::MODIFIER_FINAL; }
+;
+
+extends_from:
+      /* empty */                                           { $$ = null; }
+    | T_EXTENDS name                                        { $$ = $2; }
+;
+
+interface_extends_list:
+      /* empty */                                           { $$ = array(); }
+    | T_EXTENDS name_list                                   { $$ = $2; }
+;
+
+implements_list:
+      /* empty */                                           { $$ = array(); }
+    | T_IMPLEMENTS name_list                                { $$ = $2; }
+;
+
+name_list:
+      name                                                  { init($1); }
+    | name_list ',' name                                    { push($1, $3); }
+;
+
+for_statement:
+      statement                                             { $$ = toArray($1); }
+    | ':' inner_statement_list T_ENDFOR ';'                 { $$ = $2; }
+;
+
+foreach_statement:
+      statement                                             { $$ = toArray($1); }
+    | ':' inner_statement_list T_ENDFOREACH ';'             { $$ = $2; }
+;
+
+declare_statement:
+      statement                                             { $$ = toArray($1); }
+    | ':' inner_statement_list T_ENDDECLARE ';'             { $$ = $2; }
+;
+
+declare_list:
+      declare_list_element                                  { init($1); }
+    | declare_list ',' declare_list_element                 { push($1, $3); }
+;
+
+declare_list_element:
+      T_STRING '=' static_scalar                            { $$ = Stmt\DeclareDeclare[$1, $3]; }
+;
+
+switch_case_list:
+      '{' case_list '}'                                     { $$ = $2; }
+    | '{' ';' case_list '}'                                 { $$ = $3; }
+    | ':' case_list T_ENDSWITCH ';'                         { $$ = $2; }
+    | ':' ';' case_list T_ENDSWITCH ';'                     { $$ = $3; }
+;
+
+case_list:
+      /* empty */                                           { init(); }
+    | case_list case                                        { push($1, $2); }
+;
+
+case:
+      T_CASE expr case_separator inner_statement_list       { $$ = Stmt\Case_[$2, $4]; }
+    | T_DEFAULT case_separator inner_statement_list         { $$ = Stmt\Case_[null, $3]; }
+;
+
+case_separator:
+      ':'
+    | ';'
+;
+
+while_statement:
+      statement                                             { $$ = toArray($1); }
+    | ':' inner_statement_list T_ENDWHILE ';'               { $$ = $2; }
+;
+
+elseif_list:
+      /* empty */                                           { init(); }
+    | elseif_list elseif                                    { push($1, $2); }
+;
+
+elseif:
+      T_ELSEIF parentheses_expr statement                   { $$ = Stmt\ElseIf_[$2, toArray($3)]; }
+;
+
+new_elseif_list:
+      /* empty */                                           { init(); }
+    | new_elseif_list new_elseif                            { push($1, $2); }
+;
+
+new_elseif:
+     T_ELSEIF parentheses_expr ':' inner_statement_list     { $$ = Stmt\ElseIf_[$2, $4]; }
+;
+
+else_single:
+      /* empty */                                           { $$ = null; }
+    | T_ELSE statement                                      { $$ = Stmt\Else_[toArray($2)]; }
+;
+
+new_else_single:
+      /* empty */                                           { $$ = null; }
+    | T_ELSE ':' inner_statement_list                       { $$ = Stmt\Else_[$3]; }
+;
+
+foreach_variable:
+      variable                                              { $$ = array($1, false); }
+    | '&' variable                                          { $$ = array($2, true); }
+    | list_expr                                             { $$ = array($1, false); }
+;
+
+parameter_list:
+      non_empty_parameter_list                              { $$ = $1; }
+    | /* empty */                                           { $$ = array(); }
+;
+
+non_empty_parameter_list:
+      parameter                                             { init($1); }
+    | non_empty_parameter_list ',' parameter                { push($1, $3); }
+;
+
+parameter:
+      optional_param_type optional_ref optional_ellipsis T_VARIABLE
+          { $$ = Node\Param[parseVar($4), null, $1, $2, $3]; }
+    | optional_param_type optional_ref optional_ellipsis T_VARIABLE '=' static_scalar
+          { $$ = Node\Param[parseVar($4), $6, $1, $2, $3]; }
+;
+
+type:
+      name                                                  { $$ = $1; }
+    | T_ARRAY                                               { $$ = 'array'; }
+    | T_CALLABLE                                            { $$ = 'callable'; }
+;
+
+optional_param_type:
+      /* empty */                                           { $$ = null; }
+    | type                                                  { $$ = $1; }
+;
+
+optional_return_type:
+      /* empty */                                           { $$ = null; }
+    | ':' type                                              { $$ = $2; }
+;
+
+argument_list:
+      '(' ')'                                               { $$ = array(); }
+    | '(' non_empty_argument_list ')'                       { $$ = $2; }
+    | '(' yield_expr ')'                                    { $$ = array(Node\Arg[$2, false, false]); }
+;
+
+non_empty_argument_list:
+      argument                                              { init($1); }
+    | non_empty_argument_list ',' argument                  { push($1, $3); }
+;
+
+argument:
+      expr                                                  { $$ = Node\Arg[$1, false, false]; }
+    | '&' variable                                          { $$ = Node\Arg[$2, true, false]; }
+    | T_ELLIPSIS expr                                       { $$ = Node\Arg[$2, false, true]; }
+;
+
+global_var_list:
+      global_var_list ',' global_var                        { push($1, $3); }
+    | global_var                                            { init($1); }
+;
+
+global_var:
+      T_VARIABLE                                            { $$ = Expr\Variable[parseVar($1)]; }
+    | '$' variable                                          { $$ = Expr\Variable[$2]; }
+    | '$' '{' expr '}'                                      { $$ = Expr\Variable[$3]; }
+;
+
+static_var_list:
+      static_var_list ',' static_var                        { push($1, $3); }
+    | static_var                                            { init($1); }
+;
+
+static_var:
+      T_VARIABLE                                            { $$ = Stmt\StaticVar[parseVar($1), null]; }
+    | T_VARIABLE '=' static_scalar                          { $$ = Stmt\StaticVar[parseVar($1), $3]; }
+;
+
+class_statement_list:
+      class_statement_list class_statement                  { push($1, $2); }
+    | /* empty */                                           { init(); }
+;
+
+class_statement:
+      variable_modifiers property_declaration_list ';'      { $$ = Stmt\Property[$1, $2]; }
+    | T_CONST constant_declaration_list ';'                 { $$ = Stmt\ClassConst[$2]; }
+    | method_modifiers T_FUNCTION optional_ref T_STRING '(' parameter_list ')' optional_return_type method_body
+          { $$ = Stmt\ClassMethod[$4, [type: $1, byRef: $3, params: $6, returnType: $8, stmts: $9]]; }
+    | T_USE name_list trait_adaptations                     { $$ = Stmt\TraitUse[$2, $3]; }
+;
+
+trait_adaptations:
+      ';'                                                   { $$ = array(); }
+    | '{' trait_adaptation_list '}'                         { $$ = $2; }
+;
+
+trait_adaptation_list:
+      /* empty */                                           { init(); }
+    | trait_adaptation_list trait_adaptation                { push($1, $2); }
+;
+
+trait_adaptation:
+      trait_method_reference_fully_qualified T_INSTEADOF name_list ';'
+          { $$ = Stmt\TraitUseAdaptation\Precedence[$1[0], $1[1], $3]; }
+    | trait_method_reference T_AS member_modifier T_STRING ';'
+          { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], $3, $4]; }
+    | trait_method_reference T_AS member_modifier ';'
+          { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], $3, null]; }
+    | trait_method_reference T_AS T_STRING ';'
+          { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], null, $3]; }
+;
+
+trait_method_reference_fully_qualified:
+      name T_PAAMAYIM_NEKUDOTAYIM T_STRING                  { $$ = array($1, $3); }
+;
+trait_method_reference:
+      trait_method_reference_fully_qualified                { $$ = $1; }
+    | T_STRING                                              { $$ = array(null, $1); }
+;
+
+method_body:
+      ';' /* abstract method */                             { $$ = null; }
+    | '{' inner_statement_list '}'                          { $$ = $2; }
+;
+
+variable_modifiers:
+      non_empty_member_modifiers                            { $$ = $1; }
+    | T_VAR                                                 { $$ = 0; }
+;
+
+method_modifiers:
+      /* empty */                                           { $$ = 0; }
+    | non_empty_member_modifiers                            { $$ = $1; }
+;
+
+non_empty_member_modifiers:
+      member_modifier                                       { $$ = $1; }
+    | non_empty_member_modifiers member_modifier            { Stmt\Class_::verifyModifier($1, $2); $$ = $1 | $2; }
+;
+
+member_modifier:
+      T_PUBLIC                                              { $$ = Stmt\Class_::MODIFIER_PUBLIC; }
+    | T_PROTECTED                                           { $$ = Stmt\Class_::MODIFIER_PROTECTED; }
+    | T_PRIVATE                                             { $$ = Stmt\Class_::MODIFIER_PRIVATE; }
+    | T_STATIC                                              { $$ = Stmt\Class_::MODIFIER_STATIC; }
+    | T_ABSTRACT                                            { $$ = Stmt\Class_::MODIFIER_ABSTRACT; }
+    | T_FINAL                                               { $$ = Stmt\Class_::MODIFIER_FINAL; }
+;
+
+property_declaration_list:
+      property_declaration                                  { init($1); }
+    | property_declaration_list ',' property_declaration    { push($1, $3); }
+;
+
+property_declaration:
+      T_VARIABLE                                            { $$ = Stmt\PropertyProperty[parseVar($1), null]; }
+    | T_VARIABLE '=' static_scalar                          { $$ = Stmt\PropertyProperty[parseVar($1), $3]; }
+;
+
+expr_list:
+      expr_list ',' expr                                    { push($1, $3); }
+    | expr                                                  { init($1); }
+;
+
+for_expr:
+      /* empty */                                           { $$ = array(); }
+    | expr_list                                             { $$ = $1; }
+;
+
+expr:
+      variable                                              { $$ = $1; }
+    | list_expr '=' expr                                    { $$ = Expr\Assign[$1, $3]; }
+    | variable '=' expr                                     { $$ = Expr\Assign[$1, $3]; }
+    | variable '=' '&' variable                             { $$ = Expr\AssignRef[$1, $4]; }
+    | variable '=' '&' new_expr                             { $$ = Expr\AssignRef[$1, $4]; }
+    | new_expr                                              { $$ = $1; }
+    | T_CLONE expr                                          { $$ = Expr\Clone_[$2]; }
+    | variable T_PLUS_EQUAL expr                            { $$ = Expr\AssignOp\Plus      [$1, $3]; }
+    | variable T_MINUS_EQUAL expr                           { $$ = Expr\AssignOp\Minus     [$1, $3]; }
+    | variable T_MUL_EQUAL expr                             { $$ = Expr\AssignOp\Mul       [$1, $3]; }
+    | variable T_DIV_EQUAL expr                             { $$ = Expr\AssignOp\Div       [$1, $3]; }
+    | variable T_CONCAT_EQUAL expr                          { $$ = Expr\AssignOp\Concat    [$1, $3]; }
+    | variable T_MOD_EQUAL expr                             { $$ = Expr\AssignOp\Mod       [$1, $3]; }
+    | variable T_AND_EQUAL expr                             { $$ = Expr\AssignOp\BitwiseAnd[$1, $3]; }
+    | variable T_OR_EQUAL expr                              { $$ = Expr\AssignOp\BitwiseOr [$1, $3]; }
+    | variable T_XOR_EQUAL expr                             { $$ = Expr\AssignOp\BitwiseXor[$1, $3]; }
+    | variable T_SL_EQUAL expr                              { $$ = Expr\AssignOp\ShiftLeft [$1, $3]; }
+    | variable T_SR_EQUAL expr                              { $$ = Expr\AssignOp\ShiftRight[$1, $3]; }
+    | variable T_POW_EQUAL expr                             { $$ = Expr\AssignOp\Pow       [$1, $3]; }
+    | variable T_INC                                        { $$ = Expr\PostInc[$1]; }
+    | T_INC variable                                        { $$ = Expr\PreInc [$2]; }
+    | variable T_DEC                                        { $$ = Expr\PostDec[$1]; }
+    | T_DEC variable                                        { $$ = Expr\PreDec [$2]; }
+    | expr T_BOOLEAN_OR expr                                { $$ = Expr\BinaryOp\BooleanOr [$1, $3]; }
+    | expr T_BOOLEAN_AND expr                               { $$ = Expr\BinaryOp\BooleanAnd[$1, $3]; }
+    | expr T_LOGICAL_OR expr                                { $$ = Expr\BinaryOp\LogicalOr [$1, $3]; }
+    | expr T_LOGICAL_AND expr                               { $$ = Expr\BinaryOp\LogicalAnd[$1, $3]; }
+    | expr T_LOGICAL_XOR expr                               { $$ = Expr\BinaryOp\LogicalXor[$1, $3]; }
+    | expr '|' expr                                         { $$ = Expr\BinaryOp\BitwiseOr [$1, $3]; }
+    | expr '&' expr                                         { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; }
+    | expr '^' expr                                         { $$ = Expr\BinaryOp\BitwiseXor[$1, $3]; }
+    | expr '.' expr                                         { $$ = Expr\BinaryOp\Concat    [$1, $3]; }
+    | expr '+' expr                                         { $$ = Expr\BinaryOp\Plus      [$1, $3]; }
+    | expr '-' expr                                         { $$ = Expr\BinaryOp\Minus     [$1, $3]; }
+    | expr '*' expr                                         { $$ = Expr\BinaryOp\Mul       [$1, $3]; }
+    | expr '/' expr                                         { $$ = Expr\BinaryOp\Div       [$1, $3]; }
+    | expr '%' expr                                         { $$ = Expr\BinaryOp\Mod       [$1, $3]; }
+    | expr T_SL expr                                        { $$ = Expr\BinaryOp\ShiftLeft [$1, $3]; }
+    | expr T_SR expr                                        { $$ = Expr\BinaryOp\ShiftRight[$1, $3]; }
+    | expr T_POW expr                                       { $$ = Expr\BinaryOp\Pow       [$1, $3]; }
+    | '+' expr %prec T_INC                                  { $$ = Expr\UnaryPlus [$2]; }
+    | '-' expr %prec T_INC                                  { $$ = Expr\UnaryMinus[$2]; }
+    | '!' expr                                              { $$ = Expr\BooleanNot[$2]; }
+    | '~' expr                                              { $$ = Expr\BitwiseNot[$2]; }
+    | expr T_IS_IDENTICAL expr                              { $$ = Expr\BinaryOp\Identical     [$1, $3]; }
+    | expr T_IS_NOT_IDENTICAL expr                          { $$ = Expr\BinaryOp\NotIdentical  [$1, $3]; }
+    | expr T_IS_EQUAL expr                                  { $$ = Expr\BinaryOp\Equal         [$1, $3]; }
+    | expr T_IS_NOT_EQUAL expr                              { $$ = Expr\BinaryOp\NotEqual      [$1, $3]; }
+    | expr T_SPACESHIP expr                                 { $$ = Expr\BinaryOp\Spaceship     [$1, $3]; }
+    | expr '<' expr                                         { $$ = Expr\BinaryOp\Smaller       [$1, $3]; }
+    | expr T_IS_SMALLER_OR_EQUAL expr                       { $$ = Expr\BinaryOp\SmallerOrEqual[$1, $3]; }
+    | expr '>' expr                                         { $$ = Expr\BinaryOp\Greater       [$1, $3]; }
+    | expr T_IS_GREATER_OR_EQUAL expr                       { $$ = Expr\BinaryOp\GreaterOrEqual[$1, $3]; }
+    | expr T_INSTANCEOF class_name_reference                { $$ = Expr\Instanceof_[$1, $3]; }
+    | parentheses_expr                                      { $$ = $1; }
+    /* we need a separate '(' new_expr ')' rule to avoid problems caused by a s/r conflict */
+    | '(' new_expr ')'                                      { $$ = $2; }
+    | expr '?' expr ':' expr                                { $$ = Expr\Ternary[$1, $3,   $5]; }
+    | expr '?' ':' expr                                     { $$ = Expr\Ternary[$1, null, $4]; }
+    | expr T_COALESCE expr                                  { $$ = Expr\BinaryOp\Coalesce[$1, $3]; }
+    | T_ISSET '(' variables_list ')'                        { $$ = Expr\Isset_[$3]; }
+    | T_EMPTY '(' expr ')'                                  { $$ = Expr\Empty_[$3]; }
+    | T_INCLUDE expr                                        { $$ = Expr\Include_[$2, Expr\Include_::TYPE_INCLUDE]; }
+    | T_INCLUDE_ONCE expr                                   { $$ = Expr\Include_[$2, Expr\Include_::TYPE_INCLUDE_ONCE]; }
+    | T_EVAL parentheses_expr                               { $$ = Expr\Eval_[$2]; }
+    | T_REQUIRE expr                                        { $$ = Expr\Include_[$2, Expr\Include_::TYPE_REQUIRE]; }
+    | T_REQUIRE_ONCE expr                                   { $$ = Expr\Include_[$2, Expr\Include_::TYPE_REQUIRE_ONCE]; }
+    | T_INT_CAST expr                                       { $$ = Expr\Cast\Int_    [$2]; }
+    | T_DOUBLE_CAST expr                                    { $$ = Expr\Cast\Double  [$2]; }
+    | T_STRING_CAST expr                                    { $$ = Expr\Cast\String_ [$2]; }
+    | T_ARRAY_CAST expr                                     { $$ = Expr\Cast\Array_  [$2]; }
+    | T_OBJECT_CAST expr                                    { $$ = Expr\Cast\Object_ [$2]; }
+    | T_BOOL_CAST expr                                      { $$ = Expr\Cast\Bool_   [$2]; }
+    | T_UNSET_CAST expr                                     { $$ = Expr\Cast\Unset_  [$2]; }
+    | T_EXIT exit_expr                                      { $$ = Expr\Exit_        [$2]; }
+    | '@' expr                                              { $$ = Expr\ErrorSuppress[$2]; }
+    | scalar                                                { $$ = $1; }
+    | array_expr                                            { $$ = $1; }
+    | scalar_dereference                                    { $$ = $1; }
+    | '`' backticks_expr '`'                                { $$ = Expr\ShellExec[$2]; }
+    | T_PRINT expr                                          { $$ = Expr\Print_[$2]; }
+    | T_YIELD                                               { $$ = Expr\Yield_[null, null]; }
+    | T_YIELD_FROM expr                                     { $$ = Expr\YieldFrom[$2]; }
+    | T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type
+      '{' inner_statement_list '}'
+          { $$ = Expr\Closure[[static: false, byRef: $2, params: $4, uses: $6, returnType: $7, stmts: $9]]; }
+    | T_STATIC T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type
+      '{' inner_statement_list '}'
+          { $$ = Expr\Closure[[static: true, byRef: $3, params: $5, uses: $7, returnType: $8, stmts: $10]]; }
+;
+
+parentheses_expr:
+      '(' expr ')'                                          { $$ = $2; }
+    | '(' yield_expr ')'                                    { $$ = $2; }
+;
+
+yield_expr:
+      T_YIELD expr                                          { $$ = Expr\Yield_[$2, null]; }
+    | T_YIELD expr T_DOUBLE_ARROW expr                      { $$ = Expr\Yield_[$4, $2]; }
+;
+
+array_expr:
+      T_ARRAY '(' array_pair_list ')'                       { $$ = Expr\Array_[$3]; }
+    | '[' array_pair_list ']'                               { $$ = Expr\Array_[$2]; }
+;
+
+scalar_dereference:
+      array_expr '[' dim_offset ']'                         { $$ = Expr\ArrayDimFetch[$1, $3]; }
+    | T_CONSTANT_ENCAPSED_STRING '[' dim_offset ']'
+          { $$ = Expr\ArrayDimFetch[Scalar\String_[Scalar\String_::parse($1)], $3]; }
+    | constant '[' dim_offset ']'                           { $$ = Expr\ArrayDimFetch[$1, $3]; }
+    | scalar_dereference '[' dim_offset ']'                 { $$ = Expr\ArrayDimFetch[$1, $3]; }
+    /* alternative array syntax missing intentionally */
+;
+
+anonymous_class:
+      T_CLASS ctor_arguments extends_from implements_list '{' class_statement_list '}'
+          { $$ = array(Stmt\Class_[null, [type: 0, extends: $3, implements: $4, stmts: $6]], $2); }
+
+new_expr:
+      T_NEW class_name_reference ctor_arguments             { $$ = Expr\New_[$2, $3]; }
+    | T_NEW anonymous_class
+          { list($class, $ctorArgs) = $2; $$ = Expr\New_[$class, $ctorArgs]; }
+;
+
+lexical_vars:
+      /* empty */                                           { $$ = array(); }
+    | T_USE '(' lexical_var_list ')'                        { $$ = $3; }
+;
+
+lexical_var_list:
+      lexical_var                                           { init($1); }
+    | lexical_var_list ',' lexical_var                      { push($1, $3); }
+;
+
+lexical_var:
+      optional_ref T_VARIABLE                               { $$ = Expr\ClosureUse[parseVar($2), $1]; }
+;
+
+function_call:
+      name argument_list                                    { $$ = Expr\FuncCall[$1, $2]; }
+    | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM T_STRING argument_list
+          { $$ = Expr\StaticCall[$1, $3, $4]; }
+    | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM '{' expr '}' argument_list
+          { $$ = Expr\StaticCall[$1, $4, $6]; }
+    | static_property argument_list {
+            if ($1 instanceof Node\Expr\StaticPropertyFetch) {
+                $$ = Expr\StaticCall[$1->class, Expr\Variable[$1->name], $2];
+            } elseif ($1 instanceof Node\Expr\ArrayDimFetch) {
+                $tmp = $1;
+                while ($tmp->var instanceof Node\Expr\ArrayDimFetch) {
+                    $tmp = $tmp->var;
+                }
+
+                $$ = Expr\StaticCall[$tmp->var->class, $1, $2];
+                $tmp->var = Expr\Variable[$tmp->var->name];
+            } else {
+                throw new \Exception;
+            }
+          }
+    | variable_without_objects argument_list
+          { $$ = Expr\FuncCall[$1, $2]; }
+    | function_call '[' dim_offset ']'                      { $$ = Expr\ArrayDimFetch[$1, $3]; }
+      /* alternative array syntax missing intentionally */
+;
+
+class_name:
+      T_STATIC                                              { $$ = Name[$1]; }
+    | name                                                  { $$ = $1; }
+;
+
+name:
+      namespace_name_parts                                  { $$ = Name[$1]; }
+    | T_NS_SEPARATOR namespace_name_parts                   { $$ = Name\FullyQualified[$2]; }
+    | T_NAMESPACE T_NS_SEPARATOR namespace_name_parts       { $$ = Name\Relative[$3]; }
+;
+
+class_name_reference:
+      class_name                                            { $$ = $1; }
+    | dynamic_class_name_reference                          { $$ = $1; }
+;
+
+dynamic_class_name_reference:
+      object_access_for_dcnr                                { $$ = $1; }
+    | base_variable                                         { $$ = $1; }
+;
+
+class_name_or_var:
+      class_name                                            { $$ = $1; }
+    | reference_variable                                    { $$ = $1; }
+;
+
+object_access_for_dcnr:
+      base_variable T_OBJECT_OPERATOR object_property
+          { $$ = Expr\PropertyFetch[$1, $3]; }
+    | object_access_for_dcnr T_OBJECT_OPERATOR object_property
+          { $$ = Expr\PropertyFetch[$1, $3]; }
+    | object_access_for_dcnr '[' dim_offset ']'             { $$ = Expr\ArrayDimFetch[$1, $3]; }
+    | object_access_for_dcnr '{' expr '}'                   { $$ = Expr\ArrayDimFetch[$1, $3]; }
+;
+
+exit_expr:
+      /* empty */                                           { $$ = null; }
+    | '(' ')'                                               { $$ = null; }
+    | parentheses_expr                                      { $$ = $1; }
+;
+
+backticks_expr:
+      /* empty */                                           { $$ = array(); }
+    | T_ENCAPSED_AND_WHITESPACE                             { $$ = array(Scalar\String_::parseEscapeSequences($1, '`')); }
+    | encaps_list                                           { parseEncapsed($1, '`'); $$ = $1; }
+;
+
+ctor_arguments:
+      /* empty */                                           { $$ = array(); }
+    | argument_list                                         { $$ = $1; }
+;
+
+common_scalar:
+      T_LNUMBER                                             { $$ = Scalar\LNumber[Scalar\LNumber::parse($1)]; }
+    | T_DNUMBER                                             { $$ = Scalar\DNumber[Scalar\DNumber::parse($1)]; }
+    | T_CONSTANT_ENCAPSED_STRING                            { $$ = Scalar\String_[Scalar\String_::parse($1)]; }
+    | T_LINE                                                { $$ = Scalar\MagicConst\Line[]; }
+    | T_FILE                                                { $$ = Scalar\MagicConst\File[]; }
+    | T_DIR                                                 { $$ = Scalar\MagicConst\Dir[]; }
+    | T_CLASS_C                                             { $$ = Scalar\MagicConst\Class_[]; }
+    | T_TRAIT_C                                             { $$ = Scalar\MagicConst\Trait_[]; }
+    | T_METHOD_C                                            { $$ = Scalar\MagicConst\Method[]; }
+    | T_FUNC_C                                              { $$ = Scalar\MagicConst\Function_[]; }
+    | T_NS_C                                                { $$ = Scalar\MagicConst\Namespace_[]; }
+    | T_START_HEREDOC T_ENCAPSED_AND_WHITESPACE T_END_HEREDOC
+          { $$ = Scalar\String_[Scalar\String_::parseDocString($1, $2)]; }
+    | T_START_HEREDOC T_END_HEREDOC
+          { $$ = Scalar\String_['']; }
+;
+
+static_scalar:
+      common_scalar                                         { $$ = $1; }
+    | class_name T_PAAMAYIM_NEKUDOTAYIM class_const_name    { $$ = Expr\ClassConstFetch[$1, $3]; }
+    | name                                                  { $$ = Expr\ConstFetch[$1]; }
+    | T_ARRAY '(' static_array_pair_list ')'                { $$ = Expr\Array_[$3]; }
+    | '[' static_array_pair_list ']'                        { $$ = Expr\Array_[$2]; }
+    | static_operation                                      { $$ = $1; }
+;
+
+static_operation:
+      static_scalar T_BOOLEAN_OR static_scalar              { $$ = Expr\BinaryOp\BooleanOr [$1, $3]; }
+    | static_scalar T_BOOLEAN_AND static_scalar             { $$ = Expr\BinaryOp\BooleanAnd[$1, $3]; }
+    | static_scalar T_LOGICAL_OR static_scalar              { $$ = Expr\BinaryOp\LogicalOr [$1, $3]; }
+    | static_scalar T_LOGICAL_AND static_scalar             { $$ = Expr\BinaryOp\LogicalAnd[$1, $3]; }
+    | static_scalar T_LOGICAL_XOR static_scalar             { $$ = Expr\BinaryOp\LogicalXor[$1, $3]; }
+    | static_scalar '|' static_scalar                       { $$ = Expr\BinaryOp\BitwiseOr [$1, $3]; }
+    | static_scalar '&' static_scalar                       { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; }
+    | static_scalar '^' static_scalar                       { $$ = Expr\BinaryOp\BitwiseXor[$1, $3]; }
+    | static_scalar '.' static_scalar                       { $$ = Expr\BinaryOp\Concat    [$1, $3]; }
+    | static_scalar '+' static_scalar                       { $$ = Expr\BinaryOp\Plus      [$1, $3]; }
+    | static_scalar '-' static_scalar                       { $$ = Expr\BinaryOp\Minus     [$1, $3]; }
+    | static_scalar '*' static_scalar                       { $$ = Expr\BinaryOp\Mul       [$1, $3]; }
+    | static_scalar '/' static_scalar                       { $$ = Expr\BinaryOp\Div       [$1, $3]; }
+    | static_scalar '%' static_scalar                       { $$ = Expr\BinaryOp\Mod       [$1, $3]; }
+    | static_scalar T_SL static_scalar                      { $$ = Expr\BinaryOp\ShiftLeft [$1, $3]; }
+    | static_scalar T_SR static_scalar                      { $$ = Expr\BinaryOp\ShiftRight[$1, $3]; }
+    | static_scalar T_POW static_scalar                     { $$ = Expr\BinaryOp\Pow       [$1, $3]; }
+    | '+' static_scalar %prec T_INC                         { $$ = Expr\UnaryPlus [$2]; }
+    | '-' static_scalar %prec T_INC                         { $$ = Expr\UnaryMinus[$2]; }
+    | '!' static_scalar                                     { $$ = Expr\BooleanNot[$2]; }
+    | '~' static_scalar                                     { $$ = Expr\BitwiseNot[$2]; }
+    | static_scalar T_IS_IDENTICAL static_scalar            { $$ = Expr\BinaryOp\Identical     [$1, $3]; }
+    | static_scalar T_IS_NOT_IDENTICAL static_scalar        { $$ = Expr\BinaryOp\NotIdentical  [$1, $3]; }
+    | static_scalar T_IS_EQUAL static_scalar                { $$ = Expr\BinaryOp\Equal         [$1, $3]; }
+    | static_scalar T_IS_NOT_EQUAL static_scalar            { $$ = Expr\BinaryOp\NotEqual      [$1, $3]; }
+    | static_scalar '<' static_scalar                       { $$ = Expr\BinaryOp\Smaller       [$1, $3]; }
+    | static_scalar T_IS_SMALLER_OR_EQUAL static_scalar     { $$ = Expr\BinaryOp\SmallerOrEqual[$1, $3]; }
+    | static_scalar '>' static_scalar                       { $$ = Expr\BinaryOp\Greater       [$1, $3]; }
+    | static_scalar T_IS_GREATER_OR_EQUAL static_scalar     { $$ = Expr\BinaryOp\GreaterOrEqual[$1, $3]; }
+    | static_scalar '?' static_scalar ':' static_scalar     { $$ = Expr\Ternary[$1, $3,   $5]; }
+    | static_scalar '?' ':' static_scalar                   { $$ = Expr\Ternary[$1, null, $4]; }
+    | static_scalar '[' static_scalar ']'                   { $$ = Expr\ArrayDimFetch[$1, $3]; }
+    | '(' static_scalar ')'                                 { $$ = $2; }
+;
+
+constant:
+      name                                                  { $$ = Expr\ConstFetch[$1]; }
+    | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM class_const_name
+          { $$ = Expr\ClassConstFetch[$1, $3]; }
+;
+
+scalar:
+      common_scalar                                         { $$ = $1; }
+    | constant                                              { $$ = $1; }
+    | '"' encaps_list '"'
+          { parseEncapsed($2, '"'); $$ = Scalar\Encapsed[$2]; }
+    | T_START_HEREDOC encaps_list T_END_HEREDOC
+          { parseEncapsedDoc($2); $$ = Scalar\Encapsed[$2]; }
+;
+
+class_const_name:
+      T_STRING                                              { $$ = $1; }
+    | T_CLASS                                               { $$ = 'class'; }
+;
+
+static_array_pair_list:
+      /* empty */                                           { $$ = array(); }
+    | non_empty_static_array_pair_list optional_comma       { $$ = $1; }
+;
+
+optional_comma:
+      /* empty */
+    | ','
+;
+
+non_empty_static_array_pair_list:
+      non_empty_static_array_pair_list ',' static_array_pair { push($1, $3); }
+    | static_array_pair                                      { init($1); }
+;
+
+static_array_pair:
+      static_scalar T_DOUBLE_ARROW static_scalar            { $$ = Expr\ArrayItem[$3, $1,   false]; }
+    | static_scalar                                         { $$ = Expr\ArrayItem[$1, null, false]; }
+;
+
+variable:
+      object_access                                         { $$ = $1; }
+    | base_variable                                         { $$ = $1; }
+    | function_call                                         { $$ = $1; }
+    | new_expr_array_deref                                  { $$ = $1; }
+;
+
+new_expr_array_deref:
+      '(' new_expr ')' '[' dim_offset ']'                   { $$ = Expr\ArrayDimFetch[$2, $5]; }
+    | new_expr_array_deref '[' dim_offset ']'               { $$ = Expr\ArrayDimFetch[$1, $3]; }
+      /* alternative array syntax missing intentionally */
+;
+
+object_access:
+      variable_or_new_expr T_OBJECT_OPERATOR object_property
+          { $$ = Expr\PropertyFetch[$1, $3]; }
+    | variable_or_new_expr T_OBJECT_OPERATOR object_property argument_list
+          { $$ = Expr\MethodCall[$1, $3, $4]; }
+    | object_access argument_list                           { $$ = Expr\FuncCall[$1, $2]; }
+    | object_access '[' dim_offset ']'                      { $$ = Expr\ArrayDimFetch[$1, $3]; }
+    | object_access '{' expr '}'                            { $$ = Expr\ArrayDimFetch[$1, $3]; }
+;
+
+variable_or_new_expr:
+      variable                                              { $$ = $1; }
+    | '(' new_expr ')'                                      { $$ = $2; }
+;
+
+variable_without_objects:
+      reference_variable                                    { $$ = $1; }
+    | '$' variable_without_objects                          { $$ = Expr\Variable[$2]; }
+;
+
+base_variable:
+      variable_without_objects                              { $$ = $1; }
+    | static_property                                       { $$ = $1; }
+;
+
+static_property:
+      class_name_or_var T_PAAMAYIM_NEKUDOTAYIM '$' reference_variable
+          { $$ = Expr\StaticPropertyFetch[$1, $4]; }
+    | static_property_with_arrays                           { $$ = $1; }
+;
+
+static_property_with_arrays:
+      class_name_or_var T_PAAMAYIM_NEKUDOTAYIM T_VARIABLE
+          { $$ = Expr\StaticPropertyFetch[$1, parseVar($3)]; }
+    | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM '$' '{' expr '}'
+          { $$ = Expr\StaticPropertyFetch[$1, $5]; }
+    | static_property_with_arrays '[' dim_offset ']'        { $$ = Expr\ArrayDimFetch[$1, $3]; }
+    | static_property_with_arrays '{' expr '}'              { $$ = Expr\ArrayDimFetch[$1, $3]; }
+;
+
+reference_variable:
+      reference_variable '[' dim_offset ']'                 { $$ = Expr\ArrayDimFetch[$1, $3]; }
+    | reference_variable '{' expr '}'                       { $$ = Expr\ArrayDimFetch[$1, $3]; }
+    | T_VARIABLE                                            { $$ = Expr\Variable[parseVar($1)]; }
+    | '$' '{' expr '}'                                      { $$ = Expr\Variable[$3]; }
+;
+
+dim_offset:
+      /* empty */                                           { $$ = null; }
+    | expr                                                  { $$ = $1; }
+;
+
+object_property:
+      T_STRING                                              { $$ = $1; }
+    | '{' expr '}'                                          { $$ = $2; }
+    | variable_without_objects                              { $$ = $1; }
+;
+
+list_expr:
+      T_LIST '(' list_expr_elements ')'                     { $$ = Expr\List_[$3]; }
+;
+
+list_expr_elements:
+      list_expr_elements ',' list_expr_element              { push($1, $3); }
+    | list_expr_element                                     { init($1); }
+;
+
+list_expr_element:
+      variable                                              { $$ = $1; }
+    | list_expr                                             { $$ = $1; }
+    | /* empty */                                           { $$ = null; }
+;
+
+array_pair_list:
+      /* empty */                                           { $$ = array(); }
+    | non_empty_array_pair_list optional_comma              { $$ = $1; }
+;
+
+non_empty_array_pair_list:
+      non_empty_array_pair_list ',' array_pair              { push($1, $3); }
+    | array_pair                                            { init($1); }
+;
+
+array_pair:
+      expr T_DOUBLE_ARROW expr                              { $$ = Expr\ArrayItem[$3, $1,   false]; }
+    | expr                                                  { $$ = Expr\ArrayItem[$1, null, false]; }
+    | expr T_DOUBLE_ARROW '&' variable                      { $$ = Expr\ArrayItem[$4, $1,   true]; }
+    | '&' variable                                          { $$ = Expr\ArrayItem[$2, null, true]; }
+;
+
+encaps_list:
+      encaps_list encaps_var                                { push($1, $2); }
+    | encaps_list T_ENCAPSED_AND_WHITESPACE                 { push($1, $2); }
+    | encaps_var                                            { init($1); }
+    | T_ENCAPSED_AND_WHITESPACE encaps_var                  { init($1, $2); }
+;
+
+encaps_var:
+      T_VARIABLE                                            { $$ = Expr\Variable[parseVar($1)]; }
+    | T_VARIABLE '[' encaps_var_offset ']'                  { $$ = Expr\ArrayDimFetch[Expr\Variable[parseVar($1)], $3]; }
+    | T_VARIABLE T_OBJECT_OPERATOR T_STRING                 { $$ = Expr\PropertyFetch[Expr\Variable[parseVar($1)], $3]; }
+    | T_DOLLAR_OPEN_CURLY_BRACES expr '}'                   { $$ = Expr\Variable[$2]; }
+    | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME '}'       { $$ = Expr\Variable[$2]; }
+    | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME '[' expr ']' '}'
+          { $$ = Expr\ArrayDimFetch[Expr\Variable[$2], $4]; }
+    | T_CURLY_OPEN variable '}'                             { $$ = $2; }
+;
+
+encaps_var_offset:
+      T_STRING                                              { $$ = Scalar\String_[$1]; }
+    | T_NUM_STRING                                          { $$ = Scalar\String_[$1]; }
+    | T_VARIABLE                                            { $$ = Expr\Variable[parseVar($1)]; }
+;
+
+%%
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Autoloader.php b/vendor/nikic/php-parser/lib/PhpParser/Autoloader.php
new file mode 100644
index 0000000000..7cf6417253
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Autoloader.php
@@ -0,0 +1,275 @@
+=');
+    }
+
+    /**
+     * Handles autoloading of classes.
+     *
+     * @param string $class A class name.
+     */
+    static public function autoload($class) {
+        if (0 === strpos($class, 'PhpParser\\')) {
+            if (isset(self::$php7AliasesOldToNew[$class])) {
+                if (self::$runningOnPhp7) {
+                    return;
+                }
+
+                // Load the new class, alias will be registered afterwards
+                $class = self::$php7AliasesOldToNew[$class];
+            }
+
+            $fileName = dirname(__DIR__) . '/' . strtr($class, '\\', '/') . '.php';
+            if (file_exists($fileName)) {
+                require $fileName;
+            }
+
+            if (isset(self::$php7AliasesNewToOld[$class])) {
+                // New class name was used, register alias for old one, otherwise
+                // it won't be usable in "instanceof" and other non-autoloading places.
+                if (!self::$runningOnPhp7) {
+                    class_alias($class, self::$php7AliasesNewToOld[$class]);
+                }
+            }
+        } else if (0 === strpos($class, 'PHPParser_')) {
+            if (isset(self::$nonNamespacedAliases[$class])) {
+                // Register all aliases at once to avoid dependency issues
+                self::registerNonNamespacedAliases();
+            }
+        }
+    }
+
+    private static function registerNonNamespacedAliases() {
+        foreach (self::$nonNamespacedAliases as $old => $new) {
+            class_alias($new, $old);
+        }
+    }
+
+    private static $php7AliasesOldToNew = array(
+        'PhpParser\Node\Expr\Cast\Bool' => 'PhpParser\Node\Expr\Cast\Bool_',
+        'PhpParser\Node\Expr\Cast\Int' => 'PhpParser\Node\Expr\Cast\Int_',
+        'PhpParser\Node\Expr\Cast\Object' => 'PhpParser\Node\Expr\Cast\Object_',
+        'PhpParser\Node\Expr\Cast\String' => 'PhpParser\Node\Expr\Cast\String_',
+        'PhpParser\Node\Scalar\String' => 'PhpParser\Node\Scalar\String_',
+    );
+
+    private static $php7AliasesNewToOld = array(
+        'PhpParser\Node\Expr\Cast\Bool_' => 'PhpParser\Node\Expr\Cast\Bool',
+        'PhpParser\Node\Expr\Cast\Int_' => 'PhpParser\Node\Expr\Cast\Int',
+        'PhpParser\Node\Expr\Cast\Object_' => 'PhpParser\Node\Expr\Cast\Object',
+        'PhpParser\Node\Expr\Cast\String_' => 'PhpParser\Node\Expr\Cast\String',
+        'PhpParser\Node\Scalar\String_' => 'PhpParser\Node\Scalar\String',
+    );
+
+    private static $nonNamespacedAliases = array(
+        'PHPParser_Builder' => 'PhpParser\Builder',
+        'PHPParser_BuilderAbstract' => 'PhpParser\BuilderAbstract',
+        'PHPParser_BuilderFactory' => 'PhpParser\BuilderFactory',
+        'PHPParser_Comment' => 'PhpParser\Comment',
+        'PHPParser_Comment_Doc' => 'PhpParser\Comment\Doc',
+        'PHPParser_Error' => 'PhpParser\Error',
+        'PHPParser_Lexer' => 'PhpParser\Lexer',
+        'PHPParser_Lexer_Emulative' => 'PhpParser\Lexer\Emulative',
+        'PHPParser_Node' => 'PhpParser\Node',
+        'PHPParser_NodeAbstract' => 'PhpParser\NodeAbstract',
+        'PHPParser_NodeDumper' => 'PhpParser\NodeDumper',
+        'PHPParser_NodeTraverser' => 'PhpParser\NodeTraverser',
+        'PHPParser_NodeTraverserInterface' => 'PhpParser\NodeTraverserInterface',
+        'PHPParser_NodeVisitor' => 'PhpParser\NodeVisitor',
+        'PHPParser_NodeVisitor_NameResolver' => 'PhpParser\NodeVisitor\NameResolver',
+        'PHPParser_NodeVisitorAbstract' => 'PhpParser\NodeVisitorAbstract',
+        'PHPParser_Parser' => 'PhpParser\Parser',
+        'PHPParser_PrettyPrinterAbstract' => 'PhpParser\PrettyPrinterAbstract',
+        'PHPParser_PrettyPrinter_Default' => 'PhpParser\PrettyPrinter\Standard',
+        'PHPParser_PrettyPrinter_Zend' => 'PhpParser\PrettyPrinter\Standard',
+        'PHPParser_Serializer' => 'PhpParser\Serializer',
+        'PHPParser_Serializer_XML' => 'PhpParser\Serializer\XML',
+        'PHPParser_Unserializer' => 'PhpParser\Unserializer',
+        'PHPParser_Unserializer_XML' => 'PhpParser\Unserializer\XML',
+
+        'PHPParser_Builder_Class' => 'PhpParser\Builder\Class_',
+        'PHPParser_Builder_Function' => 'PhpParser\Builder\Function_',
+        'PHPParser_Builder_Interface' => 'PhpParser\Builder\Interface_',
+        'PHPParser_Builder_Method' => 'PhpParser\Builder\Method',
+        'PHPParser_Builder_Param' => 'PhpParser\Builder\Param',
+        'PHPParser_Builder_Property' => 'PhpParser\Builder\Property',
+
+        'PHPParser_Node_Arg' => 'PhpParser\Node\Arg',
+        'PHPParser_Node_Const' => 'PhpParser\Node\Const_',
+        'PHPParser_Node_Expr' => 'PhpParser\Node\Expr',
+        'PHPParser_Node_Name' => 'PhpParser\Node\Name',
+        'PHPParser_Node_Name_FullyQualified' => 'PhpParser\Node\Name\FullyQualified',
+        'PHPParser_Node_Name_Relative' => 'PhpParser\Node\Name\Relative',
+        'PHPParser_Node_Param' => 'PhpParser\Node\Param',
+        'PHPParser_Node_Scalar' => 'PhpParser\Node\Scalar',
+        'PHPParser_Node_Stmt' => 'PhpParser\Node\Stmt',
+
+        'PHPParser_Node_Stmt_Break' => 'PhpParser\Node\Stmt\Break_',
+        'PHPParser_Node_Stmt_Case' => 'PhpParser\Node\Stmt\Case_',
+        'PHPParser_Node_Stmt_Catch' => 'PhpParser\Node\Stmt\Catch_',
+        'PHPParser_Node_Stmt_Class' => 'PhpParser\Node\Stmt\Class_',
+        'PHPParser_Node_Stmt_ClassConst' => 'PhpParser\Node\Stmt\ClassConst',
+        'PHPParser_Node_Stmt_ClassMethod' => 'PhpParser\Node\Stmt\ClassMethod',
+        'PHPParser_Node_Stmt_Const' => 'PhpParser\Node\Stmt\Const_',
+        'PHPParser_Node_Stmt_Continue' => 'PhpParser\Node\Stmt\Continue_',
+        'PHPParser_Node_Stmt_Declare' => 'PhpParser\Node\Stmt\Declare_',
+        'PHPParser_Node_Stmt_DeclareDeclare' => 'PhpParser\Node\Stmt\DeclareDeclare',
+        'PHPParser_Node_Stmt_Do' => 'PhpParser\Node\Stmt\Do_',
+        'PHPParser_Node_Stmt_Echo' => 'PhpParser\Node\Stmt\Echo_',
+        'PHPParser_Node_Stmt_Else' => 'PhpParser\Node\Stmt\Else_',
+        'PHPParser_Node_Stmt_ElseIf' => 'PhpParser\Node\Stmt\ElseIf_',
+        'PHPParser_Node_Stmt_For' => 'PhpParser\Node\Stmt\For_',
+        'PHPParser_Node_Stmt_Foreach' => 'PhpParser\Node\Stmt\Foreach_',
+        'PHPParser_Node_Stmt_Function' => 'PhpParser\Node\Stmt\Function_',
+        'PHPParser_Node_Stmt_Global' => 'PhpParser\Node\Stmt\Global_',
+        'PHPParser_Node_Stmt_Goto' => 'PhpParser\Node\Stmt\Goto_',
+        'PHPParser_Node_Stmt_HaltCompiler' => 'PhpParser\Node\Stmt\HaltCompiler',
+        'PHPParser_Node_Stmt_If' => 'PhpParser\Node\Stmt\If_',
+        'PHPParser_Node_Stmt_InlineHTML' => 'PhpParser\Node\Stmt\InlineHTML',
+        'PHPParser_Node_Stmt_Interface' => 'PhpParser\Node\Stmt\Interface_',
+        'PHPParser_Node_Stmt_Label' => 'PhpParser\Node\Stmt\Label',
+        'PHPParser_Node_Stmt_Namespace' => 'PhpParser\Node\Stmt\Namespace_',
+        'PHPParser_Node_Stmt_Property' => 'PhpParser\Node\Stmt\Property',
+        'PHPParser_Node_Stmt_PropertyProperty' => 'PhpParser\Node\Stmt\PropertyProperty',
+        'PHPParser_Node_Stmt_Return' => 'PhpParser\Node\Stmt\Return_',
+        'PHPParser_Node_Stmt_Static' => 'PhpParser\Node\Stmt\Static_',
+        'PHPParser_Node_Stmt_StaticVar' => 'PhpParser\Node\Stmt\StaticVar',
+        'PHPParser_Node_Stmt_Switch' => 'PhpParser\Node\Stmt\Switch_',
+        'PHPParser_Node_Stmt_Throw' => 'PhpParser\Node\Stmt\Throw_',
+        'PHPParser_Node_Stmt_Trait' => 'PhpParser\Node\Stmt\Trait_',
+        'PHPParser_Node_Stmt_TraitUse' => 'PhpParser\Node\Stmt\TraitUse',
+        'PHPParser_Node_Stmt_TraitUseAdaptation' => 'PhpParser\Node\Stmt\TraitUseAdaptation',
+        'PHPParser_Node_Stmt_TraitUseAdaptation_Alias' => 'PhpParser\Node\Stmt\TraitUseAdaptation\Alias',
+        'PHPParser_Node_Stmt_TraitUseAdaptation_Precedence' => 'PhpParser\Node\Stmt\TraitUseAdaptation\Precedence',
+        'PHPParser_Node_Stmt_TryCatch' => 'PhpParser\Node\Stmt\TryCatch',
+        'PHPParser_Node_Stmt_Unset' => 'PhpParser\Node\Stmt\Unset_',
+        'PHPParser_Node_Stmt_UseUse' => 'PhpParser\Node\Stmt\UseUse',
+        'PHPParser_Node_Stmt_Use' => 'PhpParser\Node\Stmt\Use_',
+        'PHPParser_Node_Stmt_While' => 'PhpParser\Node\Stmt\While_',
+
+        'PHPParser_Node_Expr_AssignBitwiseAnd' => 'PhpParser\Node\Expr\AssignOp\BitwiseAnd',
+        'PHPParser_Node_Expr_AssignBitwiseOr' => 'PhpParser\Node\Expr\AssignOp\BitwiseOr',
+        'PHPParser_Node_Expr_AssignBitwiseXor' => 'PhpParser\Node\Expr\AssignOp\BitwiseXor',
+        'PHPParser_Node_Expr_AssignConcat' => 'PhpParser\Node\Expr\AssignOp\Concat',
+        'PHPParser_Node_Expr_AssignDiv' => 'PhpParser\Node\Expr\AssignOp\Div',
+        'PHPParser_Node_Expr_AssignMinus' => 'PhpParser\Node\Expr\AssignOp\Minus',
+        'PHPParser_Node_Expr_AssignMod' => 'PhpParser\Node\Expr\AssignOp\Mod',
+        'PHPParser_Node_Expr_AssignMul' => 'PhpParser\Node\Expr\AssignOp\Mul',
+        'PHPParser_Node_Expr_AssignPlus' => 'PhpParser\Node\Expr\AssignOp\Plus',
+        'PHPParser_Node_Expr_AssignShiftLeft' => 'PhpParser\Node\Expr\AssignOp\ShiftLeft',
+        'PHPParser_Node_Expr_AssignShiftRight' => 'PhpParser\Node\Expr\AssignOp\ShiftRight',
+
+        'PHPParser_Node_Expr_Cast' => 'PhpParser\Node\Expr\Cast',
+        'PHPParser_Node_Expr_Cast_Array' => 'PhpParser\Node\Expr\Cast\Array_',
+        'PHPParser_Node_Expr_Cast_Bool' => 'PhpParser\Node\Expr\Cast\Bool_',
+        'PHPParser_Node_Expr_Cast_Double' => 'PhpParser\Node\Expr\Cast\Double',
+        'PHPParser_Node_Expr_Cast_Int' => 'PhpParser\Node\Expr\Cast\Int_',
+        'PHPParser_Node_Expr_Cast_Object' => 'PhpParser\Node\Expr\Cast\Object_',
+        'PHPParser_Node_Expr_Cast_String' => 'PhpParser\Node\Expr\Cast\String_',
+        'PHPParser_Node_Expr_Cast_Unset' => 'PhpParser\Node\Expr\Cast\Unset_',
+
+        'PHPParser_Node_Expr_BitwiseAnd' => 'PhpParser\Node\Expr\BinaryOp\BitwiseAnd',
+        'PHPParser_Node_Expr_BitwiseOr' => 'PhpParser\Node\Expr\BinaryOp\BitwiseOr',
+        'PHPParser_Node_Expr_BitwiseXor' => 'PhpParser\Node\Expr\BinaryOp\BitwiseXor',
+        'PHPParser_Node_Expr_BooleanAnd' => 'PhpParser\Node\Expr\BinaryOp\BooleanAnd',
+        'PHPParser_Node_Expr_BooleanOr' => 'PhpParser\Node\Expr\BinaryOp\BooleanOr',
+        'PHPParser_Node_Expr_Concat' => 'PhpParser\Node\Expr\BinaryOp\Concat',
+        'PHPParser_Node_Expr_Div' => 'PhpParser\Node\Expr\BinaryOp\Div',
+        'PHPParser_Node_Expr_Equal' => 'PhpParser\Node\Expr\BinaryOp\Equal',
+        'PHPParser_Node_Expr_Greater' => 'PhpParser\Node\Expr\BinaryOp\Greater',
+        'PHPParser_Node_Expr_GreaterOrEqual' => 'PhpParser\Node\Expr\BinaryOp\GreaterOrEqual',
+        'PHPParser_Node_Expr_Identical' => 'PhpParser\Node\Expr\BinaryOp\Identical',
+        'PHPParser_Node_Expr_LogicalAnd' => 'PhpParser\Node\Expr\BinaryOp\LogicalAnd',
+        'PHPParser_Node_Expr_LogicalOr' => 'PhpParser\Node\Expr\BinaryOp\LogicalOr',
+        'PHPParser_Node_Expr_LogicalXor' => 'PhpParser\Node\Expr\BinaryOp\LogicalXor',
+        'PHPParser_Node_Expr_Minus' => 'PhpParser\Node\Expr\BinaryOp\Minus',
+        'PHPParser_Node_Expr_Mod' => 'PhpParser\Node\Expr\BinaryOp\Mod',
+        'PHPParser_Node_Expr_Mul' => 'PhpParser\Node\Expr\BinaryOp\Mul',
+        'PHPParser_Node_Expr_NotEqual' => 'PhpParser\Node\Expr\BinaryOp\NotEqual',
+        'PHPParser_Node_Expr_NotIdentical' => 'PhpParser\Node\Expr\BinaryOp\NotIdentical',
+        'PHPParser_Node_Expr_Plus' => 'PhpParser\Node\Expr\BinaryOp\Plus',
+        'PHPParser_Node_Expr_ShiftLeft' => 'PhpParser\Node\Expr\BinaryOp\ShiftLeft',
+        'PHPParser_Node_Expr_ShiftRight' => 'PhpParser\Node\Expr\BinaryOp\ShiftRight',
+        'PHPParser_Node_Expr_Smaller' => 'PhpParser\Node\Expr\BinaryOp\Smaller',
+        'PHPParser_Node_Expr_SmallerOrEqual' => 'PhpParser\Node\Expr\BinaryOp\SmallerOrEqual',
+
+        'PHPParser_Node_Expr_Array' => 'PhpParser\Node\Expr\Array_',
+        'PHPParser_Node_Expr_ArrayDimFetch' => 'PhpParser\Node\Expr\ArrayDimFetch',
+        'PHPParser_Node_Expr_ArrayItem' => 'PhpParser\Node\Expr\ArrayItem',
+        'PHPParser_Node_Expr_Assign' => 'PhpParser\Node\Expr\Assign',
+        'PHPParser_Node_Expr_AssignRef' => 'PhpParser\Node\Expr\AssignRef',
+        'PHPParser_Node_Expr_BitwiseNot' => 'PhpParser\Node\Expr\BitwiseNot',
+        'PHPParser_Node_Expr_BooleanNot' => 'PhpParser\Node\Expr\BooleanNot',
+        'PHPParser_Node_Expr_ClassConstFetch' => 'PhpParser\Node\Expr\ClassConstFetch',
+        'PHPParser_Node_Expr_Clone' => 'PhpParser\Node\Expr\Clone_',
+        'PHPParser_Node_Expr_Closure' => 'PhpParser\Node\Expr\Closure',
+        'PHPParser_Node_Expr_ClosureUse' => 'PhpParser\Node\Expr\ClosureUse',
+        'PHPParser_Node_Expr_ConstFetch' => 'PhpParser\Node\Expr\ConstFetch',
+        'PHPParser_Node_Expr_Empty' => 'PhpParser\Node\Expr\Empty_',
+        'PHPParser_Node_Expr_ErrorSuppress' => 'PhpParser\Node\Expr\ErrorSuppress',
+        'PHPParser_Node_Expr_Eval' => 'PhpParser\Node\Expr\Eval_',
+        'PHPParser_Node_Expr_Exit' => 'PhpParser\Node\Expr\Exit_',
+        'PHPParser_Node_Expr_FuncCall' => 'PhpParser\Node\Expr\FuncCall',
+        'PHPParser_Node_Expr_Include' => 'PhpParser\Node\Expr\Include_',
+        'PHPParser_Node_Expr_Instanceof' => 'PhpParser\Node\Expr\Instanceof_',
+        'PHPParser_Node_Expr_Isset' => 'PhpParser\Node\Expr\Isset_',
+        'PHPParser_Node_Expr_List' => 'PhpParser\Node\Expr\List_',
+        'PHPParser_Node_Expr_MethodCall' => 'PhpParser\Node\Expr\MethodCall',
+        'PHPParser_Node_Expr_New' => 'PhpParser\Node\Expr\New_',
+        'PHPParser_Node_Expr_PostDec' => 'PhpParser\Node\Expr\PostDec',
+        'PHPParser_Node_Expr_PostInc' => 'PhpParser\Node\Expr\PostInc',
+        'PHPParser_Node_Expr_PreDec' => 'PhpParser\Node\Expr\PreDec',
+        'PHPParser_Node_Expr_PreInc' => 'PhpParser\Node\Expr\PreInc',
+        'PHPParser_Node_Expr_Print' => 'PhpParser\Node\Expr\Print_',
+        'PHPParser_Node_Expr_PropertyFetch' => 'PhpParser\Node\Expr\PropertyFetch',
+        'PHPParser_Node_Expr_ShellExec' => 'PhpParser\Node\Expr\ShellExec',
+        'PHPParser_Node_Expr_StaticCall' => 'PhpParser\Node\Expr\StaticCall',
+        'PHPParser_Node_Expr_StaticPropertyFetch' => 'PhpParser\Node\Expr\StaticPropertyFetch',
+        'PHPParser_Node_Expr_Ternary' => 'PhpParser\Node\Expr\Ternary',
+        'PHPParser_Node_Expr_UnaryMinus' => 'PhpParser\Node\Expr\UnaryMinus',
+        'PHPParser_Node_Expr_UnaryPlus' => 'PhpParser\Node\Expr\UnaryPlus',
+        'PHPParser_Node_Expr_Variable' => 'PhpParser\Node\Expr\Variable',
+        'PHPParser_Node_Expr_Yield' => 'PhpParser\Node\Expr\Yield_',
+
+        'PHPParser_Node_Scalar_ClassConst' => 'PhpParser\Node\Scalar\MagicConst\Class_',
+        'PHPParser_Node_Scalar_DirConst' => 'PhpParser\Node\Scalar\MagicConst\Dir',
+        'PHPParser_Node_Scalar_FileConst' => 'PhpParser\Node\Scalar\MagicConst\File',
+        'PHPParser_Node_Scalar_FuncConst' => 'PhpParser\Node\Scalar\MagicConst\Function_',
+        'PHPParser_Node_Scalar_LineConst' => 'PhpParser\Node\Scalar\MagicConst\Line',
+        'PHPParser_Node_Scalar_MethodConst' => 'PhpParser\Node\Scalar\MagicConst\Method',
+        'PHPParser_Node_Scalar_NSConst' => 'PhpParser\Node\Scalar\MagicConst\Namespace_',
+        'PHPParser_Node_Scalar_TraitConst' => 'PhpParser\Node\Scalar\MagicConst\Trait_',
+
+        'PHPParser_Node_Scalar_DNumber' => 'PhpParser\Node\Scalar\DNumber',
+        'PHPParser_Node_Scalar_Encapsed' => 'PhpParser\Node\Scalar\Encapsed',
+        'PHPParser_Node_Scalar_LNumber' => 'PhpParser\Node\Scalar\LNumber',
+        'PHPParser_Node_Scalar_String' => 'PhpParser\Node\Scalar\String_',
+    );
+}
+
+class_alias('PhpParser\Autoloader', 'PHPParser_Autoloader');
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder.php b/vendor/nikic/php-parser/lib/PhpParser/Builder.php
new file mode 100644
index 0000000000..95655e8200
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Builder.php
@@ -0,0 +1,13 @@
+name = $name;
+    }
+
+    /**
+     * Extends a class.
+     *
+     * @param Name|string $class Name of class to extend
+     *
+     * @return $this The builder instance (for fluid interface)
+     */
+    public function extend($class) {
+        $this->extends = $this->normalizeName($class);
+
+        return $this;
+    }
+
+    /**
+     * Implements one or more interfaces.
+     *
+     * @param Name|string $interface Name of interface to implement
+     * @param Name|string $...       More interfaces to implement
+     *
+     * @return $this The builder instance (for fluid interface)
+     */
+    public function implement() {
+        foreach (func_get_args() as $interface) {
+            $this->implements[] = $this->normalizeName($interface);
+        }
+
+        return $this;
+    }
+
+    /**
+     * Makes the class abstract.
+     *
+     * @return $this The builder instance (for fluid interface)
+     */
+    public function makeAbstract() {
+        $this->setModifier(Stmt\Class_::MODIFIER_ABSTRACT);
+
+        return $this;
+    }
+
+    /**
+     * Makes the class final.
+     *
+     * @return $this The builder instance (for fluid interface)
+     */
+    public function makeFinal() {
+        $this->setModifier(Stmt\Class_::MODIFIER_FINAL);
+
+        return $this;
+    }
+
+    /**
+     * Adds a statement.
+     *
+     * @param Stmt|PhpParser\Builder $stmt The statement to add
+     *
+     * @return $this The builder instance (for fluid interface)
+     */
+    public function addStmt($stmt) {
+        $stmt = $this->normalizeNode($stmt);
+
+        $targets = array(
+            'Stmt_TraitUse'    => &$this->uses,
+            'Stmt_ClassConst'  => &$this->constants,
+            'Stmt_Property'    => &$this->properties,
+            'Stmt_ClassMethod' => &$this->methods,
+        );
+
+        $type = $stmt->getType();
+        if (!isset($targets[$type])) {
+            throw new \LogicException(sprintf('Unexpected node of type "%s"', $type));
+        }
+
+        $targets[$type][] = $stmt;
+
+        return $this;
+    }
+
+    /**
+     * Returns the built class node.
+     *
+     * @return Stmt\Class_ The built class node
+     */
+    public function getNode() {
+        return new Stmt\Class_($this->name, array(
+            'type' => $this->type,
+            'extends' => $this->extends,
+            'implements' => $this->implements,
+            'stmts' => array_merge($this->uses, $this->constants, $this->properties, $this->methods),
+        ), $this->attributes);
+    }
+}
\ No newline at end of file
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Declaration.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Declaration.php
new file mode 100644
index 0000000000..f6a322c5f0
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Builder/Declaration.php
@@ -0,0 +1,44 @@
+addStmt($stmt);
+        }
+
+        return $this;
+    }
+
+    /**
+     * Sets doc comment for the declaration.
+     *
+     * @param PhpParser\Comment\Doc|string $docComment Doc comment to set
+     *
+     * @return $this The builder instance (for fluid interface)
+     */
+    public function setDocComment($docComment) {
+        $this->attributes['comments'] = array(
+            $this->normalizeDocComment($docComment)
+        );
+
+        return $this;
+    }
+}
\ No newline at end of file
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php
new file mode 100644
index 0000000000..35646a39fb
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php
@@ -0,0 +1,58 @@
+returnByRef = true;
+
+        return $this;
+    }
+
+    /**
+     * Adds a parameter.
+     *
+     * @param Node\Param|Param $param The parameter to add
+     *
+     * @return $this The builder instance (for fluid interface)
+     */
+    public function addParam($param) {
+        $param = $this->normalizeNode($param);
+
+        if (!$param instanceof Node\Param) {
+            throw new \LogicException(sprintf('Expected parameter node, got "%s"', $param->getType()));
+        }
+
+        $this->params[] = $param;
+
+        return $this;
+    }
+
+    /**
+     * Adds multiple parameters.
+     *
+     * @param array $params The parameters to add
+     *
+     * @return $this The builder instance (for fluid interface)
+     */
+    public function addParams(array $params) {
+        foreach ($params as $param) {
+            $this->addParam($param);
+        }
+
+        return $this;
+    }
+}
\ No newline at end of file
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Function_.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Function_.php
new file mode 100644
index 0000000000..374f315de7
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Builder/Function_.php
@@ -0,0 +1,48 @@
+name = $name;
+    }
+
+    /**
+     * Adds a statement.
+     *
+     * @param Node|PhpParser\Builder $stmt The statement to add
+     *
+     * @return $this The builder instance (for fluid interface)
+     */
+    public function addStmt($stmt) {
+        $this->stmts[] = $this->normalizeNode($stmt);
+
+        return $this;
+    }
+
+    /**
+     * Returns the built function node.
+     *
+     * @return Stmt\Function_ The built function node
+     */
+    public function getNode() {
+        return new Stmt\Function_($this->name, array(
+            'byRef'  => $this->returnByRef,
+            'params' => $this->params,
+            'stmts'  => $this->stmts,
+        ), $this->attributes);
+    }
+}
\ No newline at end of file
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Interface_.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Interface_.php
new file mode 100644
index 0000000000..18afaaad7a
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Builder/Interface_.php
@@ -0,0 +1,81 @@
+name = $name;
+    }
+
+    /**
+     * Extends one or more interfaces.
+     *
+     * @param Name|string $interface Name of interface to extend
+     * @param Name|string $...       More interfaces to extend
+     *
+     * @return $this The builder instance (for fluid interface)
+     */
+    public function extend() {
+        foreach (func_get_args() as $interface) {
+            $this->extends[] = $this->normalizeName($interface);
+        }
+
+        return $this;
+    }
+
+    /**
+     * Adds a statement.
+     *
+     * @param Stmt|PhpParser\Builder $stmt The statement to add
+     *
+     * @return $this The builder instance (for fluid interface)
+     */
+    public function addStmt($stmt) {
+        $stmt = $this->normalizeNode($stmt);
+
+        $type = $stmt->getType();
+        switch ($type) {
+            case 'Stmt_ClassConst':
+                $this->constants[] = $stmt;
+                break;
+
+            case 'Stmt_ClassMethod':
+                // we erase all statements in the body of an interface method
+                $stmt->stmts = null;
+                $this->methods[] = $stmt;
+                break;
+
+            default:
+                throw new \LogicException(sprintf('Unexpected node of type "%s"', $type));
+        }
+
+        return $this;
+    }
+
+    /**
+     * Returns the built interface node.
+     *
+     * @return Stmt\Interface_ The built interface node
+     */
+    public function getNode() {
+        return new Stmt\Interface_($this->name, array(
+            'extends' => $this->extends,
+            'stmts' => array_merge($this->constants, $this->methods),
+        ), $this->attributes);
+    }
+}
\ No newline at end of file
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Method.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Method.php
new file mode 100644
index 0000000000..60dd4b9a8e
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Builder/Method.php
@@ -0,0 +1,125 @@
+name = $name;
+    }
+
+    /**
+     * Makes the method public.
+     *
+     * @return $this The builder instance (for fluid interface)
+     */
+    public function makePublic() {
+        $this->setModifier(Stmt\Class_::MODIFIER_PUBLIC);
+
+        return $this;
+    }
+
+    /**
+     * Makes the method protected.
+     *
+     * @return $this The builder instance (for fluid interface)
+     */
+    public function makeProtected() {
+        $this->setModifier(Stmt\Class_::MODIFIER_PROTECTED);
+
+        return $this;
+    }
+
+    /**
+     * Makes the method private.
+     *
+     * @return $this The builder instance (for fluid interface)
+     */
+    public function makePrivate() {
+        $this->setModifier(Stmt\Class_::MODIFIER_PRIVATE);
+
+        return $this;
+    }
+
+    /**
+     * Makes the method static.
+     *
+     * @return $this The builder instance (for fluid interface)
+     */
+    public function makeStatic() {
+        $this->setModifier(Stmt\Class_::MODIFIER_STATIC);
+
+        return $this;
+    }
+
+    /**
+     * Makes the method abstract.
+     *
+     * @return $this The builder instance (for fluid interface)
+     */
+    public function makeAbstract() {
+        if (!empty($this->stmts)) {
+            throw new \LogicException('Cannot make method with statements abstract');
+        }
+
+        $this->setModifier(Stmt\Class_::MODIFIER_ABSTRACT);
+        $this->stmts = null; // abstract methods don't have statements
+
+        return $this;
+    }
+
+    /**
+     * Makes the method final.
+     *
+     * @return $this The builder instance (for fluid interface)
+     */
+    public function makeFinal() {
+        $this->setModifier(Stmt\Class_::MODIFIER_FINAL);
+
+        return $this;
+    }
+
+    /**
+     * Adds a statement.
+     *
+     * @param Node|PhpParser\Builder $stmt The statement to add
+     *
+     * @return $this The builder instance (for fluid interface)
+     */
+    public function addStmt($stmt) {
+        if (null === $this->stmts) {
+            throw new \LogicException('Cannot add statements to an abstract method');
+        }
+
+        $this->stmts[] = $this->normalizeNode($stmt);
+
+        return $this;
+    }
+
+    /**
+     * Returns the built method node.
+     *
+     * @return Stmt\ClassMethod The built method node
+     */
+    public function getNode() {
+        return new Stmt\ClassMethod($this->name, array(
+            'type'   => $this->type,
+            'byRef'  => $this->returnByRef,
+            'params' => $this->params,
+            'stmts'  => $this->stmts,
+        ), $this->attributes);
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php
new file mode 100644
index 0000000000..432fcc7f12
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php
@@ -0,0 +1,59 @@
+name = null !== $name ? $this->normalizeName($name) : null;
+    }
+
+    /**
+     * Adds a statement.
+     *
+     * @param Node|PhpParser\Builder $stmt The statement to add
+     *
+     * @return $this The builder instance (for fluid interface)
+     */
+    public function addStmt($stmt) {
+        $this->stmts[] = $this->normalizeNode($stmt);
+
+        return $this;
+    }
+
+    /**
+     * Adds multiple statements.
+     *
+     * @param array $stmts The statements to add
+     *
+     * @return $this The builder instance (for fluid interface)
+     */
+    public function addStmts(array $stmts) {
+        foreach ($stmts as $stmt) {
+            $this->addStmt($stmt);
+        }
+
+        return $this;
+    }
+
+    /**
+     * Returns the built node.
+     *
+     * @return Node The built node
+     */
+    public function getNode() {
+        return new Stmt\Namespace_($this->name, $this->stmts);
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php
new file mode 100644
index 0000000000..af910c209d
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php
@@ -0,0 +1,76 @@
+name = $name;
+    }
+
+    /**
+     * Sets default value for the parameter.
+     *
+     * @param mixed $value Default value to use
+     *
+     * @return $this The builder instance (for fluid interface)
+     */
+    public function setDefault($value) {
+        $this->default = $this->normalizeValue($value);
+
+        return $this;
+    }
+
+    /**
+     * Sets type hint for the parameter.
+     *
+     * @param string|Node\Name $type Type hint to use
+     *
+     * @return $this The builder instance (for fluid interface)
+     */
+    public function setTypeHint($type) {
+        if ($type === 'array' || $type === 'callable') {
+            $this->type = $type;
+        } else {
+            $this->type = $this->normalizeName($type);
+        }
+
+        return $this;
+    }
+
+    /**
+     * Make the parameter accept the value by reference.
+     *
+     * @return $this The builder instance (for fluid interface)
+     */
+    public function makeByRef() {
+        $this->byRef = true;
+
+        return $this;
+    }
+
+    /**
+     * Returns the built parameter node.
+     *
+     * @return Node\Param The built parameter node
+     */
+    public function getNode() {
+        return new Node\Param(
+            $this->name, $this->default, $this->type, $this->byRef
+        );
+    }
+}
\ No newline at end of file
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Property.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Property.php
new file mode 100644
index 0000000000..2d59d4c308
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Builder/Property.php
@@ -0,0 +1,111 @@
+name = $name;
+    }
+
+    /**
+     * Makes the property public.
+     *
+     * @return $this The builder instance (for fluid interface)
+     */
+    public function makePublic() {
+        $this->setModifier(Stmt\Class_::MODIFIER_PUBLIC);
+
+        return $this;
+    }
+
+    /**
+     * Makes the property protected.
+     *
+     * @return $this The builder instance (for fluid interface)
+     */
+    public function makeProtected() {
+        $this->setModifier(Stmt\Class_::MODIFIER_PROTECTED);
+
+        return $this;
+    }
+
+    /**
+     * Makes the property private.
+     *
+     * @return $this The builder instance (for fluid interface)
+     */
+    public function makePrivate() {
+        $this->setModifier(Stmt\Class_::MODIFIER_PRIVATE);
+
+        return $this;
+    }
+
+    /**
+     * Makes the property static.
+     *
+     * @return $this The builder instance (for fluid interface)
+     */
+    public function makeStatic() {
+        $this->setModifier(Stmt\Class_::MODIFIER_STATIC);
+
+        return $this;
+    }
+
+    /**
+     * Sets default value for the property.
+     *
+     * @param mixed $value Default value to use
+     *
+     * @return $this The builder instance (for fluid interface)
+     */
+    public function setDefault($value) {
+        $this->default = $this->normalizeValue($value);
+
+        return $this;
+    }
+
+    /**
+     * Sets doc comment for the property.
+     *
+     * @param PhpParser\Comment\Doc|string $docComment Doc comment to set
+     *
+     * @return $this The builder instance (for fluid interface)
+     */
+    public function setDocComment($docComment) {
+        $this->attributes = array(
+            'comments' => array($this->normalizeDocComment($docComment))
+        );
+
+        return $this;
+    }
+
+    /**
+     * Returns the built class node.
+     *
+     * @return Stmt\Property The built property node
+     */
+    public function getNode() {
+        return new Stmt\Property(
+            $this->type !== 0 ? $this->type : Stmt\Class_::MODIFIER_PUBLIC,
+            array(
+                new Stmt\PropertyProperty($this->name, $this->default)
+            ),
+            $this->attributes
+        );
+    }
+}
\ No newline at end of file
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Trait_.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Trait_.php
new file mode 100644
index 0000000000..9722e35734
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Builder/Trait_.php
@@ -0,0 +1,55 @@
+name = $name;
+    }
+
+    /**
+     * Adds a statement.
+     *
+     * @param Stmt|PhpParser\Builder $stmt The statement to add
+     *
+     * @return $this The builder instance (for fluid interface)
+     */
+    public function addStmt($stmt) {
+        $stmt = $this->normalizeNode($stmt);
+
+        if ($stmt instanceof Stmt\Property) {
+            $this->properties[] = $stmt;
+        } else if ($stmt instanceof Stmt\ClassMethod) {
+            $this->methods[] = $stmt;
+        } else {
+            throw new \LogicException(sprintf('Unexpected node of type "%s"', $stmt->getType()));
+        }
+
+        return $this;
+    }
+
+    /**
+     * Returns the built trait node.
+     *
+     * @return Stmt\Trait_ The built interface node
+     */
+    public function getNode() {
+        return new Stmt\Trait_(
+            $this->name, array_merge($this->properties, $this->methods), $this->attributes
+        );
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Use_.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Use_.php
new file mode 100644
index 0000000000..f6d3a856fa
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Builder/Use_.php
@@ -0,0 +1,58 @@
+name = $this->normalizeName($name);
+        $this->type = $type;
+    }
+
+    /**
+     * Sets alias for used name.
+     *
+     * @param string $alias Alias to use (last component of full name by default)
+     *
+     * @return $this The builder instance (for fluid interface)
+     */
+    protected function as_($alias) {
+        $this->alias = $alias;
+        return $this;
+    }
+    public function __call($name, $args) {
+        if (method_exists($this, $name . '_')) {
+            return call_user_func_array(array($this, $name . '_'), $args);
+        }
+
+        throw new \LogicException(sprintf('Method "%s" does not exist', $name));
+    }
+
+    /**
+     * Returns the built node.
+     *
+     * @return Node The built node
+     */
+    public function getNode() {
+        $alias = null !== $this->alias ? $this->alias : $this->name->getLast();
+        return new Stmt\Use_(array(
+            new Stmt\UseUse($this->name, $alias)
+        ), $this->type);
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/BuilderAbstract.php b/vendor/nikic/php-parser/lib/PhpParser/BuilderAbstract.php
new file mode 100644
index 0000000000..626bedd1de
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/BuilderAbstract.php
@@ -0,0 +1,131 @@
+getNode();
+        } elseif ($node instanceof Node) {
+            return $node;
+        }
+
+        throw new \LogicException('Expected node or builder object');
+    }
+
+    /**
+     * Normalizes a name: Converts plain string names to PhpParser\Node\Name.
+     *
+     * @param Name|string $name The name to normalize
+     *
+     * @return Name The normalized name
+     */
+    protected function normalizeName($name) {
+        if ($name instanceof Name) {
+            return $name;
+        } elseif (is_string($name)) {
+            if (!$name) {
+                throw new \LogicException('Name cannot be empty');
+            }
+
+            if ($name[0] == '\\') {
+                return new Name\FullyQualified(substr($name, 1));
+            } elseif (0 === strpos($name, 'namespace\\')) {
+                return new Name\Relative(substr($name, strlen('namespace\\')));
+            } else {
+                return new Name($name);
+            }
+        }
+
+        throw new \LogicException('Name must be a string or an instance of PhpParser\Node\Name');
+    }
+
+    /**
+     * Normalizes a value: Converts nulls, booleans, integers,
+     * floats, strings and arrays into their respective nodes
+     *
+     * @param mixed $value The value to normalize
+     *
+     * @return Expr The normalized value
+     */
+    protected function normalizeValue($value) {
+        if ($value instanceof Node) {
+            return $value;
+        } elseif (is_null($value)) {
+            return new Expr\ConstFetch(
+                new Name('null')
+            );
+        } elseif (is_bool($value)) {
+            return new Expr\ConstFetch(
+                new Name($value ? 'true' : 'false')
+            );
+        } elseif (is_int($value)) {
+            return new Scalar\LNumber($value);
+        } elseif (is_float($value)) {
+            return new Scalar\DNumber($value);
+        } elseif (is_string($value)) {
+            return new Scalar\String_($value);
+        } elseif (is_array($value)) {
+            $items = array();
+            $lastKey = -1;
+            foreach ($value as $itemKey => $itemValue) {
+                // for consecutive, numeric keys don't generate keys
+                if (null !== $lastKey && ++$lastKey === $itemKey) {
+                    $items[] = new Expr\ArrayItem(
+                        $this->normalizeValue($itemValue)
+                    );
+                } else {
+                    $lastKey = null;
+                    $items[] = new Expr\ArrayItem(
+                        $this->normalizeValue($itemValue),
+                        $this->normalizeValue($itemKey)
+                    );
+                }
+            }
+
+            return new Expr\Array_($items);
+        } else {
+            throw new \LogicException('Invalid value');
+        }
+    }
+
+    /**
+     * Normalizes a doc comment: Converts plain strings to PhpParser\Comment\Doc.
+     *
+     * @param Comment\Doc|string $docComment The doc comment to normalize
+     *
+     * @return Comment\Doc The normalized doc comment
+     */
+    protected function normalizeDocComment($docComment) {
+        if ($docComment instanceof Comment\Doc) {
+            return $docComment;
+        } else if (is_string($docComment)) {
+            return new Comment\Doc($docComment);
+        } else {
+            throw new \LogicException('Doc comment must be a string or an instance of PhpParser\Comment\Doc');
+        }
+    }
+
+    /**
+     * Sets a modifier in the $this->type property.
+     *
+     * @param int $modifier Modifier to set
+     */
+    protected function setModifier($modifier) {
+        Stmt\Class_::verifyModifier($this->type, $modifier);
+        $this->type |= $modifier;
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php b/vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php
new file mode 100644
index 0000000000..99c4bafed9
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php
@@ -0,0 +1,127 @@
+text = $text;
+        $this->line = $line;
+    }
+
+    /**
+     * Gets the comment text.
+     *
+     * @return string The comment text (including comment delimiters like /*)
+     */
+    public function getText() {
+        return $this->text;
+    }
+
+    /**
+     * Sets the comment text.
+     *
+     * @param string $text The comment text (including comment delimiters like /*)
+     */
+    public function setText($text) {
+        $this->text = $text;
+    }
+
+    /**
+     * Gets the line number the comment started on.
+     *
+     * @return int Line number
+     */
+    public function getLine() {
+        return $this->line;
+    }
+
+    /**
+     * Sets the line number the comment started on.
+     *
+     * @param int $line Line number
+     */
+    public function setLine($line) {
+        $this->line = $line;
+    }
+
+    /**
+     * Gets the comment text.
+     *
+     * @return string The comment text (including comment delimiters like /*)
+     */
+    public function __toString() {
+        return $this->text;
+    }
+
+    /**
+     * Gets the reformatted comment text.
+     *
+     * "Reformatted" here means that we try to clean up the whitespace at the
+     * starts of the lines. This is necessary because we receive the comments
+     * without trailing whitespace on the first line, but with trailing whitespace
+     * on all subsequent lines.
+     *
+     * @return mixed|string
+     */
+    public function getReformattedText() {
+        $text = trim($this->text);
+        if (false === strpos($text, "\n")) {
+            // Single line comments don't need further processing
+            return $text;
+        } elseif (preg_match('((*BSR_ANYCRLF)(*ANYCRLF)^.*(?:\R\s+\*.*)+$)', $text)) {
+            // Multi line comment of the type
+            //
+            //     /*
+            //      * Some text.
+            //      * Some more text.
+            //      */
+            //
+            // is handled by replacing the whitespace sequences before the * by a single space
+            return preg_replace('(^\s+\*)m', ' *', $this->text);
+        } elseif (preg_match('(^/\*\*?\s*[\r\n])', $text) && preg_match('(\n(\s*)\*/$)', $text, $matches)) {
+            // Multi line comment of the type
+            //
+            //    /*
+            //        Some text.
+            //        Some more text.
+            //    */
+            //
+            // is handled by removing the whitespace sequence on the line before the closing
+            // */ on all lines. So if the last line is "    */", then "    " is removed at the
+            // start of all lines.
+            return preg_replace('(^' . preg_quote($matches[1]) . ')m', '', $text);
+        } elseif (preg_match('(^/\*\*?\s*(?!\s))', $text, $matches)) {
+            // Multi line comment of the type
+            //
+            //     /* Some text.
+            //        Some more text.
+            //        Even more text. */
+            //
+            // is handled by taking the length of the "/* " segment and leaving only that
+            // many space characters before the lines. Thus in the above example only three
+            // space characters are left at the start of every line.
+            return preg_replace('(^\s*(?= {' . strlen($matches[0]) . '}(?!\s)))m', '', $text);
+        }
+
+        // No idea how to format this comment, so simply return as is
+        return $text;
+    }
+}
\ No newline at end of file
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Comment/Doc.php b/vendor/nikic/php-parser/lib/PhpParser/Comment/Doc.php
new file mode 100644
index 0000000000..24fc6c9ecc
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Comment/Doc.php
@@ -0,0 +1,7 @@
+rawMessage = (string) $message;
+        if (is_array($attributes)) {
+            $this->attributes = $attributes;
+        } else {
+            $this->attributes = array('startLine' => $attributes);
+        }
+        $this->updateMessage();
+    }
+
+    /**
+     * Gets the error message
+     *
+     * @return string Error message
+     */
+    public function getRawMessage() {
+        return $this->rawMessage;
+    }
+
+    /**
+     * Gets the line the error starts in.
+     *
+     * @return int Error start line
+     */
+    public function getStartLine() {
+        return isset($this->attributes['startLine']) ? $this->attributes['startLine'] : -1;
+    }
+
+    /**
+     * Gets the line the error ends in.
+     *
+     * @return int Error end line
+     */
+    public function getEndLine() {
+        return isset($this->attributes['endLine']) ? $this->attributes['endLine'] : -1;
+    }
+
+
+    /**
+     * Gets the attributes of the node/token the error occurred at.
+     *
+     * @return array
+     */
+    public function getAttributes() {
+        return $this->attributes;
+    }
+
+    /**
+     * Sets the line of the PHP file the error occurred in.
+     *
+     * @param string $message Error message
+     */
+    public function setRawMessage($message) {
+        $this->rawMessage = (string) $message;
+        $this->updateMessage();
+    }
+
+    /**
+     * Sets the line the error starts in.
+     *
+     * @param int $line Error start line
+     */
+    public function setStartLine($line) {
+        $this->attributes['startLine'] = (int) $line;
+        $this->updateMessage();
+    }
+
+    /**
+     * Returns whether the error has start and end column information.
+     *
+     * For column information enable the startFilePos and endFilePos in the lexer options.
+     *
+     * @return bool
+     */
+    public function hasColumnInfo() {
+        return isset($this->attributes['startFilePos']) && isset($this->attributes['endFilePos']);
+    }
+
+    /**
+     * Gets the start column (1-based) into the line where the error started.
+     *
+     * @param string $code Source code of the file
+     * @return int
+     */
+    public function getStartColumn($code) {
+        if (!$this->hasColumnInfo()) {
+            throw new \RuntimeException('Error does not have column information');
+        }
+
+        return $this->toColumn($code, $this->attributes['startFilePos']);
+    }
+
+    /**
+     * Gets the end column (1-based) into the line where the error ended.
+     *
+     * @param string $code Source code of the file
+     * @return int
+     */
+    public function getEndColumn($code) {
+        if (!$this->hasColumnInfo()) {
+            throw new \RuntimeException('Error does not have column information');
+        }
+
+        return $this->toColumn($code, $this->attributes['endFilePos']);
+    }
+
+    private function toColumn($code, $pos) {
+        if ($pos > strlen($code)) {
+            throw new \RuntimeException('Invalid position information');
+        }
+
+        $lineStartPos = strrpos($code, "\n", $pos - strlen($code));
+        if (false === $lineStartPos) {
+            $lineStartPos = -1;
+        }
+
+        return $pos - $lineStartPos;
+    }
+
+    /**
+     * Updates the exception message after a change to rawMessage or rawLine.
+     */
+    protected function updateMessage() {
+        $this->message = $this->rawMessage;
+
+        if (-1 === $this->getStartLine()) {
+            $this->message .= ' on unknown line';
+        } else {
+            $this->message .= ' on line ' . $this->getStartLine();
+        }
+    }
+
+    /** @deprecated Use getStartLine() instead */
+    public function getRawLine() {
+        return $this->getStartLine();
+    }
+
+    /** @deprecated Use setStartLine() instead */
+    public function setRawLine($line) {
+        $this->setStartLine($line);
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer.php
new file mode 100644
index 0000000000..f3af54d29b
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Lexer.php
@@ -0,0 +1,286 @@
+tokenMap = $this->createTokenMap();
+
+        // map of tokens to drop while lexing (the map is only used for isset lookup,
+        // that's why the value is simply set to 1; the value is never actually used.)
+        $this->dropTokens = array_fill_keys(array(T_WHITESPACE, T_OPEN_TAG), 1);
+
+        // the usedAttributes member is a map of the used attribute names to a dummy
+        // value (here "true")
+        $options += array(
+            'usedAttributes' => array('comments', 'startLine', 'endLine'),
+        );
+        $this->usedAttributes = array_fill_keys($options['usedAttributes'], true);
+    }
+
+    /**
+     * Initializes the lexer for lexing the provided source code.
+     *
+     * @param string $code The source code to lex
+     *
+     * @throws Error on lexing errors (unterminated comment or unexpected character)
+     */
+    public function startLexing($code) {
+        $scream = ini_set('xdebug.scream', '0');
+
+        $this->resetErrors();
+        $this->tokens = @token_get_all($code);
+        $this->handleErrors();
+
+        if (false !== $scream) {
+            ini_set('xdebug.scream', $scream);
+        }
+
+        $this->code = $code; // keep the code around for __halt_compiler() handling
+        $this->pos  = -1;
+        $this->line =  1;
+        $this->filePos = 0;
+    }
+
+    protected function resetErrors() {
+        // set error_get_last() to defined state by forcing an undefined variable error
+        set_error_handler(function() { return false; }, 0);
+        @$undefinedVariable;
+        restore_error_handler();
+    }
+
+    protected function handleErrors() {
+        $error = error_get_last();
+
+        if (preg_match(
+            '~^Unterminated comment starting line ([0-9]+)$~',
+            $error['message'], $matches
+        )) {
+            throw new Error('Unterminated comment', (int) $matches[1]);
+        }
+
+        if (preg_match(
+            '~^Unexpected character in input:  \'(.)\' \(ASCII=([0-9]+)\)~s',
+            $error['message'], $matches
+        )) {
+            throw new Error(sprintf(
+                'Unexpected character "%s" (ASCII %d)',
+                $matches[1], $matches[2]
+            ));
+        }
+
+        // PHP cuts error message after null byte, so need special case
+        if (preg_match('~^Unexpected character in input:  \'$~', $error['message'])) {
+            throw new Error('Unexpected null byte');
+        }
+    }
+
+    /**
+     * Fetches the next token.
+     *
+     * The available attributes are determined by the 'usedAttributes' option, which can
+     * be specified in the constructor. The following attributes are supported:
+     *
+     *  * 'comments'      => Array of PhpParser\Comment or PhpParser\Comment\Doc instances,
+     *                       representing all comments that occurred between the previous
+     *                       non-discarded token and the current one.
+     *  * 'startLine'     => Line in which the node starts.
+     *  * 'endLine'       => Line in which the node ends.
+     *  * 'startTokenPos' => Offset into the token array of the first token in the node.
+     *  * 'endTokenPos'   => Offset into the token array of the last token in the node.
+     *  * 'startFilePos'  => Offset into the code string of the first character that is part of the node.
+     *  * 'endFilePos'    => Offset into the code string of the last character that is part of the node
+     *
+     * @param mixed $value           Variable to store token content in
+     * @param mixed $startAttributes Variable to store start attributes in
+     * @param mixed $endAttributes   Variable to store end attributes in
+     *
+     * @return int Token id
+     */
+    public function getNextToken(&$value = null, &$startAttributes = null, &$endAttributes = null) {
+        $startAttributes = array();
+        $endAttributes   = array();
+
+        while (1) {
+            if (isset($this->tokens[++$this->pos])) {
+                $token = $this->tokens[$this->pos];
+            } else {
+                // EOF token with ID 0
+                $token = "\0";
+            }
+
+            if (isset($this->usedAttributes['startTokenPos'])) {
+                $startAttributes['startTokenPos'] = $this->pos;
+            }
+            if (isset($this->usedAttributes['startFilePos'])) {
+                $startAttributes['startFilePos'] = $this->filePos;
+            }
+
+            if (is_string($token)) {
+                // bug in token_get_all
+                if ('b"' === $token) {
+                    $value = 'b"';
+                    $this->filePos += 2;
+                    $id = ord('"');
+                } else {
+                    $value = $token;
+                    $this->filePos += 1;
+                    $id = ord($token);
+                }
+
+                if (isset($this->usedAttributes['startLine'])) {
+                    $startAttributes['startLine'] = $this->line;
+                }
+                if (isset($this->usedAttributes['endLine'])) {
+                    $endAttributes['endLine'] = $this->line;
+                }
+                if (isset($this->usedAttributes['endTokenPos'])) {
+                    $endAttributes['endTokenPos'] = $this->pos;
+                }
+                if (isset($this->usedAttributes['endFilePos'])) {
+                    $endAttributes['endFilePos'] = $this->filePos - 1;
+                }
+
+                return $id;
+            } else {
+                $this->line += substr_count($token[1], "\n");
+                $this->filePos += strlen($token[1]);
+
+                if (T_COMMENT === $token[0]) {
+                    if (isset($this->usedAttributes['comments'])) {
+                        $startAttributes['comments'][] = new Comment($token[1], $token[2]);
+                    }
+                } elseif (T_DOC_COMMENT === $token[0]) {
+                    if (isset($this->usedAttributes['comments'])) {
+                        $startAttributes['comments'][] = new Comment\Doc($token[1], $token[2]);
+                    }
+                } elseif (!isset($this->dropTokens[$token[0]])) {
+                    $value = $token[1];
+
+                    if (isset($this->usedAttributes['startLine'])) {
+                        $startAttributes['startLine'] = $token[2];
+                    }
+                    if (isset($this->usedAttributes['endLine'])) {
+                        $endAttributes['endLine'] = $this->line;
+                    }
+                    if (isset($this->usedAttributes['endTokenPos'])) {
+                        $endAttributes['endTokenPos'] = $this->pos;
+                    }
+                    if (isset($this->usedAttributes['endFilePos'])) {
+                        $endAttributes['endFilePos'] = $this->filePos - 1;
+                    }
+
+                    return $this->tokenMap[$token[0]];
+                }
+            }
+        }
+
+        throw new \RuntimeException('Reached end of lexer loop');
+    }
+
+    /**
+     * Returns the token array for current code.
+     *
+     * The token array is in the same format as provided by the
+     * token_get_all() function and does not discard tokens (i.e.
+     * whitespace and comments are included). The token position
+     * attributes are against this token array.
+     *
+     * @return array Array of tokens in token_get_all() format
+     */
+    public function getTokens() {
+        return $this->tokens;
+    }
+
+    /**
+     * Handles __halt_compiler() by returning the text after it.
+     *
+     * @return string Remaining text
+     */
+    public function handleHaltCompiler() {
+        // text after T_HALT_COMPILER, still including ();
+        $textAfter = substr($this->code, $this->filePos);
+
+        // ensure that it is followed by ();
+        // this simplifies the situation, by not allowing any comments
+        // in between of the tokens.
+        if (!preg_match('~^\s*\(\s*\)\s*(?:;|\?>\r?\n?)~', $textAfter, $matches)) {
+            throw new Error('__HALT_COMPILER must be followed by "();"');
+        }
+
+        // prevent the lexer from returning any further tokens
+        $this->pos = count($this->tokens);
+
+        // return with (); removed
+        return (string) substr($textAfter, strlen($matches[0])); // (string) converts false to ''
+    }
+
+    /**
+     * Creates the token map.
+     *
+     * The token map maps the PHP internal token identifiers
+     * to the identifiers used by the Parser. Additionally it
+     * maps T_OPEN_TAG_WITH_ECHO to T_ECHO and T_CLOSE_TAG to ';'.
+     *
+     * @return array The token map
+     */
+    protected function createTokenMap() {
+        $tokenMap = array();
+
+        // 256 is the minimum possible token number, as everything below
+        // it is an ASCII value
+        for ($i = 256; $i < 1000; ++$i) {
+            if (T_DOUBLE_COLON === $i) {
+                // T_DOUBLE_COLON is equivalent to T_PAAMAYIM_NEKUDOTAYIM
+                $tokenMap[$i] = Parser::T_PAAMAYIM_NEKUDOTAYIM;
+            } elseif(T_OPEN_TAG_WITH_ECHO === $i) {
+                // T_OPEN_TAG_WITH_ECHO with dropped T_OPEN_TAG results in T_ECHO
+                $tokenMap[$i] = Parser::T_ECHO;
+            } elseif(T_CLOSE_TAG === $i) {
+                // T_CLOSE_TAG is equivalent to ';'
+                $tokenMap[$i] = ord(';');
+            } elseif ('UNKNOWN' !== $name = token_name($i)) {
+                if ('T_HASHBANG' === $name) {
+                    // HHVM uses a special token for #! hashbang lines
+                    $tokenMap[$i] = Parser::T_INLINE_HTML;
+                } else if (defined($name = 'PhpParser\Parser::' . $name)) {
+                    // Other tokens can be mapped directly
+                    $tokenMap[$i] = constant($name);
+                }
+            }
+        }
+
+        // HHVM uses a special token for numbers that overflow to double
+        if (defined('T_ONUMBER')) {
+            $tokenMap[T_ONUMBER] = Parser::T_DNUMBER;
+        }
+        // HHVM also has a separate token for the __COMPILER_HALT_OFFSET__ constant
+        if (defined('T_COMPILER_HALT_OFFSET')) {
+            $tokenMap[T_COMPILER_HALT_OFFSET] = Parser::T_STRING;
+        }
+
+        return $tokenMap;
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php
new file mode 100644
index 0000000000..837def4ee3
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php
@@ -0,0 +1,231 @@
+ array(
+                'finally'       => Parser::T_FINALLY,
+                'yield'         => Parser::T_YIELD,
+            ),
+            self::PHP_5_4 => array(
+                'callable'      => Parser::T_CALLABLE,
+                'insteadof'     => Parser::T_INSTEADOF,
+                'trait'         => Parser::T_TRAIT,
+                '__trait__'     => Parser::T_TRAIT_C,
+            ),
+        );
+
+        $this->newKeywords = array();
+        foreach ($newKeywordsPerVersion as $version => $newKeywords) {
+            if (version_compare(PHP_VERSION, $version, '>=')) {
+                break;
+            }
+
+            $this->newKeywords += $newKeywords;
+        }
+
+        if (version_compare(PHP_VERSION, self::PHP_7_0, '>=')) {
+            return;
+        }
+        $this->tokenMap[self::T_COALESCE] = Parser::T_COALESCE;
+        $this->tokenMap[self::T_SPACESHIP] = Parser::T_SPACESHIP;
+        $this->tokenMap[self::T_YIELD_FROM] = Parser::T_YIELD_FROM;
+
+        if (version_compare(PHP_VERSION, self::PHP_5_6, '>=')) {
+            return;
+        }
+        $this->tokenMap[self::T_ELLIPSIS]  = Parser::T_ELLIPSIS;
+        $this->tokenMap[self::T_POW]       = Parser::T_POW;
+        $this->tokenMap[self::T_POW_EQUAL] = Parser::T_POW_EQUAL;
+    }
+
+    public function startLexing($code) {
+        $this->inObjectAccess = false;
+
+        $preprocessedCode = $this->preprocessCode($code);
+        parent::startLexing($preprocessedCode);
+        if ($preprocessedCode !== $code) {
+            $this->postprocessTokens();
+        }
+
+        // Set code property back to the original code, so __halt_compiler()
+        // handling and (start|end)FilePos attributes use the correct offsets
+        $this->code = $code;
+    }
+
+    /*
+     * Replaces new features in the code by ~__EMU__{NAME}__{DATA}__~ sequences.
+     * ~LABEL~ is never valid PHP code, that's why we can (to some degree) safely
+     * use it here.
+     * Later when preprocessing the tokens these sequences will either be replaced
+     * by real tokens or replaced with their original content (e.g. if they occurred
+     * inside a string, i.e. a place where they don't have a special meaning).
+     */
+    protected function preprocessCode($code) {
+        if (version_compare(PHP_VERSION, self::PHP_7_0, '>=')) {
+            return $code;
+        }
+
+        $code = str_replace('??', '~__EMU__COALESCE__~', $code);
+        $code = str_replace('<=>', '~__EMU__SPACESHIP__~', $code);
+        $code = preg_replace_callback('(yield[ \n\r\t]+from)', function($matches) {
+            // Encoding $0 in order to preserve exact whitespace
+            return '~__EMU__YIELDFROM__' . bin2hex($matches[0]) . '__~';
+        }, $code);
+
+        if (version_compare(PHP_VERSION, self::PHP_5_6, '>=')) {
+            return $code;
+        }
+
+        $code = str_replace('...', '~__EMU__ELLIPSIS__~', $code);
+        $code = preg_replace('((?=')) {
+            return $code;
+        }
+
+        // binary notation (0b010101101001...)
+        return preg_replace('(\b0b[01]+\b)', '~__EMU__BINARY__$0__~', $code);
+    }
+
+    /*
+     * Replaces the ~__EMU__...~ sequences with real tokens or their original
+     * value.
+     */
+    protected function postprocessTokens() {
+        // we need to manually iterate and manage a count because we'll change
+        // the tokens array on the way
+        for ($i = 0, $c = count($this->tokens); $i < $c; ++$i) {
+            // first check that the following tokens are of form ~LABEL~,
+            // then match the __EMU__... sequence.
+            if ('~' === $this->tokens[$i]
+                && isset($this->tokens[$i + 2])
+                && '~' === $this->tokens[$i + 2]
+                && T_STRING === $this->tokens[$i + 1][0]
+                && preg_match('(^__EMU__([A-Z]++)__(?:([A-Za-z0-9]++)__)?$)', $this->tokens[$i + 1][1], $matches)
+            ) {
+                if ('BINARY' === $matches[1]) {
+                    // the binary number can either be an integer or a double, so return a LNUMBER
+                    // or DNUMBER respectively
+                    $isInt = is_int(bindec($matches[2]));
+                    $replace = array(
+                        array($isInt ? T_LNUMBER : T_DNUMBER, $matches[2], $this->tokens[$i + 1][2])
+                    );
+                } else if ('ELLIPSIS' === $matches[1]) {
+                    $replace = array(
+                        array(self::T_ELLIPSIS, '...', $this->tokens[$i + 1][2])
+                    );
+                } else if ('POW' === $matches[1]) {
+                    $replace = array(
+                        array(self::T_POW, '**', $this->tokens[$i + 1][2])
+                    );
+                } else if ('POWEQUAL' === $matches[1]) {
+                    $replace = array(
+                        array(self::T_POW_EQUAL, '**=', $this->tokens[$i + 1][2])
+                    );
+                } else if ('COALESCE' === $matches[1]) {
+                    $replace = array(
+                        array(self::T_COALESCE, '??', $this->tokens[$i + 1][2])
+                    );
+                } else if ('SPACESHIP' === $matches[1]) {
+                    $replace = array(
+                        array(self::T_SPACESHIP, '<=>', $this->tokens[$i + 1][2]),
+                    );
+                } else if ('YIELDFROM' === $matches[1]) {
+                    $content = $this->hex2bin($matches[2]);
+                    $replace = array(
+                        array(self::T_YIELD_FROM, $content, $this->tokens[$i + 1][2] - substr_count($content, "\n"))
+                    );
+                } else {
+                    throw new \RuntimeException('Invalid __EMU__ sequence');
+                }
+
+                array_splice($this->tokens, $i, 3, $replace);
+                $c -= 3 - count($replace);
+            // for multichar tokens (e.g. strings) replace any ~__EMU__...~ sequences
+            // in their content with the original character sequence
+            } elseif (is_array($this->tokens[$i])
+                      && 0 !== strpos($this->tokens[$i][1], '__EMU__')
+            ) {
+                $this->tokens[$i][1] = preg_replace_callback(
+                    '(~__EMU__([A-Z]++)__(?:([A-Za-z0-9]++)__)?~)',
+                    array($this, 'restoreContentCallback'),
+                    $this->tokens[$i][1]
+                );
+            }
+        }
+    }
+
+    /*
+     * This method is a callback for restoring EMU sequences in
+     * multichar tokens (like strings) to their original value.
+     */
+    public function restoreContentCallback(array $matches) {
+        if ('BINARY' === $matches[1]) {
+            return $matches[2];
+        } else if ('ELLIPSIS' === $matches[1]) {
+            return '...';
+        } else if ('POW' === $matches[1]) {
+            return '**';
+        } else if ('POWEQUAL' === $matches[1]) {
+            return '**=';
+        } else if ('COALESCE' === $matches[1]) {
+            return '??';
+        } else if ('SPACESHIP' === $matches[1]) {
+            return '<=>';
+        } else if ('YIELDFROM' === $matches[1]) {
+            return $this->hex2bin($matches[2]);
+        } else {
+            return $matches[0];
+        }
+    }
+
+    private function hex2bin($str) {
+        // TODO Drop when removing support for PHP 5.3
+        return pack('H*', $str);
+    }
+
+    public function getNextToken(&$value = null, &$startAttributes = null, &$endAttributes = null) {
+        $token = parent::getNextToken($value, $startAttributes, $endAttributes);
+
+        // replace new keywords by their respective tokens. This is not done
+        // if we currently are in an object access (e.g. in $obj->namespace
+        // "namespace" stays a T_STRING tokens and isn't converted to T_NAMESPACE)
+        if (Parser::T_STRING === $token && !$this->inObjectAccess) {
+            if (isset($this->newKeywords[strtolower($value)])) {
+                return $this->newKeywords[strtolower($value)];
+            }
+        } else {
+            // keep track of whether we currently are in an object access (after ->)
+            $this->inObjectAccess = Parser::T_OBJECT_OPERATOR === $token;
+        }
+
+        return $token;
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node.php b/vendor/nikic/php-parser/lib/PhpParser/Node.php
new file mode 100644
index 0000000000..a28ccc194b
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node.php
@@ -0,0 +1,77 @@
+value = $value;
+        $this->byRef = $byRef;
+        $this->unpack = $unpack;
+    }
+
+    public function getSubNodeNames() {
+        return array('value', 'byRef', 'unpack');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Const_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Const_.php
new file mode 100644
index 0000000000..f6fcf657e9
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Const_.php
@@ -0,0 +1,30 @@
+name = $name;
+        $this->value = $value;
+    }
+
+    public function getSubNodeNames() {
+        return array('name', 'value');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr.php
new file mode 100644
index 0000000000..2dae5bfcd6
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr.php
@@ -0,0 +1,9 @@
+var = $var;
+        $this->dim = $dim;
+    }
+
+    public function getSubnodeNames() {
+        return array('var', 'dim');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php
new file mode 100644
index 0000000000..8999b5f188
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php
@@ -0,0 +1,34 @@
+key = $key;
+        $this->value = $value;
+        $this->byRef = $byRef;
+    }
+
+    public function getSubNodeNames() {
+        return array('key', 'value', 'byRef');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php
new file mode 100644
index 0000000000..0385fe22e0
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php
@@ -0,0 +1,26 @@
+items = $items;
+    }
+
+    public function getSubNodeNames() {
+        return array('items');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php
new file mode 100644
index 0000000000..ef16f8e768
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php
@@ -0,0 +1,30 @@
+var = $var;
+        $this->expr = $expr;
+    }
+
+    public function getSubNodeNames() {
+        return array('var', 'expr');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php
new file mode 100644
index 0000000000..54653ffce1
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php
@@ -0,0 +1,34 @@
+var = $var;
+        $this->expr = $expr;
+    }
+
+    public function getSubNodeNames() {
+        return array('var', 'expr');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php
new file mode 100644
index 0000000000..9e3ed8226a
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php
@@ -0,0 +1,9 @@
+var = $var;
+        $this->expr = $expr;
+    }
+
+    public function getSubNodeNames() {
+        return array('var', 'expr');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php
new file mode 100644
index 0000000000..d8a7e2538a
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php
@@ -0,0 +1,30 @@
+left = $left;
+        $this->right = $right;
+    }
+
+    public function getSubNodeNames() {
+        return array('left', 'right');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php
new file mode 100644
index 0000000000..bd6c5c1fbd
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php
@@ -0,0 +1,9 @@
+expr = $expr;
+    }
+
+    public function getSubNodeNames() {
+        return array('expr');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php
new file mode 100644
index 0000000000..2706a50934
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php
@@ -0,0 +1,26 @@
+expr = $expr;
+    }
+
+    public function getSubNodeNames() {
+        return array('expr');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php
new file mode 100644
index 0000000000..13772e4d29
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php
@@ -0,0 +1,26 @@
+expr = $expr;
+    }
+
+    public function getSubNodeNames() {
+        return array('expr');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php
new file mode 100644
index 0000000000..08b3a384c3
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php
@@ -0,0 +1,9 @@
+class = $class;
+        $this->name = $name;
+    }
+
+    public function getSubNodeNames() {
+        return array('class', 'name');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php
new file mode 100644
index 0000000000..1bfab2e97e
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php
@@ -0,0 +1,26 @@
+expr = $expr;
+    }
+
+    public function getSubNodeNames() {
+        return array('expr');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php
new file mode 100644
index 0000000000..0cdcd415ce
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php
@@ -0,0 +1,65 @@
+ false  : Whether the closure is static
+     *                          'byRef'      => false  : Whether to return by reference
+     *                          'params'     => array(): Parameters
+     *                          'uses'       => array(): use()s
+     *                          'returnType' => null   : Return type
+     *                          'stmts'      => array(): Statements
+     * @param array $attributes Additional attributes
+     */
+    public function __construct(array $subNodes = array(), array $attributes = array()) {
+        parent::__construct(null, $attributes);
+        $this->static = isset($subNodes['static']) ? $subNodes['static'] : false;
+        $this->byRef = isset($subNodes['byRef']) ? $subNodes['byRef'] : false;
+        $this->params = isset($subNodes['params']) ? $subNodes['params'] : array();
+        $this->uses = isset($subNodes['uses']) ? $subNodes['uses'] : array();
+        $this->returnType = isset($subNodes['returnType']) ? $subNodes['returnType'] : null;
+        $this->stmts = isset($subNodes['stmts']) ? $subNodes['stmts'] : array();
+    }
+
+    public function getSubNodeNames() {
+        return array('static', 'byRef', 'params', 'uses', 'returnType', 'stmts');
+    }
+
+    public function returnsByRef() {
+        return $this->byRef;
+    }
+
+    public function getParams() {
+        return $this->params;
+    }
+
+    public function getReturnType() {
+        return $this->returnType;
+    }
+
+    public function getStmts() {
+        return $this->stmts;
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php
new file mode 100644
index 0000000000..6669127224
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php
@@ -0,0 +1,30 @@
+var = $var;
+        $this->byRef = $byRef;
+    }
+
+    public function getSubNodeNames() {
+        return array('var', 'byRef');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php
new file mode 100644
index 0000000000..4604a32775
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php
@@ -0,0 +1,27 @@
+name = $name;
+    }
+
+    public function getSubNodeNames() {
+        return array('name');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php
new file mode 100644
index 0000000000..a2503df588
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php
@@ -0,0 +1,26 @@
+expr = $expr;
+    }
+
+    public function getSubNodeNames() {
+        return array('expr');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php
new file mode 100644
index 0000000000..b55cc50e89
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php
@@ -0,0 +1,26 @@
+expr = $expr;
+    }
+
+    public function getSubNodeNames() {
+        return array('expr');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php
new file mode 100644
index 0000000000..cb977c2f99
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php
@@ -0,0 +1,26 @@
+expr = $expr;
+    }
+
+    public function getSubNodeNames() {
+        return array('expr');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php
new file mode 100644
index 0000000000..c8e542b214
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php
@@ -0,0 +1,26 @@
+expr = $expr;
+    }
+
+    public function getSubNodeNames() {
+        return array('expr');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php
new file mode 100644
index 0000000000..dae3aab06d
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php
@@ -0,0 +1,31 @@
+name = $name;
+        $this->args = $args;
+    }
+
+    public function getSubNodeNames() {
+        return array('name', 'args');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php
new file mode 100644
index 0000000000..280ac98c2d
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php
@@ -0,0 +1,35 @@
+expr = $expr;
+        $this->type = $type;
+    }
+
+    public function getSubNodeNames() {
+        return array('expr', 'type');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php
new file mode 100644
index 0000000000..0c670b08a9
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php
@@ -0,0 +1,31 @@
+expr = $expr;
+        $this->class = $class;
+    }
+
+    public function getSubNodeNames() {
+        return array('expr', 'class');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php
new file mode 100644
index 0000000000..91e50fdd0d
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php
@@ -0,0 +1,26 @@
+vars = $vars;
+    }
+
+    public function getSubNodeNames() {
+        return array('vars');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php
new file mode 100644
index 0000000000..962543b1de
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php
@@ -0,0 +1,26 @@
+vars = $vars;
+    }
+
+    public function getSubNodeNames() {
+        return array('vars');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php
new file mode 100644
index 0000000000..0a8b6d9a26
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php
@@ -0,0 +1,35 @@
+var = $var;
+        $this->name = $name;
+        $this->args = $args;
+    }
+
+    public function getSubNodeNames() {
+        return array('var', 'name', 'args');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php
new file mode 100644
index 0000000000..690efe6c11
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php
@@ -0,0 +1,31 @@
+class = $class;
+        $this->args = $args;
+    }
+
+    public function getSubNodeNames() {
+        return array('class', 'args');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php
new file mode 100644
index 0000000000..66ba5dc7d9
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php
@@ -0,0 +1,26 @@
+var = $var;
+    }
+
+    public function getSubNodeNames() {
+        return array('var');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php
new file mode 100644
index 0000000000..ad72482fdd
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php
@@ -0,0 +1,26 @@
+var = $var;
+    }
+
+    public function getSubNodeNames() {
+        return array('var');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php
new file mode 100644
index 0000000000..c388ab51c5
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php
@@ -0,0 +1,26 @@
+var = $var;
+    }
+
+    public function getSubNodeNames() {
+        return array('var');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php
new file mode 100644
index 0000000000..da8a58a5a6
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php
@@ -0,0 +1,26 @@
+var = $var;
+    }
+
+    public function getSubNodeNames() {
+        return array('var');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php
new file mode 100644
index 0000000000..af7f02de8b
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php
@@ -0,0 +1,26 @@
+expr = $expr;
+    }
+
+    public function getSubNodeNames() {
+        return array('expr');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php
new file mode 100644
index 0000000000..37dcd7f011
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php
@@ -0,0 +1,30 @@
+var = $var;
+        $this->name = $name;
+    }
+
+    public function getSubNodeNames() {
+        return array('var', 'name');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php
new file mode 100644
index 0000000000..f0adf3efb6
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php
@@ -0,0 +1,26 @@
+parts = $parts;
+    }
+
+    public function getSubNodeNames() {
+        return array('parts');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php
new file mode 100644
index 0000000000..eb17ab8a9f
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php
@@ -0,0 +1,35 @@
+class = $class;
+        $this->name = $name;
+        $this->args = $args;
+    }
+
+    public function getSubNodeNames() {
+        return array('class', 'name', 'args');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php
new file mode 100644
index 0000000000..acc86eca97
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php
@@ -0,0 +1,31 @@
+class = $class;
+        $this->name = $name;
+    }
+
+    public function getSubNodeNames() {
+        return array('class', 'name');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php
new file mode 100644
index 0000000000..05d2e7a13f
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php
@@ -0,0 +1,34 @@
+cond = $cond;
+        $this->if = $if;
+        $this->else = $else;
+    }
+
+    public function getSubNodeNames() {
+        return array('cond', 'if', 'else');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php
new file mode 100644
index 0000000000..27960f8782
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php
@@ -0,0 +1,26 @@
+expr = $expr;
+    }
+
+    public function getSubNodeNames() {
+        return array('expr');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php
new file mode 100644
index 0000000000..0f545b9162
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php
@@ -0,0 +1,26 @@
+expr = $expr;
+    }
+
+    public function getSubNodeNames() {
+        return array('expr');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php
new file mode 100644
index 0000000000..b5dd78a37f
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php
@@ -0,0 +1,26 @@
+name = $name;
+    }
+
+    public function getSubNodeNames() {
+        return array('name');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php
new file mode 100644
index 0000000000..0936f89188
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php
@@ -0,0 +1,26 @@
+expr = $expr;
+    }
+
+    public function getSubNodeNames() {
+        return array('expr');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php
new file mode 100644
index 0000000000..e7e6f00862
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php
@@ -0,0 +1,30 @@
+key = $key;
+        $this->value = $value;
+    }
+
+    public function getSubNodeNames() {
+        return array('key', 'value');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php b/vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php
new file mode 100644
index 0000000000..efe4333327
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php
@@ -0,0 +1,36 @@
+parts = $parts;
+    }
+
+    public function getSubNodeNames() {
+        return array('parts');
+    }
+
+    /**
+     * Gets the first part of the name, i.e. everything before the first namespace separator.
+     *
+     * @return string First part of the name
+     */
+    public function getFirst() {
+        return $this->parts[0];
+    }
+
+    /**
+     * Gets the last part of the name, i.e. everything after the last namespace separator.
+     *
+     * @return string Last part of the name
+     */
+    public function getLast() {
+        return $this->parts[count($this->parts) - 1];
+    }
+
+    /**
+     * Checks whether the name is unqualified. (E.g. Name)
+     *
+     * @return bool Whether the name is unqualified
+     */
+    public function isUnqualified() {
+        return 1 == count($this->parts);
+    }
+
+    /**
+     * Checks whether the name is qualified. (E.g. Name\Name)
+     *
+     * @return bool Whether the name is qualified
+     */
+    public function isQualified() {
+        return 1 < count($this->parts);
+    }
+
+    /**
+     * Checks whether the name is fully qualified. (E.g. \Name)
+     *
+     * @return bool Whether the name is fully qualified
+     */
+    public function isFullyQualified() {
+        return false;
+    }
+
+    /**
+     * Checks whether the name is explicitly relative to the current namespace. (E.g. namespace\Name)
+     *
+     * @return bool Whether the name is relative
+     */
+    public function isRelative() {
+        return false;
+    }
+
+    /**
+     * Returns a string representation of the name by imploding the namespace parts with a separator.
+     *
+     * @param string $separator The separator to use (defaults to the namespace separator \)
+     *
+     * @return string String representation
+     */
+    public function toString($separator = '\\') {
+        return implode($separator, $this->parts);
+    }
+
+    /**
+     * Returns a string representation of the name by imploding the namespace parts with the
+     * namespace separator.
+     *
+     * @return string String representation
+     */
+    public function __toString() {
+        return implode('\\', $this->parts);
+    }
+
+    /**
+     * Sets the whole name.
+     *
+     * @param string|array|self $name The name to set the whole name to
+     */
+    public function set($name) {
+        $this->parts = $this->prepareName($name);
+    }
+
+    /**
+     * Prepends a name to this name.
+     *
+     * @param string|array|self $name Name to prepend
+     */
+    public function prepend($name) {
+        $this->parts = array_merge($this->prepareName($name), $this->parts);
+    }
+
+    /**
+     * Appends a name to this name.
+     *
+     * @param string|array|self $name Name to append
+     */
+    public function append($name) {
+        $this->parts = array_merge($this->parts, $this->prepareName($name));
+    }
+
+    /**
+     * Sets the first part of the name.
+     *
+     * @param string|array|self $name The name to set the first part to
+     */
+    public function setFirst($name) {
+        array_splice($this->parts, 0, 1, $this->prepareName($name));
+    }
+
+    /**
+     * Sets the last part of the name.
+     *
+     * @param string|array|self $name The name to set the last part to
+     */
+    public function setLast($name) {
+        array_splice($this->parts, -1, 1, $this->prepareName($name));
+    }
+
+    /**
+     * Prepares a (string, array or Name node) name for use in name changing methods by converting
+     * it to an array.
+     *
+     * @param string|array|self $name Name to prepare
+     *
+     * @return array Prepared name
+     */
+    protected function prepareName($name) {
+        if (is_string($name)) {
+            return explode('\\', $name);
+        } elseif (is_array($name)) {
+            return $name;
+        } elseif ($name instanceof self) {
+            return $name->parts;
+        }
+
+        throw new \InvalidArgumentException(
+            'When changing a name you need to pass either a string, an array or a Name node'
+        );
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php
new file mode 100644
index 0000000000..97cc1113d2
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php
@@ -0,0 +1,42 @@
+type = $type;
+        $this->byRef = $byRef;
+        $this->variadic = $variadic;
+        $this->name = $name;
+        $this->default = $default;
+
+        if ($variadic && null !== $default) {
+            throw new Error('Variadic parameter cannot have a default value', $default->getAttributes());
+        }
+    }
+
+    public function getSubNodeNames() {
+        return array('type', 'byRef', 'variadic', 'name', 'default');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar.php
new file mode 100644
index 0000000000..01177532cd
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar.php
@@ -0,0 +1,7 @@
+value = $value;
+    }
+
+    public function getSubNodeNames() {
+        return array('value');
+    }
+
+    /**
+     * @internal
+     *
+     * Parses a DNUMBER token like PHP would.
+     *
+     * @param string $str A string number
+     *
+     * @return float The parsed number
+     */
+    public static function parse($str) {
+        // if string contains any of .eE just cast it to float
+        if (false !== strpbrk($str, '.eE')) {
+            return (float) $str;
+        }
+
+        // otherwise it's an integer notation that overflowed into a float
+        // if it starts with 0 it's one of the special integer notations
+        if ('0' === $str[0]) {
+            // hex
+            if ('x' === $str[1] || 'X' === $str[1]) {
+                return hexdec($str);
+            }
+
+            // bin
+            if ('b' === $str[1] || 'B' === $str[1]) {
+                return bindec($str);
+            }
+
+            // oct
+            // substr($str, 0, strcspn($str, '89')) cuts the string at the first invalid digit (8 or 9)
+            // so that only the digits before that are used
+            return octdec(substr($str, 0, strcspn($str, '89')));
+        }
+
+        // dec
+        return (float) $str;
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php
new file mode 100644
index 0000000000..c2555bfd21
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php
@@ -0,0 +1,26 @@
+parts = $parts;
+    }
+
+    public function getSubNodeNames() {
+        return array('parts');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php
new file mode 100644
index 0000000000..4a4e6039c4
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php
@@ -0,0 +1,61 @@
+value = $value;
+    }
+
+    public function getSubNodeNames() {
+        return array('value');
+    }
+
+    /**
+     * @internal
+     *
+     * Parses an LNUMBER token (dec, hex, oct and bin notations) like PHP would.
+     *
+     * @param string $str A string number
+     *
+     * @return int The parsed number
+     */
+    public static function parse($str) {
+        // handle plain 0 specially
+        if ('0' === $str) {
+            return 0;
+        }
+
+        // if first char is 0 (and number isn't 0) it's a special syntax
+        if ('0' === $str[0]) {
+            // hex
+            if ('x' === $str[1] || 'X' === $str[1]) {
+                return hexdec($str);
+            }
+
+            // bin
+            if ('b' === $str[1] || 'B' === $str[1]) {
+                return bindec($str);
+            }
+
+            // oct (intval instead of octdec to get proper cutting behavior with malformed numbers)
+            return intval($str, 8);
+        }
+
+        // dec
+        return (int) $str;
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php
new file mode 100644
index 0000000000..969a66403f
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php
@@ -0,0 +1,28 @@
+ '\\',
+        '$'  =>  '$',
+        'n'  => "\n",
+        'r'  => "\r",
+        't'  => "\t",
+        'f'  => "\f",
+        'v'  => "\v",
+        'e'  => "\x1B",
+    );
+
+    /**
+     * Constructs a string scalar node.
+     *
+     * @param string $value      Value of the string
+     * @param array  $attributes Additional attributes
+     */
+    public function __construct($value = '', array $attributes = array()) {
+        parent::__construct(null, $attributes);
+        $this->value = $value;
+    }
+
+    public function getSubNodeNames() {
+        return array('value');
+    }
+
+    /**
+     * @internal
+     *
+     * Parses a string token.
+     *
+     * @param string $str String token content
+     *
+     * @return string The parsed string
+     */
+    public static function parse($str) {
+        $bLength = 0;
+        if ('b' === $str[0]) {
+            $bLength = 1;
+        }
+
+        if ('\'' === $str[$bLength]) {
+            return str_replace(
+                array('\\\\', '\\\''),
+                array(  '\\',   '\''),
+                substr($str, $bLength + 1, -1)
+            );
+        } else {
+            return self::parseEscapeSequences(substr($str, $bLength + 1, -1), '"');
+        }
+    }
+
+    /**
+     * @internal
+     *
+     * Parses escape sequences in strings (all string types apart from single quoted).
+     *
+     * @param string      $str   String without quotes
+     * @param null|string $quote Quote type
+     *
+     * @return string String with escape sequences parsed
+     */
+    public static function parseEscapeSequences($str, $quote) {
+        if (null !== $quote) {
+            $str = str_replace('\\' . $quote, $quote, $str);
+        }
+
+        return preg_replace_callback(
+            '~\\\\([\\\\$nrtfve]|[xX][0-9a-fA-F]{1,2}|[0-7]{1,3})~',
+            array(__CLASS__, 'parseCallback'),
+            $str
+        );
+    }
+
+    private static function parseCallback($matches) {
+        $str = $matches[1];
+
+        if (isset(self::$replacements[$str])) {
+            return self::$replacements[$str];
+        } elseif ('x' === $str[0] || 'X' === $str[0]) {
+            return chr(hexdec($str));
+        } else {
+            return chr(octdec($str));
+        }
+    }
+
+    /**
+     * @internal
+     *
+     * Parses a constant doc string.
+     *
+     * @param string $startToken Doc string start token content (<<num = $num;
+    }
+
+    public function getSubNodeNames() {
+        return array('num');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php
new file mode 100644
index 0000000000..50f17a6454
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php
@@ -0,0 +1,30 @@
+cond = $cond;
+        $this->stmts = $stmts;
+    }
+
+    public function getSubNodeNames() {
+        return array('cond', 'stmts');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php
new file mode 100644
index 0000000000..7dd3e9b6c7
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php
@@ -0,0 +1,34 @@
+type = $type;
+        $this->var = $var;
+        $this->stmts = $stmts;
+    }
+
+    public function getSubNodeNames() {
+        return array('type', 'var', 'stmts');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php
new file mode 100644
index 0000000000..3eb6b0cb82
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php
@@ -0,0 +1,26 @@
+consts = $consts;
+    }
+
+    public function getSubNodeNames() {
+        return array('consts');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php
new file mode 100644
index 0000000000..f6831a613e
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php
@@ -0,0 +1,44 @@
+stmts as $stmt) {
+            if ($stmt instanceof ClassMethod) {
+                $methods[] = $stmt;
+            }
+        }
+        return $methods;
+    }
+
+    /**
+     * Gets method with the given name defined directly in this class/interface/trait.
+     *
+     * @param string $name Name of the method (compared case-insensitively)
+     *
+     * @return ClassMethod|null Method node or null if the method does not exist
+     */
+    public function getMethod($name) {
+        $lowerName = strtolower($name);
+        foreach ($this->stmts as $stmt) {
+            if ($stmt instanceof ClassMethod && $lowerName === strtolower($stmt->name)) {
+                return $stmt;
+            }
+        }
+        return null;
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php
new file mode 100644
index 0000000000..c1bd57748b
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php
@@ -0,0 +1,101 @@
+ MODIFIER_PUBLIC: Type
+     *                                'byRef'      => false          : Whether to return by reference
+     *                                'params'     => array()        : Parameters
+     *                                'returnType' => null           : Return type
+     *                                'stmts'      => array()        : Statements
+     * @param array       $attributes Additional attributes
+     */
+    public function __construct($name, array $subNodes = array(), array $attributes = array()) {
+        parent::__construct(null, $attributes);
+        $this->type = isset($subNodes['type']) ? $subNodes['type'] : 0;
+        $this->byRef = isset($subNodes['byRef'])  ? $subNodes['byRef']  : false;
+        $this->name = $name;
+        $this->params = isset($subNodes['params']) ? $subNodes['params'] : array();
+        $this->returnType = isset($subNodes['returnType']) ? $subNodes['returnType'] : null;
+        $this->stmts = array_key_exists('stmts', $subNodes) ? $subNodes['stmts'] : array();
+
+        if ($this->type & Class_::MODIFIER_STATIC) {
+            switch (strtolower($this->name)) {
+                case '__construct':
+                    throw new Error(sprintf('Constructor %s() cannot be static', $this->name));
+                case '__destruct':
+                    throw new Error(sprintf('Destructor %s() cannot be static', $this->name));
+                case '__clone':
+                    throw new Error(sprintf('Clone method %s() cannot be static', $this->name));
+            }
+        }
+    }
+
+    public function getSubNodeNames() {
+        return array('type', 'byRef', 'name', 'params', 'returnType', 'stmts');
+    }
+
+    public function returnsByRef() {
+        return $this->byRef;
+    }
+
+    public function getParams() {
+        return $this->params;
+    }
+
+    public function getReturnType() {
+        return $this->returnType;
+    }
+
+    public function getStmts() {
+        return $this->stmts;
+    }
+
+    public function isPublic() {
+        return ($this->type & Class_::MODIFIER_PUBLIC) !== 0
+            || ($this->type & Class_::VISIBILITY_MODIFER_MASK) === 0;
+    }
+
+    public function isProtected() {
+        return (bool) ($this->type & Class_::MODIFIER_PROTECTED);
+    }
+
+    public function isPrivate() {
+        return (bool) ($this->type & Class_::MODIFIER_PRIVATE);
+    }
+
+    public function isAbstract() {
+        return (bool) ($this->type & Class_::MODIFIER_ABSTRACT);
+    }
+
+    public function isFinal() {
+        return (bool) ($this->type & Class_::MODIFIER_FINAL);
+    }
+
+    public function isStatic() {
+        return (bool) ($this->type & Class_::MODIFIER_STATIC);
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php
new file mode 100644
index 0000000000..496ee512d2
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php
@@ -0,0 +1,112 @@
+ true,
+        'parent' => true,
+        'static' => true,
+    );
+
+    /**
+     * Constructs a class node.
+     *
+     * @param string|null $name       Name
+     * @param array       $subNodes   Array of the following optional subnodes:
+     *                                'type'       => 0      : Type
+     *                                'extends'    => null   : Name of extended class
+     *                                'implements' => array(): Names of implemented interfaces
+     *                                'stmts'      => array(): Statements
+     * @param array       $attributes Additional attributes
+     */
+    public function __construct($name, array $subNodes = array(), array $attributes = array()) {
+        parent::__construct(null, $attributes);
+        $this->type = isset($subNodes['type']) ? $subNodes['type'] : 0;
+        $this->name = $name;
+        $this->extends = isset($subNodes['extends']) ? $subNodes['extends'] : null;
+        $this->implements = isset($subNodes['implements']) ? $subNodes['implements'] : array();
+        $this->stmts = isset($subNodes['stmts']) ? $subNodes['stmts'] : array();
+
+        if (null !== $this->name && isset(self::$specialNames[strtolower($this->name)])) {
+            throw new Error(sprintf('Cannot use \'%s\' as class name as it is reserved', $this->name));
+        }
+
+        if (isset(self::$specialNames[strtolower($this->extends)])) {
+            throw new Error(
+                sprintf('Cannot use \'%s\' as class name as it is reserved', $this->extends),
+                $this->extends->getAttributes()
+            );
+        }
+
+        foreach ($this->implements as $interface) {
+            if (isset(self::$specialNames[strtolower($interface)])) {
+                throw new Error(
+                    sprintf('Cannot use \'%s\' as interface name as it is reserved', $interface),
+                    $interface->getAttributes()
+                );
+            }
+        }
+    }
+
+    public function getSubNodeNames() {
+        return array('type', 'name', 'extends', 'implements', 'stmts');
+    }
+
+    public function isAbstract() {
+        return (bool) ($this->type & self::MODIFIER_ABSTRACT);
+    }
+
+    public function isFinal() {
+        return (bool) ($this->type & self::MODIFIER_FINAL);
+    }
+
+    public function isAnonymous() {
+        return null === $this->name;
+    }
+
+    /**
+     * @internal
+     */
+    public static function verifyModifier($a, $b) {
+        if ($a & self::VISIBILITY_MODIFER_MASK && $b & self::VISIBILITY_MODIFER_MASK) {
+            throw new Error('Multiple access type modifiers are not allowed');
+        }
+
+        if ($a & self::MODIFIER_ABSTRACT && $b & self::MODIFIER_ABSTRACT) {
+            throw new Error('Multiple abstract modifiers are not allowed');
+        }
+
+        if ($a & self::MODIFIER_STATIC && $b & self::MODIFIER_STATIC) {
+            throw new Error('Multiple static modifiers are not allowed');
+        }
+
+        if ($a & self::MODIFIER_FINAL && $b & self::MODIFIER_FINAL) {
+            throw new Error('Multiple final modifiers are not allowed');
+        }
+
+        if ($a & 48 && $b & 48) {
+            throw new Error('Cannot use the final modifier on an abstract class member');
+        }
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php
new file mode 100644
index 0000000000..b42c8df224
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php
@@ -0,0 +1,26 @@
+consts = $consts;
+    }
+
+    public function getSubNodeNames() {
+        return array('consts');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php
new file mode 100644
index 0000000000..0f4c59674c
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php
@@ -0,0 +1,26 @@
+num = $num;
+    }
+
+    public function getSubNodeNames() {
+        return array('num');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php
new file mode 100644
index 0000000000..e7833f6e12
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php
@@ -0,0 +1,30 @@
+value pair node.
+     *
+     * @param string    $key        Key
+     * @param Node\Expr $value      Value
+     * @param array     $attributes Additional attributes
+     */
+    public function __construct($key, Node\Expr $value, array $attributes = array()) {
+        parent::__construct(null, $attributes);
+        $this->key = $key;
+        $this->value = $value;
+    }
+
+    public function getSubNodeNames() {
+        return array('key', 'value');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php
new file mode 100644
index 0000000000..67a753ec02
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php
@@ -0,0 +1,29 @@
+declares = $declares;
+        $this->stmts = $stmts;
+    }
+
+    public function getSubNodeNames() {
+        return array('declares', 'stmts');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php
new file mode 100644
index 0000000000..b5f309216e
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php
@@ -0,0 +1,30 @@
+cond = $cond;
+        $this->stmts = $stmts;
+    }
+
+    public function getSubNodeNames() {
+        return array('cond', 'stmts');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php
new file mode 100644
index 0000000000..9275158dac
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php
@@ -0,0 +1,26 @@
+exprs = $exprs;
+    }
+
+    public function getSubNodeNames() {
+        return array('exprs');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php
new file mode 100644
index 0000000000..1a9773c2b1
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php
@@ -0,0 +1,30 @@
+cond = $cond;
+        $this->stmts = $stmts;
+    }
+
+    public function getSubNodeNames() {
+        return array('cond', 'stmts');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php
new file mode 100644
index 0000000000..ecec6e646f
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php
@@ -0,0 +1,26 @@
+stmts = $stmts;
+    }
+
+    public function getSubNodeNames() {
+        return array('stmts');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php
new file mode 100644
index 0000000000..4f7d4e84ed
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php
@@ -0,0 +1,39 @@
+ array(): Init expressions
+     *                          'cond'  => array(): Loop conditions
+     *                          'loop'  => array(): Loop expressions
+     *                          'stmts' => array(): Statements
+     * @param array $attributes Additional attributes
+     */
+    public function __construct(array $subNodes = array(), array $attributes = array()) {
+        parent::__construct(null, $attributes);
+        $this->init = isset($subNodes['init']) ? $subNodes['init'] : array();
+        $this->cond = isset($subNodes['cond']) ? $subNodes['cond'] : array();
+        $this->loop = isset($subNodes['loop']) ? $subNodes['loop'] : array();
+        $this->stmts = isset($subNodes['stmts']) ? $subNodes['stmts'] : array();
+    }
+
+    public function getSubNodeNames() {
+        return array('init', 'cond', 'loop', 'stmts');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php
new file mode 100644
index 0000000000..bec82e94b3
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php
@@ -0,0 +1,43 @@
+ null   : Variable to assign key to
+     *                              'byRef'  => false  : Whether to assign value by reference
+     *                              'stmts'  => array(): Statements
+     * @param array     $attributes Additional attributes
+     */
+    public function __construct(Node\Expr $expr, Node\Expr $valueVar, array $subNodes = array(), array $attributes = array()) {
+        parent::__construct(null, $attributes);
+        $this->expr = $expr;
+        $this->keyVar = isset($subNodes['keyVar']) ? $subNodes['keyVar'] : null;
+        $this->byRef = isset($subNodes['byRef']) ? $subNodes['byRef'] : false;
+        $this->valueVar = $valueVar;
+        $this->stmts = isset($subNodes['stmts']) ? $subNodes['stmts'] : array();
+    }
+
+    public function getSubNodeNames() {
+        return array('expr', 'keyVar', 'byRef', 'valueVar', 'stmts');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php
new file mode 100644
index 0000000000..10087d5dce
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php
@@ -0,0 +1,60 @@
+ false  : Whether to return by reference
+     *                           'params'     => array(): Parameters
+     *                           'returnType' => null   : Return type
+     *                           'stmts'      => array(): Statements
+     * @param array  $attributes Additional attributes
+     */
+    public function __construct($name, array $subNodes = array(), array $attributes = array()) {
+        parent::__construct(null, $attributes);
+        $this->byRef = isset($subNodes['byRef']) ? $subNodes['byRef'] : false;
+        $this->name = $name;
+        $this->params = isset($subNodes['params']) ? $subNodes['params'] : array();
+        $this->returnType = isset($subNodes['returnType']) ? $subNodes['returnType'] : null;
+        $this->stmts = isset($subNodes['stmts']) ? $subNodes['stmts'] : array();
+    }
+
+    public function getSubNodeNames() {
+        return array('byRef', 'name', 'params', 'returnType', 'stmts');
+    }
+
+    public function returnsByRef() {
+        return $this->byRef;
+    }
+
+    public function getParams() {
+        return $this->params;
+    }
+
+    public function getReturnType() {
+        return $this->returnType;
+    }
+
+    public function getStmts() {
+        return $this->stmts;
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php
new file mode 100644
index 0000000000..21c040f211
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php
@@ -0,0 +1,26 @@
+vars = $vars;
+    }
+
+    public function getSubNodeNames() {
+        return array('vars');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php
new file mode 100644
index 0000000000..97c46f9599
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php
@@ -0,0 +1,26 @@
+name = $name;
+    }
+
+    public function getSubNodeNames() {
+        return array('name');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php
new file mode 100644
index 0000000000..c6c85cf872
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php
@@ -0,0 +1,26 @@
+remaining = $remaining;
+    }
+
+    public function getSubNodeNames() {
+        return array('remaining');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php
new file mode 100644
index 0000000000..3e11f2494f
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php
@@ -0,0 +1,39 @@
+ array(): Statements
+     *                              'elseifs' => array(): Elseif clauses
+     *                              'else'    => null   : Else clause
+     * @param array     $attributes Additional attributes
+     */
+    public function __construct(Node\Expr $cond, array $subNodes = array(), array $attributes = array()) {
+        parent::__construct(null, $attributes);
+        $this->cond = $cond;
+        $this->stmts = isset($subNodes['stmts']) ? $subNodes['stmts'] : array();
+        $this->elseifs = isset($subNodes['elseifs']) ? $subNodes['elseifs'] : array();
+        $this->else = isset($subNodes['else']) ? $subNodes['else'] : null;
+    }
+
+    public function getSubNodeNames() {
+        return array('cond', 'stmts', 'elseifs', 'else');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php
new file mode 100644
index 0000000000..2d0ff98901
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php
@@ -0,0 +1,26 @@
+value = $value;
+    }
+
+    public function getSubNodeNames() {
+        return array('value');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php
new file mode 100644
index 0000000000..e57bac30b5
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php
@@ -0,0 +1,51 @@
+ true,
+        'parent' => true,
+        'static' => true,
+    );
+
+    /**
+     * Constructs a class node.
+     *
+     * @param string $name       Name
+     * @param array  $subNodes   Array of the following optional subnodes:
+     *                           'extends' => array(): Name of extended interfaces
+     *                           'stmts'   => array(): Statements
+     * @param array  $attributes Additional attributes
+     */
+    public function __construct($name, array $subNodes = array(), array $attributes = array()) {
+        parent::__construct(null, $attributes);
+        $this->name = $name;
+        $this->extends = isset($subNodes['extends']) ? $subNodes['extends'] : array();
+        $this->stmts = isset($subNodes['stmts']) ? $subNodes['stmts'] : array();
+
+        if (isset(self::$specialNames[strtolower($this->name)])) {
+            throw new Error(sprintf('Cannot use \'%s\' as class name as it is reserved', $this->name));
+        }
+
+        foreach ($this->extends as $interface) {
+            if (isset(self::$specialNames[strtolower($interface)])) {
+                throw new Error(
+                    sprintf('Cannot use \'%s\' as interface name as it is reserved', $interface),
+                    $interface->getAttributes()
+                );
+            }
+        }
+    }
+
+    public function getSubNodeNames() {
+        return array('name', 'extends', 'stmts');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php
new file mode 100644
index 0000000000..d30acb9f04
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php
@@ -0,0 +1,26 @@
+name = $name;
+    }
+
+    public function getSubNodeNames() {
+        return array('name');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php
new file mode 100644
index 0000000000..f08f4f3f9c
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php
@@ -0,0 +1,52 @@
+ true,
+        'parent' => true,
+        'static' => true,
+    );
+
+    /**
+     * Constructs a namespace node.
+     *
+     * @param null|Node\Name $name       Name
+     * @param null|Node[]    $stmts      Statements
+     * @param array          $attributes Additional attributes
+     */
+    public function __construct(Node\Name $name = null, $stmts = array(), array $attributes = array()) {
+        parent::__construct(null, $attributes);
+        $this->name = $name;
+        $this->stmts = $stmts;
+
+        if (isset(self::$specialNames[strtolower($this->name)])) {
+            throw new Error(
+                sprintf('Cannot use \'%s\' as namespace name', $this->name),
+                $this->name->getAttributes()
+            );
+        }
+
+        if (null !== $this->stmts) {
+            foreach ($this->stmts as $stmt) {
+                if ($stmt instanceof self) {
+                    throw new Error('Namespace declarations cannot be nested', $stmt->getAttributes());
+                }
+            }
+        }
+    }
+
+    public function getSubNodeNames() {
+        return array('name', 'stmts');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php
new file mode 100644
index 0000000000..58052f776b
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php
@@ -0,0 +1,56 @@
+type = $type;
+        $this->props = $props;
+    }
+
+    public function getSubNodeNames() {
+        return array('type', 'props');
+    }
+
+    public function isPublic() {
+        return ($this->type & Class_::MODIFIER_PUBLIC) !== 0
+            || ($this->type & Class_::VISIBILITY_MODIFER_MASK) === 0;
+    }
+
+    public function isProtected() {
+        return (bool) ($this->type & Class_::MODIFIER_PROTECTED);
+    }
+
+    public function isPrivate() {
+        return (bool) ($this->type & Class_::MODIFIER_PRIVATE);
+    }
+
+    public function isStatic() {
+        return (bool) ($this->type & Class_::MODIFIER_STATIC);
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php
new file mode 100644
index 0000000000..f9748aaaad
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php
@@ -0,0 +1,30 @@
+name = $name;
+        $this->default = $default;
+    }
+
+    public function getSubNodeNames() {
+        return array('name', 'default');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php
new file mode 100644
index 0000000000..67b139bbce
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php
@@ -0,0 +1,26 @@
+expr = $expr;
+    }
+
+    public function getSubNodeNames() {
+        return array('expr');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php
new file mode 100644
index 0000000000..aab5174064
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php
@@ -0,0 +1,30 @@
+name = $name;
+        $this->default = $default;
+    }
+
+    public function getSubNodeNames() {
+        return array('name', 'default');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php
new file mode 100644
index 0000000000..49a3f709d6
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php
@@ -0,0 +1,26 @@
+vars = $vars;
+    }
+
+    public function getSubNodeNames() {
+        return array('vars');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php
new file mode 100644
index 0000000000..7a7ec92e0a
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php
@@ -0,0 +1,30 @@
+cond = $cond;
+        $this->cases = $cases;
+    }
+
+    public function getSubNodeNames() {
+        return array('cond', 'cases');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php
new file mode 100644
index 0000000000..3e21986b15
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php
@@ -0,0 +1,26 @@
+expr = $expr;
+    }
+
+    public function getSubNodeNames() {
+        return array('expr');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php
new file mode 100644
index 0000000000..b38f122844
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php
@@ -0,0 +1,31 @@
+traits = $traits;
+        $this->adaptations = $adaptations;
+    }
+
+    public function getSubNodeNames() {
+        return array('traits', 'adaptations');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php
new file mode 100644
index 0000000000..c6038c8ca9
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php
@@ -0,0 +1,13 @@
+trait = $trait;
+        $this->method = $method;
+        $this->newModifier = $newModifier;
+        $this->newName = $newName;
+    }
+
+    public function getSubNodeNames() {
+        return array('trait', 'method', 'newModifier', 'newName');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php
new file mode 100644
index 0000000000..b30c4f8723
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php
@@ -0,0 +1,30 @@
+trait = $trait;
+        $this->method = $method;
+        $this->insteadof = $insteadof;
+    }
+
+    public function getSubNodeNames() {
+        return array('trait', 'method', 'insteadof');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php
new file mode 100644
index 0000000000..b96395ba3b
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php
@@ -0,0 +1,25 @@
+name = $name;
+        $this->stmts = $stmts;
+    }
+
+    public function getSubNodeNames() {
+        return array('name', 'stmts');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php
new file mode 100644
index 0000000000..e3c1782934
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php
@@ -0,0 +1,39 @@
+stmts = $stmts;
+        $this->catches = $catches;
+        $this->finallyStmts = $finallyStmts;
+    }
+
+    public function getSubNodeNames() {
+        return array('stmts', 'catches', 'finallyStmts');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php
new file mode 100644
index 0000000000..035d0bd27e
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php
@@ -0,0 +1,26 @@
+vars = $vars;
+    }
+
+    public function getSubNodeNames() {
+        return array('vars');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php
new file mode 100644
index 0000000000..d163c2f362
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php
@@ -0,0 +1,42 @@
+getLast();
+        }
+
+        if ('self' == strtolower($alias) || 'parent' == strtolower($alias)) {
+            throw new Error(sprintf(
+                'Cannot use %s as %s because \'%2$s\' is a special class name',
+                $name, $alias
+            ));
+        }
+
+        parent::__construct(null, $attributes);
+        $this->name = $name;
+        $this->alias = $alias;
+    }
+
+    public function getSubNodeNames() {
+        return array('name', 'alias');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php
new file mode 100644
index 0000000000..25ef577008
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php
@@ -0,0 +1,34 @@
+type = $type;
+        $this->uses = $uses;
+    }
+
+    public function getSubNodeNames() {
+        return array('type', 'uses');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php
new file mode 100644
index 0000000000..7ca10e2bb5
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php
@@ -0,0 +1,30 @@
+cond = $cond;
+        $this->stmts = $stmts;
+    }
+
+    public function getSubNodeNames() {
+        return array('cond', 'stmts');
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.php b/vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.php
new file mode 100644
index 0000000000..8940e2d9c9
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.php
@@ -0,0 +1,121 @@
+attributes = $attributes;
+
+        if (null !== $subNodes) {
+            foreach ($subNodes as $name => $value) {
+                $this->$name = $value;
+            }
+            $this->subNodeNames = array_keys($subNodes);
+        }
+    }
+
+    /**
+     * Gets the type of the node.
+     *
+     * @return string Type of the node
+     */
+    public function getType() {
+        return strtr(substr(rtrim(get_class($this), '_'), 15), '\\', '_');
+    }
+
+    /**
+     * Gets the names of the sub nodes.
+     *
+     * @return array Names of sub nodes
+     */
+    public function getSubNodeNames() {
+        return $this->subNodeNames;
+    }
+
+    /**
+     * Gets line the node started in.
+     *
+     * @return int Line
+     */
+    public function getLine() {
+        return $this->getAttribute('startLine', -1);
+    }
+
+    /**
+     * Sets line the node started in.
+     *
+     * @param int $line Line
+     */
+    public function setLine($line) {
+        $this->setAttribute('startLine', (int) $line);
+    }
+
+    /**
+     * Gets the doc comment of the node.
+     *
+     * The doc comment has to be the last comment associated with the node.
+     *
+     * @return null|Comment\Doc Doc comment object or null
+     */
+    public function getDocComment() {
+        $comments = $this->getAttribute('comments');
+        if (!$comments) {
+            return null;
+        }
+
+        $lastComment = $comments[count($comments) - 1];
+        if (!$lastComment instanceof Comment\Doc) {
+            return null;
+        }
+
+        return $lastComment;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function setAttribute($key, $value) {
+        $this->attributes[$key] = $value;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function hasAttribute($key) {
+        return array_key_exists($key, $this->attributes);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function &getAttribute($key, $default = null) {
+        if (!array_key_exists($key, $this->attributes)) {
+            return $default;
+        } else {
+            return $this->attributes[$key];
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getAttributes() {
+        return $this->attributes;
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeDumper.php b/vendor/nikic/php-parser/lib/PhpParser/NodeDumper.php
new file mode 100644
index 0000000000..57a6fe7f74
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/NodeDumper.php
@@ -0,0 +1,58 @@
+getType() . '(';
+
+            foreach ($node->getSubNodeNames() as $key) {
+                $r .= "\n    " . $key . ': ';
+
+                $value = $node->$key;
+                if (null === $value) {
+                    $r .= 'null';
+                } elseif (false === $value) {
+                    $r .= 'false';
+                } elseif (true === $value) {
+                    $r .= 'true';
+                } elseif (is_scalar($value)) {
+                    $r .= $value;
+                } else {
+                    $r .= str_replace("\n", "\n    ", $this->dump($value));
+                }
+            }
+        } elseif (is_array($node)) {
+            $r = 'array(';
+
+            foreach ($node as $key => $value) {
+                $r .= "\n    " . $key . ': ';
+
+                if (null === $value) {
+                    $r .= 'null';
+                } elseif (false === $value) {
+                    $r .= 'false';
+                } elseif (true === $value) {
+                    $r .= 'true';
+                } elseif (is_scalar($value)) {
+                    $r .= $value;
+                } else {
+                    $r .= str_replace("\n", "\n    ", $this->dump($value));
+                }
+            }
+        } else {
+            throw new \InvalidArgumentException('Can only dump nodes and arrays.');
+        }
+
+        return $r . "\n)";
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php b/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php
new file mode 100644
index 0000000000..ba6857bb6c
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php
@@ -0,0 +1,156 @@
+visitors = array();
+        $this->cloneNodes = $cloneNodes;
+    }
+
+    /**
+     * Adds a visitor.
+     *
+     * @param NodeVisitor $visitor Visitor to add
+     */
+    public function addVisitor(NodeVisitor $visitor) {
+        $this->visitors[] = $visitor;
+    }
+
+    /**
+     * Removes an added visitor.
+     *
+     * @param NodeVisitor $visitor
+     */
+    public function removeVisitor(NodeVisitor $visitor) {
+        foreach ($this->visitors as $index => $storedVisitor) {
+            if ($storedVisitor === $visitor) {
+                unset($this->visitors[$index]);
+                break;
+            }
+        }
+    }
+
+    /**
+     * Traverses an array of nodes using the registered visitors.
+     *
+     * @param Node[] $nodes Array of nodes
+     *
+     * @return Node[] Traversed array of nodes
+     */
+    public function traverse(array $nodes) {
+        foreach ($this->visitors as $visitor) {
+            if (null !== $return = $visitor->beforeTraverse($nodes)) {
+                $nodes = $return;
+            }
+        }
+
+        $nodes = $this->traverseArray($nodes);
+
+        foreach ($this->visitors as $visitor) {
+            if (null !== $return = $visitor->afterTraverse($nodes)) {
+                $nodes = $return;
+            }
+        }
+
+        return $nodes;
+    }
+
+    protected function traverseNode(Node $node) {
+        if ($this->cloneNodes) {
+            $node = clone $node;
+        }
+
+        foreach ($node->getSubNodeNames() as $name) {
+            $subNode =& $node->$name;
+
+            if (is_array($subNode)) {
+                $subNode = $this->traverseArray($subNode);
+            } elseif ($subNode instanceof Node) {
+                $traverseChildren = true;
+                foreach ($this->visitors as $visitor) {
+                    $return = $visitor->enterNode($subNode);
+                    if (self::DONT_TRAVERSE_CHILDREN === $return) {
+                        $traverseChildren = false;
+                    } else if (null !== $return) {
+                        $subNode = $return;
+                    }
+                }
+
+                if ($traverseChildren) {
+                    $subNode = $this->traverseNode($subNode);
+                }
+
+                foreach ($this->visitors as $visitor) {
+                    if (null !== $return = $visitor->leaveNode($subNode)) {
+                        $subNode = $return;
+                    }
+                }
+            }
+        }
+
+        return $node;
+    }
+
+    protected function traverseArray(array $nodes) {
+        $doNodes = array();
+
+        foreach ($nodes as $i => &$node) {
+            if (is_array($node)) {
+                $node = $this->traverseArray($node);
+            } elseif ($node instanceof Node) {
+                $traverseChildren = true;
+                foreach ($this->visitors as $visitor) {
+                    $return = $visitor->enterNode($node);
+                    if (self::DONT_TRAVERSE_CHILDREN === $return) {
+                        $traverseChildren = false;
+                    } else if (null !== $return) {
+                        $node = $return;
+                    }
+                }
+
+                if ($traverseChildren) {
+                    $node = $this->traverseNode($node);
+                }
+
+                foreach ($this->visitors as $visitor) {
+                    $return = $visitor->leaveNode($node);
+
+                    if (self::REMOVE_NODE === $return) {
+                        $doNodes[] = array($i, array());
+                        break;
+                    } elseif (is_array($return)) {
+                        $doNodes[] = array($i, $return);
+                        break;
+                    } elseif (null !== $return) {
+                        $node = $return;
+                    }
+                }
+            }
+        }
+
+        if (!empty($doNodes)) {
+            while (list($i, $replace) = array_pop($doNodes)) {
+                array_splice($nodes, $i, 1, $replace);
+            }
+        }
+
+        return $nodes;
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php b/vendor/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php
new file mode 100644
index 0000000000..0752de2840
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php
@@ -0,0 +1,48 @@
+ [aliasName => originalName]] */
+    protected $aliases;
+
+    public function beforeTraverse(array $nodes) {
+        $this->resetState();
+    }
+
+    public function enterNode(Node $node) {
+        if ($node instanceof Stmt\Namespace_) {
+            $this->resetState($node->name);
+        } elseif ($node instanceof Stmt\Use_) {
+            foreach ($node->uses as $use) {
+                $this->addAlias($use, $node->type);
+            }
+        } elseif ($node instanceof Stmt\Class_) {
+            if (null !== $node->extends) {
+                $node->extends = $this->resolveClassName($node->extends);
+            }
+
+            foreach ($node->implements as &$interface) {
+                $interface = $this->resolveClassName($interface);
+            }
+
+            if (null !== $node->name) {
+                $this->addNamespacedName($node);
+            }
+        } elseif ($node instanceof Stmt\Interface_) {
+            foreach ($node->extends as &$interface) {
+                $interface = $this->resolveClassName($interface);
+            }
+
+            $this->addNamespacedName($node);
+        } elseif ($node instanceof Stmt\Trait_) {
+            $this->addNamespacedName($node);
+        } elseif ($node instanceof Stmt\Function_) {
+            $this->addNamespacedName($node);
+            $this->resolveSignature($node);
+        } elseif ($node instanceof Stmt\ClassMethod
+                  || $node instanceof Expr\Closure
+        ) {
+            $this->resolveSignature($node);
+        } elseif ($node instanceof Stmt\Const_) {
+            foreach ($node->consts as $const) {
+                $this->addNamespacedName($const);
+            }
+        } elseif ($node instanceof Expr\StaticCall
+                  || $node instanceof Expr\StaticPropertyFetch
+                  || $node instanceof Expr\ClassConstFetch
+                  || $node instanceof Expr\New_
+                  || $node instanceof Expr\Instanceof_
+        ) {
+            if ($node->class instanceof Name) {
+                $node->class = $this->resolveClassName($node->class);
+            }
+        } elseif ($node instanceof Stmt\Catch_) {
+            $node->type = $this->resolveClassName($node->type);
+        } elseif ($node instanceof Expr\FuncCall) {
+            if ($node->name instanceof Name) {
+                $node->name = $this->resolveOtherName($node->name, Stmt\Use_::TYPE_FUNCTION);
+            }
+        } elseif ($node instanceof Expr\ConstFetch) {
+            $node->name = $this->resolveOtherName($node->name, Stmt\Use_::TYPE_CONSTANT);
+        } elseif ($node instanceof Stmt\TraitUse) {
+            foreach ($node->traits as &$trait) {
+                $trait = $this->resolveClassName($trait);
+            }
+
+            foreach ($node->adaptations as $adaptation) {
+                if (null !== $adaptation->trait) {
+                    $adaptation->trait = $this->resolveClassName($adaptation->trait);
+                }
+
+                if ($adaptation instanceof Stmt\TraitUseAdaptation\Precedence) {
+                    foreach ($adaptation->insteadof as &$insteadof) {
+                        $insteadof = $this->resolveClassName($insteadof);
+                    }
+                }
+            }
+
+        }
+    }
+
+    protected function resetState(Name $namespace = null) {
+        $this->namespace = $namespace;
+        $this->aliases   = array(
+            Stmt\Use_::TYPE_NORMAL   => array(),
+            Stmt\Use_::TYPE_FUNCTION => array(),
+            Stmt\Use_::TYPE_CONSTANT => array(),
+        );
+    }
+
+    protected function addAlias(Stmt\UseUse $use, $type) {
+        // Constant names are case sensitive, everything else case insensitive
+        if ($type === Stmt\Use_::TYPE_CONSTANT) {
+            $aliasName = $use->alias;
+        } else {
+            $aliasName = strtolower($use->alias);
+        }
+
+        if (isset($this->aliases[$type][$aliasName])) {
+            $typeStringMap = array(
+                Stmt\Use_::TYPE_NORMAL   => '',
+                Stmt\Use_::TYPE_FUNCTION => 'function ',
+                Stmt\Use_::TYPE_CONSTANT => 'const ',
+            );
+
+            throw new Error(
+                sprintf(
+                    'Cannot use %s%s as %s because the name is already in use',
+                    $typeStringMap[$type], $use->name, $use->alias
+                ),
+                $use->getLine()
+            );
+        }
+
+        $this->aliases[$type][$aliasName] = $use->name;
+    }
+
+    /** @param Stmt\Function_|Stmt\ClassMethod|Expr\Closure $node */
+    private function resolveSignature($node) {
+        foreach ($node->params as $param) {
+            if ($param->type instanceof Name) {
+                $param->type = $this->resolveClassName($param->type);
+            }
+        }
+        if ($node->returnType instanceof Name) {
+            $node->returnType = $this->resolveClassName($node->returnType);
+        }
+    }
+
+    protected function resolveClassName(Name $name) {
+        // don't resolve special class names
+        if (in_array(strtolower($name->toString()), array('self', 'parent', 'static'))) {
+            if (!$name->isUnqualified()) {
+                throw new Error(
+                    sprintf("'\\%s' is an invalid class name", $name->toString()),
+                    $name->getLine()
+                );
+            }
+
+            return $name;
+        }
+
+        // fully qualified names are already resolved
+        if ($name->isFullyQualified()) {
+            return $name;
+        }
+
+        $aliasName = strtolower($name->getFirst());
+        if (!$name->isRelative() && isset($this->aliases[Stmt\Use_::TYPE_NORMAL][$aliasName])) {
+            // resolve aliases (for non-relative names)
+            $name->setFirst($this->aliases[Stmt\Use_::TYPE_NORMAL][$aliasName]);
+        } elseif (null !== $this->namespace) {
+            // if no alias exists prepend current namespace
+            $name->prepend($this->namespace);
+        }
+
+        return new Name\FullyQualified($name->parts, $name->getAttributes());
+    }
+
+    protected function resolveOtherName(Name $name, $type) {
+        // fully qualified names are already resolved
+        if ($name->isFullyQualified()) {
+            return $name;
+        }
+
+        // resolve aliases for qualified names
+        $aliasName = strtolower($name->getFirst());
+        if ($name->isQualified() && isset($this->aliases[Stmt\Use_::TYPE_NORMAL][$aliasName])) {
+            $name->setFirst($this->aliases[Stmt\Use_::TYPE_NORMAL][$aliasName]);
+        } elseif ($name->isUnqualified()) {
+            if ($type === Stmt\Use_::TYPE_CONSTANT) {
+                // constant aliases are case-sensitive, function aliases case-insensitive
+                $aliasName = $name->getFirst();
+            }
+
+            if (isset($this->aliases[$type][$aliasName])) {
+                // resolve unqualified aliases
+                $name->set($this->aliases[$type][$aliasName]);
+            } else {
+                // unqualified, unaliased names cannot be resolved at compile-time
+                return $name;
+            }
+        } elseif (null !== $this->namespace) {
+            // if no alias exists prepend current namespace
+            $name->prepend($this->namespace);
+        }
+
+        return new Name\FullyQualified($name->parts, $name->getAttributes());
+    }
+
+    protected function addNamespacedName(Node $node) {
+        if (null !== $this->namespace) {
+            $node->namespacedName = clone $this->namespace;
+            $node->namespacedName->append($node->name);
+        } else {
+            $node->namespacedName = new Name($node->name, $node->getAttributes());
+        }
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php b/vendor/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php
new file mode 100644
index 0000000000..3e1743a74e
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php
@@ -0,0 +1,14 @@
+'",
+        "T_IS_GREATER_OR_EQUAL",
+        "T_SL",
+        "T_SR",
+        "'+'",
+        "'-'",
+        "'.'",
+        "'*'",
+        "'/'",
+        "'%'",
+        "'!'",
+        "T_INSTANCEOF",
+        "'~'",
+        "T_INC",
+        "T_DEC",
+        "T_INT_CAST",
+        "T_DOUBLE_CAST",
+        "T_STRING_CAST",
+        "T_ARRAY_CAST",
+        "T_OBJECT_CAST",
+        "T_BOOL_CAST",
+        "T_UNSET_CAST",
+        "'@'",
+        "T_POW",
+        "'['",
+        "T_NEW",
+        "T_CLONE",
+        "T_EXIT",
+        "T_IF",
+        "T_ELSEIF",
+        "T_ELSE",
+        "T_ENDIF",
+        "T_LNUMBER",
+        "T_DNUMBER",
+        "T_STRING",
+        "T_STRING_VARNAME",
+        "T_VARIABLE",
+        "T_NUM_STRING",
+        "T_INLINE_HTML",
+        "T_ENCAPSED_AND_WHITESPACE",
+        "T_CONSTANT_ENCAPSED_STRING",
+        "T_ECHO",
+        "T_DO",
+        "T_WHILE",
+        "T_ENDWHILE",
+        "T_FOR",
+        "T_ENDFOR",
+        "T_FOREACH",
+        "T_ENDFOREACH",
+        "T_DECLARE",
+        "T_ENDDECLARE",
+        "T_AS",
+        "T_SWITCH",
+        "T_ENDSWITCH",
+        "T_CASE",
+        "T_DEFAULT",
+        "T_BREAK",
+        "T_CONTINUE",
+        "T_GOTO",
+        "T_FUNCTION",
+        "T_CONST",
+        "T_RETURN",
+        "T_TRY",
+        "T_CATCH",
+        "T_FINALLY",
+        "T_THROW",
+        "T_USE",
+        "T_INSTEADOF",
+        "T_GLOBAL",
+        "T_STATIC",
+        "T_ABSTRACT",
+        "T_FINAL",
+        "T_PRIVATE",
+        "T_PROTECTED",
+        "T_PUBLIC",
+        "T_VAR",
+        "T_UNSET",
+        "T_ISSET",
+        "T_EMPTY",
+        "T_HALT_COMPILER",
+        "T_CLASS",
+        "T_TRAIT",
+        "T_INTERFACE",
+        "T_EXTENDS",
+        "T_IMPLEMENTS",
+        "T_OBJECT_OPERATOR",
+        "T_DOUBLE_ARROW",
+        "T_LIST",
+        "T_ARRAY",
+        "T_CALLABLE",
+        "T_CLASS_C",
+        "T_TRAIT_C",
+        "T_METHOD_C",
+        "T_FUNC_C",
+        "T_LINE",
+        "T_FILE",
+        "T_START_HEREDOC",
+        "T_END_HEREDOC",
+        "T_DOLLAR_OPEN_CURLY_BRACES",
+        "T_CURLY_OPEN",
+        "T_PAAMAYIM_NEKUDOTAYIM",
+        "T_NAMESPACE",
+        "T_NS_C",
+        "T_DIR",
+        "T_NS_SEPARATOR",
+        "T_ELLIPSIS",
+        "';'",
+        "'{'",
+        "'}'",
+        "'('",
+        "')'",
+        "'$'",
+        "'`'",
+        "']'",
+        "'\"'"
+    );
+
+    protected $tokenToSymbol = array(
+            0,  157,  157,  157,  157,  157,  157,  157,  157,  157,
+          157,  157,  157,  157,  157,  157,  157,  157,  157,  157,
+          157,  157,  157,  157,  157,  157,  157,  157,  157,  157,
+          157,  157,  157,   52,  156,  157,  153,   51,   34,  157,
+          151,  152,   49,   46,    7,   47,   48,   50,  157,  157,
+          157,  157,  157,  157,  157,  157,  157,  157,   28,  148,
+           40,   14,   42,   27,   64,  157,  157,  157,  157,  157,
+          157,  157,  157,  157,  157,  157,  157,  157,  157,  157,
+          157,  157,  157,  157,  157,  157,  157,  157,  157,  157,
+          157,   66,  157,  155,   33,  157,  154,  157,  157,  157,
+          157,  157,  157,  157,  157,  157,  157,  157,  157,  157,
+          157,  157,  157,  157,  157,  157,  157,  157,  157,  157,
+          157,  157,  157,  149,   32,  150,   54,  157,  157,  157,
+          157,  157,  157,  157,  157,  157,  157,  157,  157,  157,
+          157,  157,  157,  157,  157,  157,  157,  157,  157,  157,
+          157,  157,  157,  157,  157,  157,  157,  157,  157,  157,
+          157,  157,  157,  157,  157,  157,  157,  157,  157,  157,
+          157,  157,  157,  157,  157,  157,  157,  157,  157,  157,
+          157,  157,  157,  157,  157,  157,  157,  157,  157,  157,
+          157,  157,  157,  157,  157,  157,  157,  157,  157,  157,
+          157,  157,  157,  157,  157,  157,  157,  157,  157,  157,
+          157,  157,  157,  157,  157,  157,  157,  157,  157,  157,
+          157,  157,  157,  157,  157,  157,  157,  157,  157,  157,
+          157,  157,  157,  157,  157,  157,  157,  157,  157,  157,
+          157,  157,  157,  157,  157,  157,  157,  157,  157,  157,
+          157,  157,  157,  157,  157,  157,    1,    2,    3,    4,
+            5,    6,    8,    9,   10,   11,   12,   13,   15,   16,
+           17,   18,   19,   20,   21,   22,   23,   24,   25,   26,
+           29,   30,   31,   35,   36,   37,   38,   39,   41,   43,
+           44,   45,   53,   55,   56,   57,   58,   59,   60,   61,
+           62,   63,   65,   67,   68,   69,   70,   71,   72,   73,
+           74,   75,   76,   77,   78,   79,   80,  157,  157,   81,
+           82,   83,   84,   85,   86,   87,   88,   89,   90,   91,
+           92,   93,   94,   95,   96,   97,   98,   99,  100,  101,
+          102,  103,  104,  105,  106,  107,  108,  109,  110,  111,
+          112,  113,  114,  115,  116,  117,  118,  119,  120,  121,
+          122,  123,  124,  125,  126,  127,  128,  129,  130,  131,
+          132,  133,  134,  135,  136,  137,  157,  157,  157,  157,
+          157,  157,  138,  139,  140,  141,  142,  143,  144,  145,
+          146,  147
+    );
+
+    protected $action = array(
+          707,   60,   61,  420,   62,   63,-32766,-32766,-32766,-32766,
+           64,   65,   66,  223,  224,  225,  226,  227,  228,  229,
+          230,  231,    0,  232,  233,  234,  235,  236,  237,  238,
+          239,  240,  241,  242,  243,-32766,-32766,-32766,-32766,-32766,
+        -32767,-32767,-32767,-32767,  650,   67,   68,   58,  244,  245,
+          129,   69,  460,   70,  297,  298,   71,   72,   73,   74,
+           75,   76,   77,   78,-32766,   32,  305,   79,  411,  421,
+        -32766,-32766,-32766,  968,  969,  463, -118, 1061,  413,  696,
+          447,  464,   46,   27,  422,  366,  465,  438,  466,-32766,
+          467,-32766,-32766,  423,  220,  221,  222,   36,   37,  468,
+          424,  441,   38,  469,  221,  222,   80,-32766,  329,  359,
+          360,  491,  751,  207,  425,  470,  471,  472,  473,  474,
+          608,-32766,  207,   55,  678,  723,  475,  476,  477,  478,
+          128,  974,  975,  976,  977,  971,  972,  315,   84,   85,
+           86,  419,  491,  978,  973,  425,  440,  702,  618,  635,
+           47,  135,  340,  327,  301,  331,  443,   40,  313,   87,
+           88,   89,   90,   91,   92,   93,   94,   95,   96,   97,
+           98,   99,  100,  101,  102,  103,  104,  105,  106,  107,
+          108,  109,   31,  308,-32766,-32766,-32766,-32766,-32766,  288,
+        -32766,  775,  776,  800,  805,  110,  650,  220,  221,  222,
+        -32766,-32766, 1027,-32766,-32766,-32766,  125,-32766,  439,-32766,
+          569,-32766,  917, -123,-32766,  286,  207,   35,-32766,-32766,
+        -32766,  428,  428,-32766,-32766,   22,  693,-32766,  211,  133,
+        -32766,  490,  752,-32766,  301, 1090,  470,  471,-32766, -119,
+          342, 1018,  694,  378,  917,  678,  723,  475,  476,  616,
+          791,   41,  111,  112,  113,  114,  115,  116,  117,  118,
+          119,  120,  121,  122,-32766,-32766,-32766,  132,-32766,-32766,
+        -32766, 1093,  781, 1095, 1094,-32766,  650,  220,  221,  222,
+        -32766,-32766,   57,-32766,-32766,-32766,  935,-32766,   54,-32766,
+        -32766,-32766,  856,  858,-32766,  358,  207,  248,-32766,-32766,
+        -32766,  428,-32766,-32766,-32766,   39,  300,-32766,  650,  388,
+        -32766,  490,-32766,-32766,  304,-32766,-32766,-32766,-32766,-32766,
+          630,-32766,  617,-32766,  917,  290,-32766,  782,  356,  357,
+        -32766,-32766,-32766,  428, 1068,-32766,-32766,  434,  207,-32766,
+          620, 1019,-32766,  490,  621,-32766,  302,  132,-32766,-32766,
+        -32766,  212,  606,  241,  242,  243,  917,  412,-32766,-32766,
+        -32766,  642, 1055,  326, -401,  126,  623,  470,  471,  244,
+          245,  124,  131,  416,  470,  471,  656,  723,  475,  476,
+        -32766,-32766,-32766,  678,  723,  475,  476,  222,  650,-32766,
+        -32766,-32766,-32766,  428,  810,-32766,-32766,-32766,  339,-32766,
+          303,-32766, -171,-32766,  207,  659,-32766, 1026,-32766,  477,
+        -32766,-32766,-32766,  428,-32766,-32766,-32766,  428,  445,-32766,
+          650,  213,-32766,  490,-32766,-32766,-32766,-32766,-32766,-32766,
+        -32766,-32766,-32766,-32766,  428,-32766,  917,  348,-32766,  428,
+         1083,-32766,-32766,-32766,-32766,  428, 1061,-32766,-32766,-32766,
+        -32766,-32766,-32766, 1027,-32766,  490, 1065,-32766,  289,  332,
+        -32766,-32766,-32766, 1083,  214,-32766,-32766,-32766,  917,-32766,
+        -32766,-32766,-32766,-32766,-32766,-32766,-32766,-32766,  249,-32767,
+        -32767,-32767,-32767,  347,-32766,  123,-32766,-32766,-32766,-32766,
+          299,  133,-32766,-32766,-32766,  220,  221,  222, 1025,  250,
+          650,  220,  221,  222,-32766,-32766,-32766,-32766,-32766,-32766,
+        -32766,-32766,  137,-32766,  207,-32766,  566,  980,-32766,  634,
+          207,  340,-32766,-32766,-32766,  428,-32766,-32766,-32766,  134,
+          575,-32766,  650,  314,-32766,  490,-32766,  716, 1024,-32766,
+        -32766,-32766,-32766,-32766,  538,-32766,  706,-32766,  244,  245,
+        -32766,  454,  581,-32766,-32766,-32766,-32766,  428,  639,-32766,
+        -32766,  449,   28,-32766,  917,  136,-32766,  490,  238,  239,
+          240,  110,-32766,-32766,-32766,  104,  105,  106,  308,-32766,
+          138,  367,  588,  589,  593,  650,  804,  638,  980,-32766,
+          615,  305,-32766,-32766,-32766,  346,-32766,   52,-32766,  650,
+        -32766, 1061,   50,-32766,-32766,-32766,-32766,-32766,-32766,-32766,
+          428,   59,-32766,-32766,  470,  471,-32766,  917,  605,-32766,
+          490,  246,-32766,  678,  723,  475,  476,-32766,  650,  107,
+          108,  109,-32766,  308,  945,-32766,-32766,-32766,-32766,-32766,
+           56,-32766,   49,-32766,   51,  110,-32766,  775,  776,  917,
+        -32766,-32766,-32766,  428,   53,-32766,-32766,-32766,-32766,-32766,
+          529,  961,-32766,  490,  657,  625,  491,  815,  645,  425,
+        -32766,  528,  516,  512,  429,-32766,  340,  511,  435,  651,
+          433,  650,  667,  650, 1088,-32766,  669,  812,-32766,-32766,
+        -32766,-32766,-32766,  600,-32766,  938,-32766,  515,  607,-32766,
+          686,-32766,  917,-32766,-32766,-32766,  428,-32766,-32766,-32766,
+          590,  345,-32766,  650, 1083,-32766,  490,-32766,  559,  437,
+        -32766,-32766,-32766,-32766,-32766,  458,-32766,-32766,-32766, -168,
+          584,-32766,  307,  285,  531,-32766,-32766,-32766,  428,  572,
+        -32766,-32766,  336,  432,-32766,  725,  428,-32766,  490,  724,
+           42,  585,  979,  688,-32766,-32766,  338,  127,  330,  718,
+        -32766,   23,  811,  341,  521,    0,  650,  434, -308,    0,
+        -32766,  335,    0,-32766,-32766,-32766, -402,-32766, -401,-32766,
+          328,-32766,  915,  477,-32766,  690,-32766,    0,-32766,-32766,
+        -32766,  428,  318,-32766,-32766,    0,-32766,-32766, -300,  613,
+        -32766,  490,  650, -309,  381,  368,-32766,  334,-32766,-32766,
+        -32766,-32766,  416,-32766, 1056,-32766,  247,-32766,  809,  745,
+        -32766,  735,  746,  698,-32766,-32766,-32766,  428,  801,-32766,
+        -32766,  683,  663,-32766,  215,  216,-32766,  490,-32766,-32766,
+          217,  662,  218,  681,-32766,-32767,-32767,-32767,-32767,  102,
+          103,  104,  105,  106,  209,  754,  661,   -1,  660,  215,
+          216,  705,  968,  969,  692,  217,-32766,  218,  808,  627,
+          970,-32766,-32766,-32766,-32766,-32766,  626,  737,  739,  209,
+        -32766,-32766,-32766,  704,  691,  695,  689,  968,  969,  687,
+        -32766,-32766,-32766,-32766,-32766,  970,  697,   44,   45,-32766,
+          643,-32766,-32766,-32766,-32766,-32766,-32766,-32767,-32767,-32767,
+        -32767,-32767,  644,  640,  637,  632,  631,  629,  556,  624,
+          974,  975,  976,  977,  971,  972,  394,  619,   83,  130,
+          641,  591,  978,  973, 1066,  793,  959, 1058, 1040,  219,
+         1046,-32766, 1060,  556, 1062,  974,  975,  976,  977,  971,
+          972,  394, 1089,  453,  722,  985,  720,  978,  973,  412,
+          721, 1092,  931, 1087,  219,  326,-32766, 1091,  744,  470,
+          471,  743,  921,  470,  471, -104, -104, -104,  656,  723,
+          475,  476,  678,  723,  475,  476,  470,  471, -103, -103,
+         -103,   43,  470,  471,   34,  678,  723,  475,  476,  415,
+          339,  678,  723,  475,  476,  470,  471,   30,  958,   33,
+        -32766,  719,  412,  410,  678,  723,  475,  476,  326,  343,
+          312,  311,  470,  471,  816,-32766,-32766,-32766,  310,  309,
+         -104,  656,  723,  475,  476, -112, -112, -112,  296, -114,
+         -114, -114,  295, -103,-32766,  287,-32766,-32766,-32766,-32766,
+        -32766,-32766,  417,  339,  210,   82,   81,   48,  337,  896,
+          658,  826,  827,  828,  825,  824,  823,  818,  560,  984,
+          783,  925,  922,  612,  551,  461,  470,  471,  457,  455,
+          470,  471,-32766,-32766,-32766,  678,  723,  475,  476,  678,
+          723,  475,  476,  897,  450,  389,   25,   24, -120,  470,
+          471,-32766, 1057,-32766,-32766,-32766,-32766,-32766,  678,  723,
+          475,  476,  470,  471, -119, 1041,  470,  471, 1045,    0,
+         1059,  678,  723,  475,  476,  678,  723,  475,  476,  944,
+          470,  471,  597,  929,  470,  471,  930,  710,  927,  678,
+          723,  475,  476,  678,  723,  475,  476,  470,  471,  928,
+          628,  926,  470,  471,  679,    0,  678,  723,  475,  476,
+            0,  678,  723,  475,  476,    0,    0,    0,  712,    0,
+            0,    0,  919,    0,    0,    0,    0,    0,    0,    0,
+            0,    0,    0,    0,    0,  920
+    );
+
+    protected $actionCheck = array(
+            1,    2,    3,    4,    5,    6,   30,   31,   32,   33,
+           11,   12,   13,   30,   31,   32,   33,   34,   35,   36,
+           37,   38,    0,   40,   41,   42,   43,   44,   45,   46,
+           47,   48,   49,   50,   51,   30,   31,   32,   33,   34,
+           35,   36,   37,   38,   76,   46,   47,   66,   65,   66,
+            7,   52,    7,   54,   55,   56,   57,   58,   59,   60,
+           61,   62,   63,   64,    8,   66,   67,   68,   69,   70,
+            8,    9,   10,   74,   75,   76,   73,   78,  122,   80,
+            7,   82,   83,   84,   85,    7,   87,   28,   89,   27,
+           91,   29,   30,   94,    8,    9,   10,   98,   99,  100,
+          101,    7,  103,  104,    9,   10,  107,  151,  127,  110,
+          111,  143,   28,   27,  146,  112,  113,  118,  119,  120,
+           76,    1,   27,   66,  121,  122,  123,  124,  129,  130,
+          149,  132,  133,  134,  135,  136,  137,  138,    8,    9,
+           10,    7,  143,  144,  145,  146,    7,  148,  149,   28,
+          151,   66,  153,  154,   34,  156,   76,   27,    7,   29,
+           30,   31,   32,   33,   34,   35,   36,   37,   38,   39,
+           40,   41,   42,   43,   44,   45,   46,   47,   48,   49,
+           50,   51,    7,   53,   30,   31,   32,   33,   34,    7,
+           70,  130,  131,  148,  150,   65,   76,    8,    9,   10,
+           80,    1,  122,   83,   84,   85,  149,   87,  149,   89,
+           86,   91,   12,  152,   94,  128,   27,    7,   98,   99,
+          100,  101,  101,  103,  104,  152,  148,  107,    7,  149,
+          110,  111,  148,    1,   34,  150,  112,  113,  118,  152,
+            7,  155,  148,   78,   12,  121,  122,  123,  124,   76,
+           78,   14,   15,   16,   17,   18,   19,   20,   21,   22,
+           23,   24,   25,   26,    8,    9,   10,  147,  148,  149,
+           70,   76,  152,   78,   79,  102,   76,    8,    9,   10,
+           80,  108,   66,   83,   84,   85,  152,   87,   66,   89,
+          117,   91,   55,   56,   94,    7,   27,   28,   98,   99,
+          100,  101,   70,  103,  104,  140,  141,  107,   76,   77,
+          110,  111,   80,    1,   34,   83,   84,   85,  118,   87,
+           28,   89,   76,   91,   12,  153,   94,  152,  101,  102,
+           98,   99,  100,  101,  152,  103,  104,  146,   27,  107,
+          149,  152,  110,  111,   28,    1,   34,  147,  148,  149,
+          118,   14,   90,   49,   50,   51,   12,  102,   30,   31,
+           32,   28,   78,  108,  127,  149,   28,  112,  113,   65,
+           66,  149,   28,  146,  112,  113,  121,  122,  123,  124,
+          148,  149,   70,  121,  122,  123,  124,   10,   76,    8,
+            9,   10,   80,  101,  148,   83,   84,   85,  143,   87,
+            7,   89,   78,   91,   27,  150,   94,   76,   27,  129,
+           98,   99,  100,  101,   70,  103,  104,  101,   76,  107,
+           76,   14,  110,  111,   80,    1,  102,   83,   84,   85,
+          118,   87,  108,   89,  101,   91,   12,  153,   94,  101,
+           81,  117,   98,   99,  100,  101,   78,  103,  104,    8,
+            9,  107,   30,  122,  110,  111,   76,    1,   34,   81,
+          148,  149,  118,   81,   14,    8,    9,   10,   12,   30,
+           31,   32,   33,   34,   35,   36,   37,   38,   14,   40,
+           41,   42,   43,   66,   27,   14,   29,   30,   31,   32,
+           34,  149,  148,  149,   70,    8,    9,   10,  139,   14,
+           76,    8,    9,   10,   80,   30,   31,   83,   84,   85,
+            1,   87,  149,   89,   27,   91,  153,  139,   94,   28,
+           27,  153,   98,   99,  100,  101,   70,  103,  104,  149,
+           81,  107,   76,   28,  110,  111,   80,   34,  156,   83,
+           84,   85,  118,   87,  127,   89,   28,   91,   65,   66,
+           94,   71,   72,    1,   98,   99,  100,  101,   28,  103,
+          104,   71,   72,  107,   12,   28,  110,  111,   46,   47,
+           48,   65,  148,  149,  118,   46,   47,   48,   53,   70,
+           96,   97,  105,  106,   73,   76,  148,  149,  139,   80,
+           88,   67,   83,   84,   85,   81,   87,   66,   89,   76,
+           91,   78,   66,   94,  148,  149,    1,   98,   99,  100,
+          101,   66,  103,  104,  112,  113,  107,   12,   76,  110,
+          111,  128,   70,  121,  122,  123,  124,  118,   76,   49,
+           50,   51,   80,   53,  111,   83,   84,   85,    1,   87,
+           66,   89,   66,   91,   66,   65,   94,  130,  131,   12,
+           98,   99,  100,  101,   66,  103,  104,  148,  149,  107,
+           76,  152,  110,  111,  148,  149,  143,  148,  149,  146,
+          118,   76,   76,   76,  151,   70,  153,   76,   76,   76,
+           76,   76,   76,   76,   76,   80,   76,   76,   83,   84,
+           85,    1,   87,   78,   89,   78,   91,   78,   78,   94,
+          148,  149,   12,   98,   99,  100,  101,   70,  103,  104,
+           78,   81,  107,   76,   81,  110,  111,   80,   93,   85,
+           83,   84,   85,  118,   87,  101,   89,    1,   91,   93,
+           95,   94,   93,   93,   93,   98,   99,  100,  101,   95,
+          103,  104,  126,  101,  107,  122,  101,  110,  111,  122,
+          128,  108,  139,  148,  149,  118,  109,  128,  127,  147,
+           70,  152,  148,  125,  146,   -1,   76,  146,  142,   -1,
+           80,  125,   -1,   83,   84,   85,  127,   87,  127,   89,
+          127,   91,  154,  129,   94,  148,  149,   -1,   98,   99,
+          100,  101,  142,  103,  104,   -1,   70,  107,  142,  142,
+          110,  111,   76,  142,  142,  142,   80,  142,  118,   83,
+           84,   85,  146,   87,  150,   89,   28,   91,  148,  148,
+           94,  148,  148,  148,   98,   99,  100,  101,  148,  103,
+          104,  148,  148,  107,   46,   47,  110,  111,  148,  149,
+           52,  148,   54,  148,  118,   40,   41,   42,   43,   44,
+           45,   46,   47,   48,   66,  148,  148,    0,  148,   46,
+           47,  148,   74,   75,  148,   52,   78,   54,  148,  148,
+           82,    8,    9,   10,  148,  149,  148,  148,  148,   66,
+            8,    9,   10,  148,  148,  148,  148,   74,   75,  148,
+           27,   78,   29,   30,   31,   82,  148,  148,  148,   27,
+          149,   29,   30,   31,   32,   33,   34,   35,   36,   37,
+           38,   39,  149,  149,  149,  149,  149,  149,  130,  149,
+          132,  133,  134,  135,  136,  137,  138,  149,  149,  149,
+          149,  155,  144,  145,  150,  150,  150,  150,  155,  151,
+          150,  153,  150,  130,  150,  132,  133,  134,  135,  136,
+          137,  138,  150,  150,  150,  155,  150,  144,  145,  102,
+          150,  150,  150,  155,  151,  108,  153,  150,  150,  112,
+          113,  150,  152,  112,  113,   95,   96,   97,  121,  122,
+          123,  124,  121,  122,  123,  124,  112,  113,   95,   96,
+           97,  151,  112,  113,  151,  121,  122,  123,  124,  151,
+          143,  121,  122,  123,  124,  112,  113,  151,  155,  151,
+          151,  150,  102,  151,  121,  122,  123,  124,  108,  151,
+          151,  151,  112,  113,  150,    8,    9,   10,  151,  151,
+          150,  121,  122,  123,  124,   71,   72,   73,  151,   71,
+           72,   73,  151,  150,   27,  151,   29,   30,   31,   32,
+           33,   34,  102,  143,  151,  151,  151,  151,  108,  152,
+          150,  111,  112,  113,  114,  115,  116,  117,  152,  152,
+          152,  152,  152,  152,  152,  152,  112,  113,  152,  152,
+          112,  113,    8,    9,   10,  121,  122,  123,  124,  121,
+          122,  123,  124,  152,  152,  152,  152,  152,  152,  112,
+          113,   27,  155,   29,   30,   31,   32,   33,  121,  122,
+          123,  124,  112,  113,  152,  155,  112,  113,  155,   -1,
+          155,  121,  122,  123,  124,  121,  122,  123,  124,  155,
+          112,  113,   92,  155,  112,  113,  155,  150,  155,  121,
+          122,  123,  124,  121,  122,  123,  124,  112,  113,  155,
+          150,  155,  112,  113,  150,   -1,  121,  122,  123,  124,
+           -1,  121,  122,  123,  124,   -1,   -1,   -1,  150,   -1,
+           -1,   -1,  150,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+           -1,   -1,   -1,   -1,   -1,  150
+    );
+
+    protected $actionBase = array(
+            0,  880,  893,  964,  857,  255,  910,  968, 1004, 1000,
+          124, 1040,    3,  262, 1018,  861, 1022,  502, 1035,  987,
+          874,  338,  292,  121,  333,  121,  316,  645,  645,  645,
+          120,  200,  456,  456,  509,  456,  552,  605,  637,  232,
+          344,  424,  312,  690,  690,  690,  690,  726,  726,  690,
+          690,  690,  690,  690,  690,  690,  690,  690,  690,  690,
+          690,  690,  690,  690,  690,  690,  690,  690,  690,  690,
+          690,  690,  690,  690,  690,  690,  690,  690,  690,  690,
+          690,  690,  690,  690,  690,  690,  690,  690,  690,  690,
+          690,  690,  690,  690,  690,  690,  690,  690,  690,  690,
+          690,  690,  690,  690,  690,  690,  690,  690,  690,  690,
+          690,  690,  690,  690,  690,  690,  690,  690,  690,  690,
+          690,  690,  690,  690,  690,  690,  690,  690,  690,  690,
+          690,  690,  690,  690,  690,  690,  690,  690,  690,   84,
+          748,  629,  622,  741,  738,  736,  735,  820,  640,  941,
+          802,  794,  537,  792,  790,  787,  786,  785,  803,  784,
+          776,  664,  130,  130,  130,  130,  130,  130,  130,  130,
+          130,  130,  130,   56,  493,  189,  269,   86,  441,  487,
+          487,  487,  487,  487,  487,  256,  256,  256,  256,  256,
+          256,  256,  256,  256,  256,  256,  256,  256,  256,  256,
+          256,  256,   95,  381,  381,  381,  377,  788,  311,  813,
+          813,  813,  813,  813,  813,  813,  813,  813,  813,  813,
+          813,  813,  813,  813,  813,  813,  813,  813,  813,  813,
+          813,  813,  813,  813,  813,  813,  813,  813,  813,  813,
+          813,  813,  813,  813,  813,  813,  813,  813,  813,  813,
+          813,   62,  -17,  -17,  863,  422,  457,  475, 1074,  328,
+         1017,  872,  872,  872,  872,  872,  -24,  154,    5,    5,
+            5,    5,  237,  805,  805,  805,  805,  439,  439,  439,
+          439,  804,  810,  806,  812,  280,  280,  654,  654,  524,
+          780,  529,  529,  522,  522,  523,  523,  523,  523,  523,
+          523,  523,  523,  523,  523,  -44,  324,  173,  859,   61,
+           61,   61,   61,  517,  517,  378,  359,  382,   80,  580,
+          580,  580,  304,  304,  304,   44,  227,  630,  380,  380,
+          380,  514,  613,  633,  342,  -32,  -32,  -32,  -32,  191,
+          779,  -32,  -32,  -32,   57,  165,  165,  195,  363,  644,
+          821,  635,  818,  438,  661,  -19,  666,  666,  666,  172,
+          642,  490,  480,  477,  656,   59,  172,   84,  331,  519,
+          216,  525,  737,  584,  684,  710,   78,   94,  417,  516,
+          222,  284,   73,  708,  693,  916,  907,  182,   85,  649,
+          525,  525,  525,  175,  449,  222,   87,  483,  483,  483,
+          483,  483,  483,  483,  483,  680,   45,  134,  720,  246,
+          503,  843,  597,  856,  856,  595,  607,  597,  632,  503,
+          906,  906,  906,  906,  503,  607,  856,  856,  503,  524,
+          856,  210,  503,  646,  607,  638,  638,  906,  728,  721,
+          597,  619,  616,  856,  856,  856,  616,  595,  503,  906,
+          643,  612,  221,  856,  906,  505,  505,  643,  503,  505,
+          632,  505,   22,  518,  576,  840,  905,  848,  601,  778,
+          627,  623,  891,  887,  904,  596,  604,  894,  858,  618,
+          716,  602,  471,  536,  578,  531,  588,  650,  574,  653,
+          642,  621,  506,  506,  506,  651,  665,  651,  506,  506,
+          506,  506,  506,  506,  506,  506,  996,  662,  626,  631,
+          634,  713,  337,  618,  641,  407,  770,  618,  920,  943,
+          628,  603,  878,  922,  651,  994,  749,   43,  450,  877,
+          625,  606,  651,  870,  651,  768,  651,  919,  608,  811,
+          618,  506,  918,  983,  981,  978,  974,  965,  963,  960,
+          947,  545,  853,  683,  942,  151,  903,  656,  663,  610,
+          675,  233,  808,  651,  651,  767,  779,  651,  766,  707,
+          750,  609,  671,  927,  800,  613,  926,  651,  624,  783,
+          233,  491,  511,  946,  674,  862,  615,  917,  868,  765,
+          464,  817,  530,  695,  945,  944,  962,  730,  764,  781,
+          485,  542,  617,  620,  751,  869,  729,  921,  636,  657,
+          647,  639,  763,  611,  923,  673,  614,  670,    0,    0,
+            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+            0,    0,    0,    0,    0,    0,    0,   -1,   -1,   -1,
+           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+           -1,   -1,   -1,   -1,   -1,  130,  130,  130,  130,  130,
+          130,  130,  130,  130,  130,  130,  130,  130,  130,  130,
+          130,  130,  130,  130,  130,  130,  130,  130,    0,    0,
+            0,    0,    0,    0,    0,    0,    0,    0,    0,  130,
+          -17,  -17,  -17,  -17,  130,  -17,  -17,  -17,  -17,  -17,
+          -17,  130,  130,  130,  130,  130,  130,  130,  130,  130,
+          130,  130,  130,  130,  130,  130,  130,  130,  -17,  130,
+          130,  130,  -17,  523,  -17,  523,  523,  523,  523,  523,
+          523,  523,  523,  523,  523,  523,  523,  523,  523,  523,
+          523,  523,  523,  523,  523,  523,  523,  523,  523,  523,
+          523,  523,  523,  523,  523,  523,  523,  523,  523,  523,
+          523,  523,  523,  523,  523,  523,  523,  130,    0,    0,
+          130,  -17,  130,  -17,  130,  -17,  130,  130,  130,  130,
+          130,  130,  -17,  -17,  -17,  -17,  -17,  -17,    0,  580,
+          580,  580,  580,  -17,  -17,  -17,  -17,  950,  950,  950,
+          950,  523,  523,  523,  523,  523,  523,  580,  580,  304,
+          304,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+            0,  523,  950,  950,  523,  -32,  -32,  -32,  -32,  -32,
+          -32,  165,  165,  165,  284,    0,    0,    0,    0,    0,
+            0,  -32,  607,  165,  368,  368,  368,  165,  165,  165,
+          284,    0,    0,    0,    0,  607,  368,    0,    0,    0,
+          856,    0,    0,    0,  368,  484,  484,  484,  484,  233,
+          222,    0,  607,  607,  607,    0,  619,    0,    0,    0,
+          856,    0,    0,    0,    0,    0,    0,  506,   43,  878,
+          139,  288,    0,    0,    0,    0,    0,    0,    0,  288,
+          288,  393,  393,    0,    0,  545,  506,  506,  506,    0,
+            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+            0,  139,    0,    0,  233
+    );
+
+    protected $actionDefault = array(
+            3,32767,32767,32767,32767,32767,32767,32767,32767,32767,
+        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
+        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
+        32767,32767,  428,  428,32767,  385,32767,32767,32767,32767,
+        32767,32767,32767,  189,  189,  189,32767,32767,32767,  417,
+          417,  417,  417,  417,  417,  417,  417,  417,  417,  417,
+        32767,32767,32767,32767,32767,  271,32767,32767,32767,32767,
+        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
+        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
+        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
+        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
+        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
+        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
+        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
+        32767,  277,  433,32767,32767,32767,32767,32767,32767,32767,
+        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
+        32767,32767,  252,  253,  255,  256,  188,  418,  140,  278,
+          432,  187,  142,  216,  389,32767,32767,32767,  218,   26,
+          151,   96,  388,  186,  127,  270,  272,  217,  193,  198,
+          199,  200,  201,  202,  203,  204,  205,  206,  207,  208,
+          209,  192,  343,  249,  248,  247,  345,32767,  344,  382,
+          382,  385,32767,32767,32767,32767,32767,32767,32767,32767,
+        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
+        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
+        32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
+        32767,  214,  371,  370,  215,  341,  219,  342,  221,  346,
+          220,  237,  238,  235,  236,  239,  348,  347,  364,  365,
+          362,  363,  191,  240,  241,  242,  243,  366,  367,  368,
+          369,  173,  173,  173,  173,32767,32767,  427,  427,32767,
+        32767,  228,  229,  355,  356,32767,32767,32767,32767,32767,
+        32767,32767,32767,32767,32767,32767,  174,32767,32767,  131,
+          131,  131,  131,  131,32767,32767,32767,32767,32767,  223,
+          224,  222,  350,  351,  349,32767,32767,  317,32767,32767,
+        32767,32767,32767,  319,32767,32767,32767,32767,32767,32767,
+        32767,32767,32767,32767,  390,  318,32767,32767,32767,32767,
+        32767,32767,32767,32767,  403,  306,32767,32767,32767,32767,
+          299,  115,  117,   65,  374,32767,32767,32767,32767,32767,
+          408,  233,32767,32767,32767,32767,32767,32767,  440,32767,
+          403,32767,32767,32767,32767,32767,32767,32767,32767,  246,
+          225,  226,  227,32767,32767,  407,  401,  358,  359,  360,
+          361,  352,  353,  354,  357,32767,32767,32767,32767,32767,
+           69,  314,32767,  320,  320,32767,32767,32767,32767,   69,
+        32767,32767,32767,32767,   69,32767,  406,  405,   69,32767,
+          300,  384,   69,   82,32767,   80,   80,32767,  101,  101,
+        32767,32767,   84,  380,  396,32767,   84,32767,   69,32767,
+          288,   71,  384,32767,32767,  133,  133,  288,   69,  133,
+        32767,  133,32767,    4,  324,32767,32767,32767,32767,32767,
+        32767,32767,32767,32767,32767,32767,32767,32767,32767,  301,
+        32767,32767,32767,  267,  268,  377,  392,32767,  393,32767,
+          299,32767,  231,  232,  234,  211,32767,  213,  257,  258,
+          259,  260,  261,  262,  263,  265,32767,32767,  304,  307,
+        32767,32767,32767,    6,   20,  150,32767,  302,32767,  196,
+        32767,32767,32767,32767,  435,32767,32767,  190,32767,32767,
+           22,32767,  146,32767,   67,32767,  425,32767,32767,  401,
+          303,  230,32767,32767,32767,32767,32767,32767,32767,32767,
+        32767,  402,32767,32767,32767,  122,32767,  337,32767,32767,
+        32767,   83,32767,  194,  141,32767,32767,  434,32767,32767,
+        32767,32767,32767,32767,32767,32767,32767,   68,32767,32767,
+           85,32767,32767,  401,32767,32767,32767,32767,32767,32767,
+          185,32767,32767,32767,32767,32767,  401,32767,32767,32767,
+          126,32767,32767,32767,32767,32767,32767,32767,    4,32767,
+          167,32767,32767,32767,32767,32767,32767,32767,   28,   28,
+            3,   28,  109,   28,  153,    3,  101,  101,   62,  153,
+           28,  153,  153,   28,   28,   28,   28,   28,  160,   28,
+           28,   28,   28,   28,   28,   28
+    );
+
+    protected $goto = array(
+          168,  168,  142,  142,  147,  142,  143,  144,  145,  150,
+          152,  188,  170,  166,  166,  166,  166,  147,  147,  167,
+          167,  167,  167,  167,  167,  167,  167,  167,  167,  167,
+          162,  163,  164,  165,  185,  141,  186,  492,  493,  371,
+          494,  498,  499,  500,  501,  502,  503,  504,  505,  843,
+          146,  148,  149,  151,  173,  178,  187,  203,  251,  254,
+          256,  258,  260,  261,  262,  263,  264,  265,  273,  274,
+          275,  276,  291,  292,  319,  320,  321,  390,  391,  392,
+          541,  189,  190,  191,  192,  193,  194,  195,  196,  197,
+          198,  199,  200,  201,  153,  154,  155,  169,  156,  171,
+          157,  204,  172,  158,  159,  160,  205,  161,  139,  557,
+          700,  557,  557,  557,  557,  557,  557,  557,  557,  557,
+          557,  557,  557,  557,  557,  557,  557,  557,  557,  557,
+          557,  557,  557,  557,  557,  557,  557,  557,  557,  557,
+          557,  557,  557,  557,  557,  557,  557,  557,  557,  557,
+          557,  557,  557,  496,  496,  496,  496,  496,  496,  379,
+          653,  653,  653,  496,  496,  496,  496,  496,  496,  496,
+          496,  496,  496,  507,  570,  594,  507,  753,  738,  736,
+          734,  736,  622,  510,  762,  757,  785,  430,  430,  430,
+          430,  430,  430,  767,  767, 1072, 1072,  430,  430,  430,
+          430,  430,  430,  430,  430,  430,  430,  946,  519,  350,
+          946,  774,  774,  774,  774,  774,  774,  543,  544,  545,
+          546,  547,  548,  549,  550,  552,  579,  609,  599,  822,
+          409,  604,  282,  369,  283,  284,  530,  732,  732,  732,
+          732,  537,    5,  727,  733,  603,  558,    6,  558,  558,
+          558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+          558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+          558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+          558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+          981, 1076,  981,  981,  981,  981,  981,  981,  981,  981,
+          981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+          981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+          981,  981,  981,  981,  981,  981,  981,  981,  981,  981,
+          981,  981,  981,  981,  654,  654,  654,  655,  655,  655,
+          573,  576,  614,  176,  508,  957,  956,  508,  179,  180,
+          181,  397,  398,  399,  400,  175,  202,  206,  208,  255,
+          257,  259,  266,  267,  268,  269,  270,  271,  277,  278,
+          279,  280,  293,  294,  322,  323,  324,  401,  402,  403,
+          404,  177,  182,  252,  253,  183,  184,    9,  333,    3,
+          372,   10,  317,  580,  353,  408,  351,  352,   11,  587,
+         1044,    1,   12,   13,    2,   14, 1032,    7,   15,   16,
+           17,   18,   19,   20,  396,  596,  536,  536,  563,  532,
+          939,  513,  383,  384,  534,  534,  495,  497,  524,  539,
+          564,  567,  577,  583,  513,  962, 1069,  595,  386, 1051,
+         1082, 1082, 1051,  890,  900,   26,   21,  365,  664,  633,
+          841,  513,  513,  513,  771,  509, 1085, 1082,  509,  780,
+          789,  553, 1067, 1067, 1067,  380,  380,  380,  373, 1085,
+         1085,  542,  522,   29, 1050,  518,  533,  380,  592,  982,
+          405, 1052,  942,  943, 1052,  395,  939,  932,  518,  518,
+          937,  446,  451,  670,  568,  794,  741, 1029,  459,  940,
+         1043,  940,  601,  830,    0,    0,    0,    0,    0,  941,
+            0,  513,    0,    0,    0,    0,    0,    0,    0,    0,
+          517,    0,    0,    0,    0,    0,    0,    0,    0,  540,
+            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+          523
+    );
+
+    protected $gotoCheck = array(
+           25,   25,   25,   25,   25,   25,   25,   25,   25,   25,
+           25,   25,   25,   25,   25,   25,   25,   25,   25,   25,
+           25,   25,   25,   25,   25,   25,   25,   25,   25,   25,
+           25,   25,   25,   25,   25,   25,   25,   25,   25,   25,
+           25,   25,   25,   25,   25,   25,   25,   25,   25,   25,
+           25,   25,   25,   25,   25,   25,   25,   25,   25,   25,
+           25,   25,   25,   25,   25,   25,   25,   25,   25,   25,
+           25,   25,   25,   25,   25,   25,   25,   25,   25,   25,
+           25,   25,   25,   25,   25,   25,   25,   25,   25,   25,
+           25,   25,   25,   25,   25,   25,   25,   25,   25,   25,
+           25,   25,   25,   25,   25,   25,   25,   25,   25,   39,
+           32,   39,   39,   39,   39,   39,   39,   39,   39,   39,
+           39,   39,   39,   39,   39,   39,   39,   39,   39,   39,
+           39,   39,   39,   39,   39,   39,   39,   39,   39,   39,
+           39,   39,   39,   39,   39,   39,   39,   39,   39,   39,
+           39,   39,   39,   95,   95,   95,   95,   95,   95,    5,
+            6,    6,    6,   95,   95,   95,   95,   95,   95,   95,
+           95,   95,   95,   95,   22,   22,   95,    6,    6,    6,
+            6,    6,    6,    6,    6,    6,   63,   39,   39,   39,
+           39,   39,   39,   56,   56,   56,   56,   39,   39,   39,
+           39,   39,   39,   39,   39,   39,   39,   39,   79,   51,
+           39,   39,   39,   39,   39,   39,   39,   88,   88,   88,
+           88,   88,   88,   88,   88,   88,   88,   39,   43,   76,
+           76,   43,   47,   43,   47,   47,    5,   39,   39,   39,
+           39,   87,    2,   39,   39,   39,   98,    2,   98,   98,
+           98,   98,   98,   98,   98,   98,   98,   98,   98,   98,
+           98,   98,   98,   98,   98,   98,   98,   98,   98,   98,
+           98,   98,   98,   98,   98,   98,   98,   98,   98,   98,
+           98,   98,   98,   98,   98,   98,   98,   98,   98,   98,
+          105,  119,  105,  105,  105,  105,  105,  105,  105,  105,
+          105,  105,  105,  105,  105,  105,  105,  105,  105,  105,
+          105,  105,  105,  105,  105,  105,  105,  105,  105,  105,
+          105,  105,  105,  105,  105,  105,  105,  105,  105,  105,
+          105,  105,  105,  105,    7,    7,    7,    8,    8,    8,
+           42,   42,   42,   13,   98,  103,  103,   98,   13,   13,
+           13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
+           13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
+           13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
+           13,   13,   13,   13,   13,   13,   13,   14,  104,   14,
+           29,   14,  104,   49,   49,   49,   51,   51,   14,  107,
+           61,   14,   14,   14,   14,   14,  111,   14,   14,   14,
+           14,   14,   14,   14,   33,   33,   33,   33,   33,   33,
+           61,    4,    9,    9,   33,   33,   33,   33,   33,   33,
+           33,   33,   33,   33,    4,   16,  117,   31,   30,   97,
+          120,  120,   97,   80,   16,   16,   16,   16,   11,   53,
+           79,    4,    4,    4,   58,  101,  120,  120,  101,   60,
+           64,   16,   97,   97,   97,  102,  102,  102,   40,  120,
+          120,   26,   40,   16,   97,   26,   40,  102,   16,  106,
+           10,   96,   61,   61,   96,  102,   61,   91,   26,   26,
+           93,   45,   40,   12,   46,   65,   50,  110,   86,   61,
+           61,   61,   40,   78,   -1,   -1,   -1,   -1,   -1,   61,
+           -1,    4,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+            4,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,    4,
+           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+           79
+    );
+
+    protected $gotoBase = array(
+            0,    0, -378,    0,   95, -180,  156,  330,  333,   66,
+           63,   90,   53,  136, -232,    0,   24,    0,    0,    0,
+            0,    0,  130,    0,    0,  -30,  441,    0,    0,  344,
+          142,  151,   85,  129,    0,    0,    0,    0,    0,  -98,
+           44,    0,   30, -228,    0,   55,   48, -397,    0,   57,
+           49, -230,    0,   82,    0,    0,  -92,    0,  141,    0,
+          145,   56,    0,  155,   94,   54,    0,    0,    0,    0,
+            0,    0,    0,    0,    0,    0,  -77,    0,   43,  161,
+          135,    0,    0,    0,    0,    0,   41,  208,  167,    0,
+            0,   73,    0,   71,    0, -132,  176,  134,   39,    0,
+            0,  150,  137,   16,   61,   83,  111,  189,    0,    0,
+           45,  195,    0,    0,    0,    0,    0,  148,    0,  256,
+          124,    0
+    );
+
+    protected $gotoDefault = array(
+        -32768,  462,    4,  648,  479,  514,  675,  676,  677,  375,
+          374,  665,  671,  174,    8,  673,  891,  361,  680,  362,
+          582,  682,  526,  684,  685,  140,  480,  376,  377,  527,
+          385,  571,  699,  272,  382,  701,  363,  703,  709,  364,
+          602,  586,  554,  598,  481,  442,  565,  281,  535,  561,
+          740,  349,  748,  636,  756,  759,  482,  555,  770,  448,
+          778,  967,  393,  784,  790,  795,  798,  418,  406,  578,
+          802,  803,  325,  807,  610,  611,  821,  306,  829,  842,
+          414,  910,  912,  483,  484,  520,  456,  506,  525,  485,
+          933,  436,  407,  936,  486,  487,  426,  427,  954,  951,
+          355, 1037,  354,  444,  316, 1022, 1021,  574,  986,  452,
+         1075, 1033,  344,  488,  489,  370,  387, 1070,  431, 1077,
+         1084,  562
+    );
+
+    protected $ruleToNonTerminal = array(
+            0,    1,    2,    2,    4,    4,    5,    3,    3,    3,
+            3,    3,    3,    3,    3,    3,    3,    3,    9,    9,
+           11,   11,   11,   11,   10,   10,   12,   14,   14,   15,
+           15,   15,   15,    6,    6,    6,    6,    6,    6,    6,
+            6,    6,    6,    6,    6,    6,    6,    6,    6,    6,
+            6,    6,    6,    6,    6,    6,    6,    6,    6,    6,
+            6,    6,   36,   36,   38,   37,   37,   30,   30,   40,
+           40,   41,   41,    7,    8,    8,    8,   44,   44,   44,
+           45,   45,   48,   48,   46,   46,   49,   49,   23,   23,
+           32,   32,   35,   35,   34,   34,   50,   24,   24,   24,
+           24,   51,   51,   52,   52,   53,   53,   21,   21,   17,
+           17,   54,   19,   19,   55,   18,   18,   20,   20,   31,
+           31,   31,   42,   42,   57,   57,   58,   58,   60,   60,
+           60,   59,   59,   43,   43,   61,   61,   61,   62,   62,
+           63,   63,   63,   27,   27,   64,   64,   64,   28,   28,
+           65,   65,   47,   47,   66,   66,   66,   66,   71,   71,
+           72,   72,   73,   73,   73,   73,   74,   75,   75,   70,
+           70,   67,   67,   69,   69,   77,   77,   76,   76,   76,
+           76,   76,   76,   68,   68,   78,   78,   29,   29,   22,
+           22,   25,   25,   25,   25,   25,   25,   25,   25,   25,
+           25,   25,   25,   25,   25,   25,   25,   25,   25,   25,
+           25,   25,   25,   25,   25,   25,   25,   25,   25,   25,
+           25,   25,   25,   25,   25,   25,   25,   25,   25,   25,
+           25,   25,   25,   25,   25,   25,   25,   25,   25,   25,
+           25,   25,   25,   25,   25,   25,   25,   25,   25,   25,
+           25,   25,   25,   25,   25,   25,   25,   25,   25,   25,
+           25,   25,   25,   25,   25,   25,   25,   25,   25,   25,
+           25,   25,   25,   25,   25,   16,   16,   26,   26,   83,
+           83,   84,   84,   84,   84,   90,   79,   79,   86,   86,
+           92,   92,   93,   94,   94,   94,   94,   94,   94,   98,
+           98,   39,   39,   39,   80,   80,   99,   99,   95,   95,
+          100,  100,  100,  100,   81,   81,   81,   85,   85,   85,
+           91,   91,  105,  105,  105,  105,  105,  105,  105,  105,
+          105,  105,  105,  105,  105,   13,   13,   13,   13,   13,
+           13,  108,  108,  108,  108,  108,  108,  108,  108,  108,
+          108,  108,  108,  108,  108,  108,  108,  108,  108,  108,
+          108,  108,  108,  108,  108,  108,  108,  108,  108,  108,
+          108,  108,  108,  108,   89,   89,   82,   82,   82,   82,
+          106,  106,  107,  107,  110,  110,  109,  109,  111,  111,
+           33,   33,   33,   33,  113,  113,  112,  112,  112,  112,
+          112,  114,  114,   97,   97,  101,  101,   96,   96,  115,
+          115,  115,  115,  102,  102,  102,  102,   88,   88,  103,
+          103,  103,   56,  116,  116,  117,  117,  117,   87,   87,
+          118,  118,  119,  119,  119,  119,  104,  104,  104,  104,
+          120,  120,  120,  120,  120,  120,  120,  121,  121,  121
+    );
+
+    protected $ruleToLength = array(
+            1,    1,    2,    0,    1,    3,    1,    1,    1,    1,
+            1,    3,    5,    4,    3,    4,    4,    3,    3,    1,
+            1,    3,    2,    4,    3,    1,    3,    2,    0,    1,
+            1,    1,    1,    3,    5,    8,    3,    5,    9,    3,
+            2,    3,    2,    3,    2,    3,    2,    3,    3,    3,
+            1,    2,    5,    7,    9,    5,    1,    6,    3,    3,
+            2,    1,    0,    2,    8,    0,    4,    1,    3,    0,
+            1,    0,    1,   10,    7,    6,    5,    1,    2,    2,
+            0,    2,    0,    2,    0,    2,    1,    3,    1,    4,
+            1,    4,    1,    4,    1,    3,    3,    3,    4,    4,
+            5,    0,    2,    4,    3,    1,    1,    1,    4,    0,
+            2,    3,    0,    2,    4,    0,    2,    0,    3,    1,
+            2,    1,    1,    0,    1,    3,    4,    6,    1,    1,
+            1,    0,    1,    0,    2,    2,    3,    3,    1,    3,
+            1,    2,    2,    3,    1,    1,    2,    4,    3,    1,
+            1,    3,    2,    0,    3,    3,    9,    3,    1,    3,
+            0,    2,    4,    5,    4,    4,    3,    1,    1,    1,
+            3,    1,    1,    0,    1,    1,    2,    1,    1,    1,
+            1,    1,    1,    1,    3,    1,    3,    3,    1,    0,
+            1,    1,    3,    3,    4,    4,    1,    2,    3,    3,
+            3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+            2,    2,    2,    2,    3,    3,    3,    3,    3,    3,
+            3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+            3,    2,    2,    2,    2,    3,    3,    3,    3,    3,
+            3,    3,    3,    3,    3,    1,    3,    5,    4,    3,
+            4,    4,    2,    2,    2,    2,    2,    2,    2,    2,
+            2,    2,    2,    2,    2,    2,    1,    1,    1,    3,
+            2,    1,    2,   10,   11,    3,    3,    2,    4,    4,
+            3,    4,    4,    4,    4,    7,    3,    2,    0,    4,
+            1,    3,    2,    2,    4,    6,    2,    2,    4,    1,
+            1,    1,    2,    3,    1,    1,    1,    1,    1,    1,
+            3,    3,    4,    4,    0,    2,    1,    0,    1,    1,
+            0,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+            1,    1,    1,    3,    2,    1,    3,    1,    4,    3,
+            1,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+            3,    3,    3,    3,    3,    3,    3,    3,    2,    2,
+            2,    2,    3,    3,    3,    3,    3,    3,    3,    3,
+            5,    4,    4,    3,    1,    3,    1,    1,    3,    3,
+            1,    1,    0,    2,    0,    1,    3,    1,    3,    1,
+            1,    1,    1,    1,    6,    4,    3,    4,    2,    4,
+            4,    1,    3,    1,    2,    1,    1,    4,    1,    3,
+            6,    4,    4,    4,    4,    1,    4,    0,    1,    1,
+            3,    1,    4,    3,    1,    1,    1,    0,    0,    2,
+            3,    1,    3,    1,    4,    2,    2,    2,    1,    2,
+            1,    4,    3,    3,    3,    6,    3,    1,    1,    1
+    );
+
+    protected function reduceRule0() {
+        $this->semValue = $this->semStack[$this->stackPos];
+    }
+
+    protected function reduceRule1() {
+         $this->semValue = $this->handleNamespaces($this->semStack[$this->stackPos-(1-1)]);
+    }
+
+    protected function reduceRule2() {
+         if (is_array($this->semStack[$this->stackPos-(2-2)])) { $this->semValue = array_merge($this->semStack[$this->stackPos-(2-1)], $this->semStack[$this->stackPos-(2-2)]); } else { $this->semStack[$this->stackPos-(2-1)][] = $this->semStack[$this->stackPos-(2-2)]; $this->semValue = $this->semStack[$this->stackPos-(2-1)]; };
+    }
+
+    protected function reduceRule3() {
+         $this->semValue = array();
+    }
+
+    protected function reduceRule4() {
+         $this->semValue = array($this->semStack[$this->stackPos-(1-1)]);
+    }
+
+    protected function reduceRule5() {
+         $this->semStack[$this->stackPos-(3-1)][] = $this->semStack[$this->stackPos-(3-3)]; $this->semValue = $this->semStack[$this->stackPos-(3-1)];
+    }
+
+    protected function reduceRule6() {
+         $this->semValue = new Name($this->semStack[$this->stackPos-(1-1)], $this->startAttributeStack[$this->stackPos-(1-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule7() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule8() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule9() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule10() {
+         $this->semValue = new Stmt\HaltCompiler($this->lexer->handleHaltCompiler(), $this->startAttributeStack[$this->stackPos-(1-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule11() {
+         $this->semValue = new Stmt\Namespace_($this->semStack[$this->stackPos-(3-2)], null, $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule12() {
+         $this->semValue = new Stmt\Namespace_($this->semStack[$this->stackPos-(5-2)], $this->semStack[$this->stackPos-(5-4)], $this->startAttributeStack[$this->stackPos-(5-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule13() {
+         $this->semValue = new Stmt\Namespace_(null, $this->semStack[$this->stackPos-(4-3)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule14() {
+         $this->semValue = new Stmt\Use_($this->semStack[$this->stackPos-(3-2)], Stmt\Use_::TYPE_NORMAL, $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule15() {
+         $this->semValue = new Stmt\Use_($this->semStack[$this->stackPos-(4-3)], Stmt\Use_::TYPE_FUNCTION, $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule16() {
+         $this->semValue = new Stmt\Use_($this->semStack[$this->stackPos-(4-3)], Stmt\Use_::TYPE_CONSTANT, $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule17() {
+         $this->semValue = new Stmt\Const_($this->semStack[$this->stackPos-(3-2)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule18() {
+         $this->semStack[$this->stackPos-(3-1)][] = $this->semStack[$this->stackPos-(3-3)]; $this->semValue = $this->semStack[$this->stackPos-(3-1)];
+    }
+
+    protected function reduceRule19() {
+         $this->semValue = array($this->semStack[$this->stackPos-(1-1)]);
+    }
+
+    protected function reduceRule20() {
+         $this->semValue = new Stmt\UseUse($this->semStack[$this->stackPos-(1-1)], null, $this->startAttributeStack[$this->stackPos-(1-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule21() {
+         $this->semValue = new Stmt\UseUse($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule22() {
+         $this->semValue = new Stmt\UseUse($this->semStack[$this->stackPos-(2-2)], null, $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule23() {
+         $this->semValue = new Stmt\UseUse($this->semStack[$this->stackPos-(4-2)], $this->semStack[$this->stackPos-(4-4)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule24() {
+         $this->semStack[$this->stackPos-(3-1)][] = $this->semStack[$this->stackPos-(3-3)]; $this->semValue = $this->semStack[$this->stackPos-(3-1)];
+    }
+
+    protected function reduceRule25() {
+         $this->semValue = array($this->semStack[$this->stackPos-(1-1)]);
+    }
+
+    protected function reduceRule26() {
+         $this->semValue = new Node\Const_($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule27() {
+         if (is_array($this->semStack[$this->stackPos-(2-2)])) { $this->semValue = array_merge($this->semStack[$this->stackPos-(2-1)], $this->semStack[$this->stackPos-(2-2)]); } else { $this->semStack[$this->stackPos-(2-1)][] = $this->semStack[$this->stackPos-(2-2)]; $this->semValue = $this->semStack[$this->stackPos-(2-1)]; };
+    }
+
+    protected function reduceRule28() {
+         $this->semValue = array();
+    }
+
+    protected function reduceRule29() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule30() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule31() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule32() {
+         throw new Error('__HALT_COMPILER() can only be used from the outermost scope', $this->startAttributeStack[$this->stackPos-(1-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule33() {
+         $this->semValue = $this->semStack[$this->stackPos-(3-2)];
+    }
+
+    protected function reduceRule34() {
+         $this->semValue = new Stmt\If_($this->semStack[$this->stackPos-(5-2)], array('stmts' => is_array($this->semStack[$this->stackPos-(5-3)]) ? $this->semStack[$this->stackPos-(5-3)] : array($this->semStack[$this->stackPos-(5-3)]), 'elseifs' => $this->semStack[$this->stackPos-(5-4)], 'else' => $this->semStack[$this->stackPos-(5-5)]), $this->startAttributeStack[$this->stackPos-(5-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule35() {
+         $this->semValue = new Stmt\If_($this->semStack[$this->stackPos-(8-2)], array('stmts' => $this->semStack[$this->stackPos-(8-4)], 'elseifs' => $this->semStack[$this->stackPos-(8-5)], 'else' => $this->semStack[$this->stackPos-(8-6)]), $this->startAttributeStack[$this->stackPos-(8-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule36() {
+         $this->semValue = new Stmt\While_($this->semStack[$this->stackPos-(3-2)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule37() {
+         $this->semValue = new Stmt\Do_($this->semStack[$this->stackPos-(5-4)], is_array($this->semStack[$this->stackPos-(5-2)]) ? $this->semStack[$this->stackPos-(5-2)] : array($this->semStack[$this->stackPos-(5-2)]), $this->startAttributeStack[$this->stackPos-(5-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule38() {
+         $this->semValue = new Stmt\For_(array('init' => $this->semStack[$this->stackPos-(9-3)], 'cond' => $this->semStack[$this->stackPos-(9-5)], 'loop' => $this->semStack[$this->stackPos-(9-7)], 'stmts' => $this->semStack[$this->stackPos-(9-9)]), $this->startAttributeStack[$this->stackPos-(9-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule39() {
+         $this->semValue = new Stmt\Switch_($this->semStack[$this->stackPos-(3-2)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule40() {
+         $this->semValue = new Stmt\Break_(null, $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule41() {
+         $this->semValue = new Stmt\Break_($this->semStack[$this->stackPos-(3-2)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule42() {
+         $this->semValue = new Stmt\Continue_(null, $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule43() {
+         $this->semValue = new Stmt\Continue_($this->semStack[$this->stackPos-(3-2)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule44() {
+         $this->semValue = new Stmt\Return_(null, $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule45() {
+         $this->semValue = new Stmt\Return_($this->semStack[$this->stackPos-(3-2)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule46() {
+         $this->semValue = $this->semStack[$this->stackPos-(2-1)];
+    }
+
+    protected function reduceRule47() {
+         $this->semValue = new Stmt\Global_($this->semStack[$this->stackPos-(3-2)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule48() {
+         $this->semValue = new Stmt\Static_($this->semStack[$this->stackPos-(3-2)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule49() {
+         $this->semValue = new Stmt\Echo_($this->semStack[$this->stackPos-(3-2)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule50() {
+         $this->semValue = new Stmt\InlineHTML($this->semStack[$this->stackPos-(1-1)], $this->startAttributeStack[$this->stackPos-(1-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule51() {
+         $this->semValue = $this->semStack[$this->stackPos-(2-1)];
+    }
+
+    protected function reduceRule52() {
+         $this->semValue = new Stmt\Unset_($this->semStack[$this->stackPos-(5-3)], $this->startAttributeStack[$this->stackPos-(5-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule53() {
+         $this->semValue = new Stmt\Foreach_($this->semStack[$this->stackPos-(7-3)], $this->semStack[$this->stackPos-(7-5)][0], array('keyVar' => null, 'byRef' => $this->semStack[$this->stackPos-(7-5)][1], 'stmts' => $this->semStack[$this->stackPos-(7-7)]), $this->startAttributeStack[$this->stackPos-(7-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule54() {
+         $this->semValue = new Stmt\Foreach_($this->semStack[$this->stackPos-(9-3)], $this->semStack[$this->stackPos-(9-7)][0], array('keyVar' => $this->semStack[$this->stackPos-(9-5)], 'byRef' => $this->semStack[$this->stackPos-(9-7)][1], 'stmts' => $this->semStack[$this->stackPos-(9-9)]), $this->startAttributeStack[$this->stackPos-(9-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule55() {
+         $this->semValue = new Stmt\Declare_($this->semStack[$this->stackPos-(5-3)], $this->semStack[$this->stackPos-(5-5)], $this->startAttributeStack[$this->stackPos-(5-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule56() {
+         $this->semValue = array(); /* means: no statement */
+    }
+
+    protected function reduceRule57() {
+         $this->semValue = new Stmt\TryCatch($this->semStack[$this->stackPos-(6-3)], $this->semStack[$this->stackPos-(6-5)], $this->semStack[$this->stackPos-(6-6)], $this->startAttributeStack[$this->stackPos-(6-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule58() {
+         $this->semValue = new Stmt\Throw_($this->semStack[$this->stackPos-(3-2)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule59() {
+         $this->semValue = new Stmt\Goto_($this->semStack[$this->stackPos-(3-2)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule60() {
+         $this->semValue = new Stmt\Label($this->semStack[$this->stackPos-(2-1)], $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule61() {
+         $this->semValue = array(); /* means: no statement */
+    }
+
+    protected function reduceRule62() {
+         $this->semValue = array();
+    }
+
+    protected function reduceRule63() {
+         $this->semStack[$this->stackPos-(2-1)][] = $this->semStack[$this->stackPos-(2-2)]; $this->semValue = $this->semStack[$this->stackPos-(2-1)];
+    }
+
+    protected function reduceRule64() {
+         $this->semValue = new Stmt\Catch_($this->semStack[$this->stackPos-(8-3)], substr($this->semStack[$this->stackPos-(8-4)], 1), $this->semStack[$this->stackPos-(8-7)], $this->startAttributeStack[$this->stackPos-(8-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule65() {
+         $this->semValue = null;
+    }
+
+    protected function reduceRule66() {
+         $this->semValue = $this->semStack[$this->stackPos-(4-3)];
+    }
+
+    protected function reduceRule67() {
+         $this->semValue = array($this->semStack[$this->stackPos-(1-1)]);
+    }
+
+    protected function reduceRule68() {
+         $this->semStack[$this->stackPos-(3-1)][] = $this->semStack[$this->stackPos-(3-3)]; $this->semValue = $this->semStack[$this->stackPos-(3-1)];
+    }
+
+    protected function reduceRule69() {
+         $this->semValue = false;
+    }
+
+    protected function reduceRule70() {
+         $this->semValue = true;
+    }
+
+    protected function reduceRule71() {
+         $this->semValue = false;
+    }
+
+    protected function reduceRule72() {
+         $this->semValue = true;
+    }
+
+    protected function reduceRule73() {
+         $this->semValue = new Stmt\Function_($this->semStack[$this->stackPos-(10-3)], array('byRef' => $this->semStack[$this->stackPos-(10-2)], 'params' => $this->semStack[$this->stackPos-(10-5)], 'returnType' => $this->semStack[$this->stackPos-(10-7)], 'stmts' => $this->semStack[$this->stackPos-(10-9)]), $this->startAttributeStack[$this->stackPos-(10-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule74() {
+         $this->semValue = new Stmt\Class_($this->semStack[$this->stackPos-(7-2)], array('type' => $this->semStack[$this->stackPos-(7-1)], 'extends' => $this->semStack[$this->stackPos-(7-3)], 'implements' => $this->semStack[$this->stackPos-(7-4)], 'stmts' => $this->semStack[$this->stackPos-(7-6)]), $this->startAttributeStack[$this->stackPos-(7-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule75() {
+         $this->semValue = new Stmt\Interface_($this->semStack[$this->stackPos-(6-2)], array('extends' => $this->semStack[$this->stackPos-(6-3)], 'stmts' => $this->semStack[$this->stackPos-(6-5)]), $this->startAttributeStack[$this->stackPos-(6-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule76() {
+         $this->semValue = new Stmt\Trait_($this->semStack[$this->stackPos-(5-2)], $this->semStack[$this->stackPos-(5-4)], $this->startAttributeStack[$this->stackPos-(5-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule77() {
+         $this->semValue = 0;
+    }
+
+    protected function reduceRule78() {
+         $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT;
+    }
+
+    protected function reduceRule79() {
+         $this->semValue = Stmt\Class_::MODIFIER_FINAL;
+    }
+
+    protected function reduceRule80() {
+         $this->semValue = null;
+    }
+
+    protected function reduceRule81() {
+         $this->semValue = $this->semStack[$this->stackPos-(2-2)];
+    }
+
+    protected function reduceRule82() {
+         $this->semValue = array();
+    }
+
+    protected function reduceRule83() {
+         $this->semValue = $this->semStack[$this->stackPos-(2-2)];
+    }
+
+    protected function reduceRule84() {
+         $this->semValue = array();
+    }
+
+    protected function reduceRule85() {
+         $this->semValue = $this->semStack[$this->stackPos-(2-2)];
+    }
+
+    protected function reduceRule86() {
+         $this->semValue = array($this->semStack[$this->stackPos-(1-1)]);
+    }
+
+    protected function reduceRule87() {
+         $this->semStack[$this->stackPos-(3-1)][] = $this->semStack[$this->stackPos-(3-3)]; $this->semValue = $this->semStack[$this->stackPos-(3-1)];
+    }
+
+    protected function reduceRule88() {
+         $this->semValue = is_array($this->semStack[$this->stackPos-(1-1)]) ? $this->semStack[$this->stackPos-(1-1)] : array($this->semStack[$this->stackPos-(1-1)]);
+    }
+
+    protected function reduceRule89() {
+         $this->semValue = $this->semStack[$this->stackPos-(4-2)];
+    }
+
+    protected function reduceRule90() {
+         $this->semValue = is_array($this->semStack[$this->stackPos-(1-1)]) ? $this->semStack[$this->stackPos-(1-1)] : array($this->semStack[$this->stackPos-(1-1)]);
+    }
+
+    protected function reduceRule91() {
+         $this->semValue = $this->semStack[$this->stackPos-(4-2)];
+    }
+
+    protected function reduceRule92() {
+         $this->semValue = is_array($this->semStack[$this->stackPos-(1-1)]) ? $this->semStack[$this->stackPos-(1-1)] : array($this->semStack[$this->stackPos-(1-1)]);
+    }
+
+    protected function reduceRule93() {
+         $this->semValue = $this->semStack[$this->stackPos-(4-2)];
+    }
+
+    protected function reduceRule94() {
+         $this->semValue = array($this->semStack[$this->stackPos-(1-1)]);
+    }
+
+    protected function reduceRule95() {
+         $this->semStack[$this->stackPos-(3-1)][] = $this->semStack[$this->stackPos-(3-3)]; $this->semValue = $this->semStack[$this->stackPos-(3-1)];
+    }
+
+    protected function reduceRule96() {
+         $this->semValue = new Stmt\DeclareDeclare($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule97() {
+         $this->semValue = $this->semStack[$this->stackPos-(3-2)];
+    }
+
+    protected function reduceRule98() {
+         $this->semValue = $this->semStack[$this->stackPos-(4-3)];
+    }
+
+    protected function reduceRule99() {
+         $this->semValue = $this->semStack[$this->stackPos-(4-2)];
+    }
+
+    protected function reduceRule100() {
+         $this->semValue = $this->semStack[$this->stackPos-(5-3)];
+    }
+
+    protected function reduceRule101() {
+         $this->semValue = array();
+    }
+
+    protected function reduceRule102() {
+         $this->semStack[$this->stackPos-(2-1)][] = $this->semStack[$this->stackPos-(2-2)]; $this->semValue = $this->semStack[$this->stackPos-(2-1)];
+    }
+
+    protected function reduceRule103() {
+         $this->semValue = new Stmt\Case_($this->semStack[$this->stackPos-(4-2)], $this->semStack[$this->stackPos-(4-4)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule104() {
+         $this->semValue = new Stmt\Case_(null, $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule105() {
+        $this->semValue = $this->semStack[$this->stackPos];
+    }
+
+    protected function reduceRule106() {
+        $this->semValue = $this->semStack[$this->stackPos];
+    }
+
+    protected function reduceRule107() {
+         $this->semValue = is_array($this->semStack[$this->stackPos-(1-1)]) ? $this->semStack[$this->stackPos-(1-1)] : array($this->semStack[$this->stackPos-(1-1)]);
+    }
+
+    protected function reduceRule108() {
+         $this->semValue = $this->semStack[$this->stackPos-(4-2)];
+    }
+
+    protected function reduceRule109() {
+         $this->semValue = array();
+    }
+
+    protected function reduceRule110() {
+         $this->semStack[$this->stackPos-(2-1)][] = $this->semStack[$this->stackPos-(2-2)]; $this->semValue = $this->semStack[$this->stackPos-(2-1)];
+    }
+
+    protected function reduceRule111() {
+         $this->semValue = new Stmt\ElseIf_($this->semStack[$this->stackPos-(3-2)], is_array($this->semStack[$this->stackPos-(3-3)]) ? $this->semStack[$this->stackPos-(3-3)] : array($this->semStack[$this->stackPos-(3-3)]), $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule112() {
+         $this->semValue = array();
+    }
+
+    protected function reduceRule113() {
+         $this->semStack[$this->stackPos-(2-1)][] = $this->semStack[$this->stackPos-(2-2)]; $this->semValue = $this->semStack[$this->stackPos-(2-1)];
+    }
+
+    protected function reduceRule114() {
+         $this->semValue = new Stmt\ElseIf_($this->semStack[$this->stackPos-(4-2)], $this->semStack[$this->stackPos-(4-4)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule115() {
+         $this->semValue = null;
+    }
+
+    protected function reduceRule116() {
+         $this->semValue = new Stmt\Else_(is_array($this->semStack[$this->stackPos-(2-2)]) ? $this->semStack[$this->stackPos-(2-2)] : array($this->semStack[$this->stackPos-(2-2)]), $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule117() {
+         $this->semValue = null;
+    }
+
+    protected function reduceRule118() {
+         $this->semValue = new Stmt\Else_($this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule119() {
+         $this->semValue = array($this->semStack[$this->stackPos-(1-1)], false);
+    }
+
+    protected function reduceRule120() {
+         $this->semValue = array($this->semStack[$this->stackPos-(2-2)], true);
+    }
+
+    protected function reduceRule121() {
+         $this->semValue = array($this->semStack[$this->stackPos-(1-1)], false);
+    }
+
+    protected function reduceRule122() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule123() {
+         $this->semValue = array();
+    }
+
+    protected function reduceRule124() {
+         $this->semValue = array($this->semStack[$this->stackPos-(1-1)]);
+    }
+
+    protected function reduceRule125() {
+         $this->semStack[$this->stackPos-(3-1)][] = $this->semStack[$this->stackPos-(3-3)]; $this->semValue = $this->semStack[$this->stackPos-(3-1)];
+    }
+
+    protected function reduceRule126() {
+         $this->semValue = new Node\Param(substr($this->semStack[$this->stackPos-(4-4)], 1), null, $this->semStack[$this->stackPos-(4-1)], $this->semStack[$this->stackPos-(4-2)], $this->semStack[$this->stackPos-(4-3)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule127() {
+         $this->semValue = new Node\Param(substr($this->semStack[$this->stackPos-(6-4)], 1), $this->semStack[$this->stackPos-(6-6)], $this->semStack[$this->stackPos-(6-1)], $this->semStack[$this->stackPos-(6-2)], $this->semStack[$this->stackPos-(6-3)], $this->startAttributeStack[$this->stackPos-(6-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule128() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule129() {
+         $this->semValue = 'array';
+    }
+
+    protected function reduceRule130() {
+         $this->semValue = 'callable';
+    }
+
+    protected function reduceRule131() {
+         $this->semValue = null;
+    }
+
+    protected function reduceRule132() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule133() {
+         $this->semValue = null;
+    }
+
+    protected function reduceRule134() {
+         $this->semValue = $this->semStack[$this->stackPos-(2-2)];
+    }
+
+    protected function reduceRule135() {
+         $this->semValue = array();
+    }
+
+    protected function reduceRule136() {
+         $this->semValue = $this->semStack[$this->stackPos-(3-2)];
+    }
+
+    protected function reduceRule137() {
+         $this->semValue = array(new Node\Arg($this->semStack[$this->stackPos-(3-2)], false, false, $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes));
+    }
+
+    protected function reduceRule138() {
+         $this->semValue = array($this->semStack[$this->stackPos-(1-1)]);
+    }
+
+    protected function reduceRule139() {
+         $this->semStack[$this->stackPos-(3-1)][] = $this->semStack[$this->stackPos-(3-3)]; $this->semValue = $this->semStack[$this->stackPos-(3-1)];
+    }
+
+    protected function reduceRule140() {
+         $this->semValue = new Node\Arg($this->semStack[$this->stackPos-(1-1)], false, false, $this->startAttributeStack[$this->stackPos-(1-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule141() {
+         $this->semValue = new Node\Arg($this->semStack[$this->stackPos-(2-2)], true, false, $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule142() {
+         $this->semValue = new Node\Arg($this->semStack[$this->stackPos-(2-2)], false, true, $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule143() {
+         $this->semStack[$this->stackPos-(3-1)][] = $this->semStack[$this->stackPos-(3-3)]; $this->semValue = $this->semStack[$this->stackPos-(3-1)];
+    }
+
+    protected function reduceRule144() {
+         $this->semValue = array($this->semStack[$this->stackPos-(1-1)]);
+    }
+
+    protected function reduceRule145() {
+         $this->semValue = new Expr\Variable(substr($this->semStack[$this->stackPos-(1-1)], 1), $this->startAttributeStack[$this->stackPos-(1-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule146() {
+         $this->semValue = new Expr\Variable($this->semStack[$this->stackPos-(2-2)], $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule147() {
+         $this->semValue = new Expr\Variable($this->semStack[$this->stackPos-(4-3)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule148() {
+         $this->semStack[$this->stackPos-(3-1)][] = $this->semStack[$this->stackPos-(3-3)]; $this->semValue = $this->semStack[$this->stackPos-(3-1)];
+    }
+
+    protected function reduceRule149() {
+         $this->semValue = array($this->semStack[$this->stackPos-(1-1)]);
+    }
+
+    protected function reduceRule150() {
+         $this->semValue = new Stmt\StaticVar(substr($this->semStack[$this->stackPos-(1-1)], 1), null, $this->startAttributeStack[$this->stackPos-(1-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule151() {
+         $this->semValue = new Stmt\StaticVar(substr($this->semStack[$this->stackPos-(3-1)], 1), $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule152() {
+         $this->semStack[$this->stackPos-(2-1)][] = $this->semStack[$this->stackPos-(2-2)]; $this->semValue = $this->semStack[$this->stackPos-(2-1)];
+    }
+
+    protected function reduceRule153() {
+         $this->semValue = array();
+    }
+
+    protected function reduceRule154() {
+         $this->semValue = new Stmt\Property($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-2)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule155() {
+         $this->semValue = new Stmt\ClassConst($this->semStack[$this->stackPos-(3-2)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule156() {
+         $this->semValue = new Stmt\ClassMethod($this->semStack[$this->stackPos-(9-4)], array('type' => $this->semStack[$this->stackPos-(9-1)], 'byRef' => $this->semStack[$this->stackPos-(9-3)], 'params' => $this->semStack[$this->stackPos-(9-6)], 'returnType' => $this->semStack[$this->stackPos-(9-8)], 'stmts' => $this->semStack[$this->stackPos-(9-9)]), $this->startAttributeStack[$this->stackPos-(9-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule157() {
+         $this->semValue = new Stmt\TraitUse($this->semStack[$this->stackPos-(3-2)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule158() {
+         $this->semValue = array();
+    }
+
+    protected function reduceRule159() {
+         $this->semValue = $this->semStack[$this->stackPos-(3-2)];
+    }
+
+    protected function reduceRule160() {
+         $this->semValue = array();
+    }
+
+    protected function reduceRule161() {
+         $this->semStack[$this->stackPos-(2-1)][] = $this->semStack[$this->stackPos-(2-2)]; $this->semValue = $this->semStack[$this->stackPos-(2-1)];
+    }
+
+    protected function reduceRule162() {
+         $this->semValue = new Stmt\TraitUseAdaptation\Precedence($this->semStack[$this->stackPos-(4-1)][0], $this->semStack[$this->stackPos-(4-1)][1], $this->semStack[$this->stackPos-(4-3)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule163() {
+         $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$this->stackPos-(5-1)][0], $this->semStack[$this->stackPos-(5-1)][1], $this->semStack[$this->stackPos-(5-3)], $this->semStack[$this->stackPos-(5-4)], $this->startAttributeStack[$this->stackPos-(5-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule164() {
+         $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$this->stackPos-(4-1)][0], $this->semStack[$this->stackPos-(4-1)][1], $this->semStack[$this->stackPos-(4-3)], null, $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule165() {
+         $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$this->stackPos-(4-1)][0], $this->semStack[$this->stackPos-(4-1)][1], null, $this->semStack[$this->stackPos-(4-3)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule166() {
+         $this->semValue = array($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)]);
+    }
+
+    protected function reduceRule167() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule168() {
+         $this->semValue = array(null, $this->semStack[$this->stackPos-(1-1)]);
+    }
+
+    protected function reduceRule169() {
+         $this->semValue = null;
+    }
+
+    protected function reduceRule170() {
+         $this->semValue = $this->semStack[$this->stackPos-(3-2)];
+    }
+
+    protected function reduceRule171() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule172() {
+         $this->semValue = 0;
+    }
+
+    protected function reduceRule173() {
+         $this->semValue = 0;
+    }
+
+    protected function reduceRule174() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule175() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule176() {
+         Stmt\Class_::verifyModifier($this->semStack[$this->stackPos-(2-1)], $this->semStack[$this->stackPos-(2-2)]); $this->semValue = $this->semStack[$this->stackPos-(2-1)] | $this->semStack[$this->stackPos-(2-2)];
+    }
+
+    protected function reduceRule177() {
+         $this->semValue = Stmt\Class_::MODIFIER_PUBLIC;
+    }
+
+    protected function reduceRule178() {
+         $this->semValue = Stmt\Class_::MODIFIER_PROTECTED;
+    }
+
+    protected function reduceRule179() {
+         $this->semValue = Stmt\Class_::MODIFIER_PRIVATE;
+    }
+
+    protected function reduceRule180() {
+         $this->semValue = Stmt\Class_::MODIFIER_STATIC;
+    }
+
+    protected function reduceRule181() {
+         $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT;
+    }
+
+    protected function reduceRule182() {
+         $this->semValue = Stmt\Class_::MODIFIER_FINAL;
+    }
+
+    protected function reduceRule183() {
+         $this->semValue = array($this->semStack[$this->stackPos-(1-1)]);
+    }
+
+    protected function reduceRule184() {
+         $this->semStack[$this->stackPos-(3-1)][] = $this->semStack[$this->stackPos-(3-3)]; $this->semValue = $this->semStack[$this->stackPos-(3-1)];
+    }
+
+    protected function reduceRule185() {
+         $this->semValue = new Stmt\PropertyProperty(substr($this->semStack[$this->stackPos-(1-1)], 1), null, $this->startAttributeStack[$this->stackPos-(1-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule186() {
+         $this->semValue = new Stmt\PropertyProperty(substr($this->semStack[$this->stackPos-(3-1)], 1), $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule187() {
+         $this->semStack[$this->stackPos-(3-1)][] = $this->semStack[$this->stackPos-(3-3)]; $this->semValue = $this->semStack[$this->stackPos-(3-1)];
+    }
+
+    protected function reduceRule188() {
+         $this->semValue = array($this->semStack[$this->stackPos-(1-1)]);
+    }
+
+    protected function reduceRule189() {
+         $this->semValue = array();
+    }
+
+    protected function reduceRule190() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule191() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule192() {
+         $this->semValue = new Expr\Assign($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule193() {
+         $this->semValue = new Expr\Assign($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule194() {
+         $this->semValue = new Expr\AssignRef($this->semStack[$this->stackPos-(4-1)], $this->semStack[$this->stackPos-(4-4)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule195() {
+         $this->semValue = new Expr\AssignRef($this->semStack[$this->stackPos-(4-1)], $this->semStack[$this->stackPos-(4-4)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule196() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule197() {
+         $this->semValue = new Expr\Clone_($this->semStack[$this->stackPos-(2-2)], $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule198() {
+         $this->semValue = new Expr\AssignOp\Plus($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule199() {
+         $this->semValue = new Expr\AssignOp\Minus($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule200() {
+         $this->semValue = new Expr\AssignOp\Mul($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule201() {
+         $this->semValue = new Expr\AssignOp\Div($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule202() {
+         $this->semValue = new Expr\AssignOp\Concat($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule203() {
+         $this->semValue = new Expr\AssignOp\Mod($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule204() {
+         $this->semValue = new Expr\AssignOp\BitwiseAnd($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule205() {
+         $this->semValue = new Expr\AssignOp\BitwiseOr($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule206() {
+         $this->semValue = new Expr\AssignOp\BitwiseXor($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule207() {
+         $this->semValue = new Expr\AssignOp\ShiftLeft($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule208() {
+         $this->semValue = new Expr\AssignOp\ShiftRight($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule209() {
+         $this->semValue = new Expr\AssignOp\Pow($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule210() {
+         $this->semValue = new Expr\PostInc($this->semStack[$this->stackPos-(2-1)], $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule211() {
+         $this->semValue = new Expr\PreInc($this->semStack[$this->stackPos-(2-2)], $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule212() {
+         $this->semValue = new Expr\PostDec($this->semStack[$this->stackPos-(2-1)], $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule213() {
+         $this->semValue = new Expr\PreDec($this->semStack[$this->stackPos-(2-2)], $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule214() {
+         $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule215() {
+         $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule216() {
+         $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule217() {
+         $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule218() {
+         $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule219() {
+         $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule220() {
+         $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule221() {
+         $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule222() {
+         $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule223() {
+         $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule224() {
+         $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule225() {
+         $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule226() {
+         $this->semValue = new Expr\BinaryOp\Div($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule227() {
+         $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule228() {
+         $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule229() {
+         $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule230() {
+         $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule231() {
+         $this->semValue = new Expr\UnaryPlus($this->semStack[$this->stackPos-(2-2)], $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule232() {
+         $this->semValue = new Expr\UnaryMinus($this->semStack[$this->stackPos-(2-2)], $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule233() {
+         $this->semValue = new Expr\BooleanNot($this->semStack[$this->stackPos-(2-2)], $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule234() {
+         $this->semValue = new Expr\BitwiseNot($this->semStack[$this->stackPos-(2-2)], $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule235() {
+         $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule236() {
+         $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule237() {
+         $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule238() {
+         $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule239() {
+         $this->semValue = new Expr\BinaryOp\Spaceship($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule240() {
+         $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule241() {
+         $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule242() {
+         $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule243() {
+         $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule244() {
+         $this->semValue = new Expr\Instanceof_($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule245() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule246() {
+         $this->semValue = $this->semStack[$this->stackPos-(3-2)];
+    }
+
+    protected function reduceRule247() {
+         $this->semValue = new Expr\Ternary($this->semStack[$this->stackPos-(5-1)], $this->semStack[$this->stackPos-(5-3)], $this->semStack[$this->stackPos-(5-5)], $this->startAttributeStack[$this->stackPos-(5-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule248() {
+         $this->semValue = new Expr\Ternary($this->semStack[$this->stackPos-(4-1)], null, $this->semStack[$this->stackPos-(4-4)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule249() {
+         $this->semValue = new Expr\BinaryOp\Coalesce($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule250() {
+         $this->semValue = new Expr\Isset_($this->semStack[$this->stackPos-(4-3)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule251() {
+         $this->semValue = new Expr\Empty_($this->semStack[$this->stackPos-(4-3)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule252() {
+         $this->semValue = new Expr\Include_($this->semStack[$this->stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE, $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule253() {
+         $this->semValue = new Expr\Include_($this->semStack[$this->stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE_ONCE, $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule254() {
+         $this->semValue = new Expr\Eval_($this->semStack[$this->stackPos-(2-2)], $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule255() {
+         $this->semValue = new Expr\Include_($this->semStack[$this->stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE, $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule256() {
+         $this->semValue = new Expr\Include_($this->semStack[$this->stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE_ONCE, $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule257() {
+         $this->semValue = new Expr\Cast\Int_($this->semStack[$this->stackPos-(2-2)], $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule258() {
+         $this->semValue = new Expr\Cast\Double($this->semStack[$this->stackPos-(2-2)], $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule259() {
+         $this->semValue = new Expr\Cast\String_($this->semStack[$this->stackPos-(2-2)], $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule260() {
+         $this->semValue = new Expr\Cast\Array_($this->semStack[$this->stackPos-(2-2)], $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule261() {
+         $this->semValue = new Expr\Cast\Object_($this->semStack[$this->stackPos-(2-2)], $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule262() {
+         $this->semValue = new Expr\Cast\Bool_($this->semStack[$this->stackPos-(2-2)], $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule263() {
+         $this->semValue = new Expr\Cast\Unset_($this->semStack[$this->stackPos-(2-2)], $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule264() {
+         $this->semValue = new Expr\Exit_($this->semStack[$this->stackPos-(2-2)], $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule265() {
+         $this->semValue = new Expr\ErrorSuppress($this->semStack[$this->stackPos-(2-2)], $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule266() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule267() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule268() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule269() {
+         $this->semValue = new Expr\ShellExec($this->semStack[$this->stackPos-(3-2)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule270() {
+         $this->semValue = new Expr\Print_($this->semStack[$this->stackPos-(2-2)], $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule271() {
+         $this->semValue = new Expr\Yield_(null, null, $this->startAttributeStack[$this->stackPos-(1-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule272() {
+         $this->semValue = new Expr\YieldFrom($this->semStack[$this->stackPos-(2-2)], $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule273() {
+         $this->semValue = new Expr\Closure(array('static' => false, 'byRef' => $this->semStack[$this->stackPos-(10-2)], 'params' => $this->semStack[$this->stackPos-(10-4)], 'uses' => $this->semStack[$this->stackPos-(10-6)], 'returnType' => $this->semStack[$this->stackPos-(10-7)], 'stmts' => $this->semStack[$this->stackPos-(10-9)]), $this->startAttributeStack[$this->stackPos-(10-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule274() {
+         $this->semValue = new Expr\Closure(array('static' => true, 'byRef' => $this->semStack[$this->stackPos-(11-3)], 'params' => $this->semStack[$this->stackPos-(11-5)], 'uses' => $this->semStack[$this->stackPos-(11-7)], 'returnType' => $this->semStack[$this->stackPos-(11-8)], 'stmts' => $this->semStack[$this->stackPos-(11-10)]), $this->startAttributeStack[$this->stackPos-(11-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule275() {
+         $this->semValue = $this->semStack[$this->stackPos-(3-2)];
+    }
+
+    protected function reduceRule276() {
+         $this->semValue = $this->semStack[$this->stackPos-(3-2)];
+    }
+
+    protected function reduceRule277() {
+         $this->semValue = new Expr\Yield_($this->semStack[$this->stackPos-(2-2)], null, $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule278() {
+         $this->semValue = new Expr\Yield_($this->semStack[$this->stackPos-(4-4)], $this->semStack[$this->stackPos-(4-2)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule279() {
+         $this->semValue = new Expr\Array_($this->semStack[$this->stackPos-(4-3)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule280() {
+         $this->semValue = new Expr\Array_($this->semStack[$this->stackPos-(3-2)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule281() {
+         $this->semValue = new Expr\ArrayDimFetch($this->semStack[$this->stackPos-(4-1)], $this->semStack[$this->stackPos-(4-3)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule282() {
+         $this->semValue = new Expr\ArrayDimFetch(new Scalar\String_(Scalar\String_::parse($this->semStack[$this->stackPos-(4-1)]), $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes), $this->semStack[$this->stackPos-(4-3)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule283() {
+         $this->semValue = new Expr\ArrayDimFetch($this->semStack[$this->stackPos-(4-1)], $this->semStack[$this->stackPos-(4-3)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule284() {
+         $this->semValue = new Expr\ArrayDimFetch($this->semStack[$this->stackPos-(4-1)], $this->semStack[$this->stackPos-(4-3)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule285() {
+         $this->semValue = array(new Stmt\Class_(null, array('type' => 0, 'extends' => $this->semStack[$this->stackPos-(7-3)], 'implements' => $this->semStack[$this->stackPos-(7-4)], 'stmts' => $this->semStack[$this->stackPos-(7-6)]), $this->startAttributeStack[$this->stackPos-(7-1)] + $this->endAttributes), $this->semStack[$this->stackPos-(7-2)]);
+    }
+
+    protected function reduceRule286() {
+         $this->semValue = new Expr\New_($this->semStack[$this->stackPos-(3-2)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule287() {
+         list($class, $ctorArgs) = $this->semStack[$this->stackPos-(2-2)]; $this->semValue = new Expr\New_($class, $ctorArgs, $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule288() {
+         $this->semValue = array();
+    }
+
+    protected function reduceRule289() {
+         $this->semValue = $this->semStack[$this->stackPos-(4-3)];
+    }
+
+    protected function reduceRule290() {
+         $this->semValue = array($this->semStack[$this->stackPos-(1-1)]);
+    }
+
+    protected function reduceRule291() {
+         $this->semStack[$this->stackPos-(3-1)][] = $this->semStack[$this->stackPos-(3-3)]; $this->semValue = $this->semStack[$this->stackPos-(3-1)];
+    }
+
+    protected function reduceRule292() {
+         $this->semValue = new Expr\ClosureUse(substr($this->semStack[$this->stackPos-(2-2)], 1), $this->semStack[$this->stackPos-(2-1)], $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule293() {
+         $this->semValue = new Expr\FuncCall($this->semStack[$this->stackPos-(2-1)], $this->semStack[$this->stackPos-(2-2)], $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule294() {
+         $this->semValue = new Expr\StaticCall($this->semStack[$this->stackPos-(4-1)], $this->semStack[$this->stackPos-(4-3)], $this->semStack[$this->stackPos-(4-4)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule295() {
+         $this->semValue = new Expr\StaticCall($this->semStack[$this->stackPos-(6-1)], $this->semStack[$this->stackPos-(6-4)], $this->semStack[$this->stackPos-(6-6)], $this->startAttributeStack[$this->stackPos-(6-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule296() {
+
+            if ($this->semStack[$this->stackPos-(2-1)] instanceof Node\Expr\StaticPropertyFetch) {
+                $this->semValue = new Expr\StaticCall($this->semStack[$this->stackPos-(2-1)]->class, new Expr\Variable($this->semStack[$this->stackPos-(2-1)]->name, $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes), $this->semStack[$this->stackPos-(2-2)], $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+            } elseif ($this->semStack[$this->stackPos-(2-1)] instanceof Node\Expr\ArrayDimFetch) {
+                $tmp = $this->semStack[$this->stackPos-(2-1)];
+                while ($tmp->var instanceof Node\Expr\ArrayDimFetch) {
+                    $tmp = $tmp->var;
+                }
+
+                $this->semValue = new Expr\StaticCall($tmp->var->class, $this->semStack[$this->stackPos-(2-1)], $this->semStack[$this->stackPos-(2-2)], $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+                $tmp->var = new Expr\Variable($tmp->var->name, $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+            } else {
+                throw new \Exception;
+            }
+
+    }
+
+    protected function reduceRule297() {
+         $this->semValue = new Expr\FuncCall($this->semStack[$this->stackPos-(2-1)], $this->semStack[$this->stackPos-(2-2)], $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule298() {
+         $this->semValue = new Expr\ArrayDimFetch($this->semStack[$this->stackPos-(4-1)], $this->semStack[$this->stackPos-(4-3)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule299() {
+         $this->semValue = new Name($this->semStack[$this->stackPos-(1-1)], $this->startAttributeStack[$this->stackPos-(1-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule300() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule301() {
+         $this->semValue = new Name($this->semStack[$this->stackPos-(1-1)], $this->startAttributeStack[$this->stackPos-(1-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule302() {
+         $this->semValue = new Name\FullyQualified($this->semStack[$this->stackPos-(2-2)], $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule303() {
+         $this->semValue = new Name\Relative($this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule304() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule305() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule306() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule307() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule308() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule309() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule310() {
+         $this->semValue = new Expr\PropertyFetch($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule311() {
+         $this->semValue = new Expr\PropertyFetch($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule312() {
+         $this->semValue = new Expr\ArrayDimFetch($this->semStack[$this->stackPos-(4-1)], $this->semStack[$this->stackPos-(4-3)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule313() {
+         $this->semValue = new Expr\ArrayDimFetch($this->semStack[$this->stackPos-(4-1)], $this->semStack[$this->stackPos-(4-3)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule314() {
+         $this->semValue = null;
+    }
+
+    protected function reduceRule315() {
+         $this->semValue = null;
+    }
+
+    protected function reduceRule316() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule317() {
+         $this->semValue = array();
+    }
+
+    protected function reduceRule318() {
+         $this->semValue = array(Scalar\String_::parseEscapeSequences($this->semStack[$this->stackPos-(1-1)], '`'));
+    }
+
+    protected function reduceRule319() {
+         foreach ($this->semStack[$this->stackPos-(1-1)] as &$s) { if (is_string($s)) { $s = Node\Scalar\String_::parseEscapeSequences($s, '`'); } }; $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule320() {
+         $this->semValue = array();
+    }
+
+    protected function reduceRule321() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule322() {
+         $this->semValue = new Scalar\LNumber(Scalar\LNumber::parse($this->semStack[$this->stackPos-(1-1)]), $this->startAttributeStack[$this->stackPos-(1-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule323() {
+         $this->semValue = new Scalar\DNumber(Scalar\DNumber::parse($this->semStack[$this->stackPos-(1-1)]), $this->startAttributeStack[$this->stackPos-(1-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule324() {
+         $this->semValue = new Scalar\String_(Scalar\String_::parse($this->semStack[$this->stackPos-(1-1)]), $this->startAttributeStack[$this->stackPos-(1-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule325() {
+         $this->semValue = new Scalar\MagicConst\Line($this->startAttributeStack[$this->stackPos-(1-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule326() {
+         $this->semValue = new Scalar\MagicConst\File($this->startAttributeStack[$this->stackPos-(1-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule327() {
+         $this->semValue = new Scalar\MagicConst\Dir($this->startAttributeStack[$this->stackPos-(1-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule328() {
+         $this->semValue = new Scalar\MagicConst\Class_($this->startAttributeStack[$this->stackPos-(1-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule329() {
+         $this->semValue = new Scalar\MagicConst\Trait_($this->startAttributeStack[$this->stackPos-(1-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule330() {
+         $this->semValue = new Scalar\MagicConst\Method($this->startAttributeStack[$this->stackPos-(1-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule331() {
+         $this->semValue = new Scalar\MagicConst\Function_($this->startAttributeStack[$this->stackPos-(1-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule332() {
+         $this->semValue = new Scalar\MagicConst\Namespace_($this->startAttributeStack[$this->stackPos-(1-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule333() {
+         $this->semValue = new Scalar\String_(Scalar\String_::parseDocString($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-2)]), $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule334() {
+         $this->semValue = new Scalar\String_('', $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule335() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule336() {
+         $this->semValue = new Expr\ClassConstFetch($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule337() {
+         $this->semValue = new Expr\ConstFetch($this->semStack[$this->stackPos-(1-1)], $this->startAttributeStack[$this->stackPos-(1-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule338() {
+         $this->semValue = new Expr\Array_($this->semStack[$this->stackPos-(4-3)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule339() {
+         $this->semValue = new Expr\Array_($this->semStack[$this->stackPos-(3-2)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule340() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule341() {
+         $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule342() {
+         $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule343() {
+         $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule344() {
+         $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule345() {
+         $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule346() {
+         $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule347() {
+         $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule348() {
+         $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule349() {
+         $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule350() {
+         $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule351() {
+         $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule352() {
+         $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule353() {
+         $this->semValue = new Expr\BinaryOp\Div($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule354() {
+         $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule355() {
+         $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule356() {
+         $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule357() {
+         $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule358() {
+         $this->semValue = new Expr\UnaryPlus($this->semStack[$this->stackPos-(2-2)], $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule359() {
+         $this->semValue = new Expr\UnaryMinus($this->semStack[$this->stackPos-(2-2)], $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule360() {
+         $this->semValue = new Expr\BooleanNot($this->semStack[$this->stackPos-(2-2)], $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule361() {
+         $this->semValue = new Expr\BitwiseNot($this->semStack[$this->stackPos-(2-2)], $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule362() {
+         $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule363() {
+         $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule364() {
+         $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule365() {
+         $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule366() {
+         $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule367() {
+         $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule368() {
+         $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule369() {
+         $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule370() {
+         $this->semValue = new Expr\Ternary($this->semStack[$this->stackPos-(5-1)], $this->semStack[$this->stackPos-(5-3)], $this->semStack[$this->stackPos-(5-5)], $this->startAttributeStack[$this->stackPos-(5-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule371() {
+         $this->semValue = new Expr\Ternary($this->semStack[$this->stackPos-(4-1)], null, $this->semStack[$this->stackPos-(4-4)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule372() {
+         $this->semValue = new Expr\ArrayDimFetch($this->semStack[$this->stackPos-(4-1)], $this->semStack[$this->stackPos-(4-3)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule373() {
+         $this->semValue = $this->semStack[$this->stackPos-(3-2)];
+    }
+
+    protected function reduceRule374() {
+         $this->semValue = new Expr\ConstFetch($this->semStack[$this->stackPos-(1-1)], $this->startAttributeStack[$this->stackPos-(1-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule375() {
+         $this->semValue = new Expr\ClassConstFetch($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule376() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule377() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule378() {
+         foreach ($this->semStack[$this->stackPos-(3-2)] as &$s) { if (is_string($s)) { $s = Node\Scalar\String_::parseEscapeSequences($s, '"'); } }; $this->semValue = new Scalar\Encapsed($this->semStack[$this->stackPos-(3-2)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule379() {
+         foreach ($this->semStack[$this->stackPos-(3-2)] as &$s) { if (is_string($s)) { $s = Node\Scalar\String_::parseEscapeSequences($s, null); } } $s = preg_replace('~(\r\n|\n|\r)\z~', '', $s); if ('' === $s) array_pop($this->semStack[$this->stackPos-(3-2)]);; $this->semValue = new Scalar\Encapsed($this->semStack[$this->stackPos-(3-2)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule380() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule381() {
+         $this->semValue = 'class';
+    }
+
+    protected function reduceRule382() {
+         $this->semValue = array();
+    }
+
+    protected function reduceRule383() {
+         $this->semValue = $this->semStack[$this->stackPos-(2-1)];
+    }
+
+    protected function reduceRule384() {
+        $this->semValue = $this->semStack[$this->stackPos];
+    }
+
+    protected function reduceRule385() {
+        $this->semValue = $this->semStack[$this->stackPos];
+    }
+
+    protected function reduceRule386() {
+         $this->semStack[$this->stackPos-(3-1)][] = $this->semStack[$this->stackPos-(3-3)]; $this->semValue = $this->semStack[$this->stackPos-(3-1)];
+    }
+
+    protected function reduceRule387() {
+         $this->semValue = array($this->semStack[$this->stackPos-(1-1)]);
+    }
+
+    protected function reduceRule388() {
+         $this->semValue = new Expr\ArrayItem($this->semStack[$this->stackPos-(3-3)], $this->semStack[$this->stackPos-(3-1)], false, $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule389() {
+         $this->semValue = new Expr\ArrayItem($this->semStack[$this->stackPos-(1-1)], null, false, $this->startAttributeStack[$this->stackPos-(1-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule390() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule391() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule392() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule393() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule394() {
+         $this->semValue = new Expr\ArrayDimFetch($this->semStack[$this->stackPos-(6-2)], $this->semStack[$this->stackPos-(6-5)], $this->startAttributeStack[$this->stackPos-(6-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule395() {
+         $this->semValue = new Expr\ArrayDimFetch($this->semStack[$this->stackPos-(4-1)], $this->semStack[$this->stackPos-(4-3)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule396() {
+         $this->semValue = new Expr\PropertyFetch($this->semStack[$this->stackPos-(3-1)], $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule397() {
+         $this->semValue = new Expr\MethodCall($this->semStack[$this->stackPos-(4-1)], $this->semStack[$this->stackPos-(4-3)], $this->semStack[$this->stackPos-(4-4)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule398() {
+         $this->semValue = new Expr\FuncCall($this->semStack[$this->stackPos-(2-1)], $this->semStack[$this->stackPos-(2-2)], $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule399() {
+         $this->semValue = new Expr\ArrayDimFetch($this->semStack[$this->stackPos-(4-1)], $this->semStack[$this->stackPos-(4-3)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule400() {
+         $this->semValue = new Expr\ArrayDimFetch($this->semStack[$this->stackPos-(4-1)], $this->semStack[$this->stackPos-(4-3)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule401() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule402() {
+         $this->semValue = $this->semStack[$this->stackPos-(3-2)];
+    }
+
+    protected function reduceRule403() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule404() {
+         $this->semValue = new Expr\Variable($this->semStack[$this->stackPos-(2-2)], $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule405() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule406() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule407() {
+         $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$this->stackPos-(4-1)], $this->semStack[$this->stackPos-(4-4)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule408() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule409() {
+         $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$this->stackPos-(3-1)], substr($this->semStack[$this->stackPos-(3-3)], 1), $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule410() {
+         $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$this->stackPos-(6-1)], $this->semStack[$this->stackPos-(6-5)], $this->startAttributeStack[$this->stackPos-(6-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule411() {
+         $this->semValue = new Expr\ArrayDimFetch($this->semStack[$this->stackPos-(4-1)], $this->semStack[$this->stackPos-(4-3)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule412() {
+         $this->semValue = new Expr\ArrayDimFetch($this->semStack[$this->stackPos-(4-1)], $this->semStack[$this->stackPos-(4-3)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule413() {
+         $this->semValue = new Expr\ArrayDimFetch($this->semStack[$this->stackPos-(4-1)], $this->semStack[$this->stackPos-(4-3)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule414() {
+         $this->semValue = new Expr\ArrayDimFetch($this->semStack[$this->stackPos-(4-1)], $this->semStack[$this->stackPos-(4-3)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule415() {
+         $this->semValue = new Expr\Variable(substr($this->semStack[$this->stackPos-(1-1)], 1), $this->startAttributeStack[$this->stackPos-(1-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule416() {
+         $this->semValue = new Expr\Variable($this->semStack[$this->stackPos-(4-3)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule417() {
+         $this->semValue = null;
+    }
+
+    protected function reduceRule418() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule419() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule420() {
+         $this->semValue = $this->semStack[$this->stackPos-(3-2)];
+    }
+
+    protected function reduceRule421() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule422() {
+         $this->semValue = new Expr\List_($this->semStack[$this->stackPos-(4-3)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule423() {
+         $this->semStack[$this->stackPos-(3-1)][] = $this->semStack[$this->stackPos-(3-3)]; $this->semValue = $this->semStack[$this->stackPos-(3-1)];
+    }
+
+    protected function reduceRule424() {
+         $this->semValue = array($this->semStack[$this->stackPos-(1-1)]);
+    }
+
+    protected function reduceRule425() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule426() {
+         $this->semValue = $this->semStack[$this->stackPos-(1-1)];
+    }
+
+    protected function reduceRule427() {
+         $this->semValue = null;
+    }
+
+    protected function reduceRule428() {
+         $this->semValue = array();
+    }
+
+    protected function reduceRule429() {
+         $this->semValue = $this->semStack[$this->stackPos-(2-1)];
+    }
+
+    protected function reduceRule430() {
+         $this->semStack[$this->stackPos-(3-1)][] = $this->semStack[$this->stackPos-(3-3)]; $this->semValue = $this->semStack[$this->stackPos-(3-1)];
+    }
+
+    protected function reduceRule431() {
+         $this->semValue = array($this->semStack[$this->stackPos-(1-1)]);
+    }
+
+    protected function reduceRule432() {
+         $this->semValue = new Expr\ArrayItem($this->semStack[$this->stackPos-(3-3)], $this->semStack[$this->stackPos-(3-1)], false, $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule433() {
+         $this->semValue = new Expr\ArrayItem($this->semStack[$this->stackPos-(1-1)], null, false, $this->startAttributeStack[$this->stackPos-(1-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule434() {
+         $this->semValue = new Expr\ArrayItem($this->semStack[$this->stackPos-(4-4)], $this->semStack[$this->stackPos-(4-1)], true, $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule435() {
+         $this->semValue = new Expr\ArrayItem($this->semStack[$this->stackPos-(2-2)], null, true, $this->startAttributeStack[$this->stackPos-(2-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule436() {
+         $this->semStack[$this->stackPos-(2-1)][] = $this->semStack[$this->stackPos-(2-2)]; $this->semValue = $this->semStack[$this->stackPos-(2-1)];
+    }
+
+    protected function reduceRule437() {
+         $this->semStack[$this->stackPos-(2-1)][] = $this->semStack[$this->stackPos-(2-2)]; $this->semValue = $this->semStack[$this->stackPos-(2-1)];
+    }
+
+    protected function reduceRule438() {
+         $this->semValue = array($this->semStack[$this->stackPos-(1-1)]);
+    }
+
+    protected function reduceRule439() {
+         $this->semValue = array($this->semStack[$this->stackPos-(2-1)], $this->semStack[$this->stackPos-(2-2)]);
+    }
+
+    protected function reduceRule440() {
+         $this->semValue = new Expr\Variable(substr($this->semStack[$this->stackPos-(1-1)], 1), $this->startAttributeStack[$this->stackPos-(1-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule441() {
+         $this->semValue = new Expr\ArrayDimFetch(new Expr\Variable(substr($this->semStack[$this->stackPos-(4-1)], 1), $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes), $this->semStack[$this->stackPos-(4-3)], $this->startAttributeStack[$this->stackPos-(4-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule442() {
+         $this->semValue = new Expr\PropertyFetch(new Expr\Variable(substr($this->semStack[$this->stackPos-(3-1)], 1), $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes), $this->semStack[$this->stackPos-(3-3)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule443() {
+         $this->semValue = new Expr\Variable($this->semStack[$this->stackPos-(3-2)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule444() {
+         $this->semValue = new Expr\Variable($this->semStack[$this->stackPos-(3-2)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule445() {
+         $this->semValue = new Expr\ArrayDimFetch(new Expr\Variable($this->semStack[$this->stackPos-(6-2)], $this->startAttributeStack[$this->stackPos-(6-1)] + $this->endAttributes), $this->semStack[$this->stackPos-(6-4)], $this->startAttributeStack[$this->stackPos-(6-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule446() {
+         $this->semValue = $this->semStack[$this->stackPos-(3-2)];
+    }
+
+    protected function reduceRule447() {
+         $this->semValue = new Scalar\String_($this->semStack[$this->stackPos-(1-1)], $this->startAttributeStack[$this->stackPos-(1-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule448() {
+         $this->semValue = new Scalar\String_($this->semStack[$this->stackPos-(1-1)], $this->startAttributeStack[$this->stackPos-(1-1)] + $this->endAttributes);
+    }
+
+    protected function reduceRule449() {
+         $this->semValue = new Expr\Variable(substr($this->semStack[$this->stackPos-(1-1)], 1), $this->startAttributeStack[$this->stackPos-(1-1)] + $this->endAttributes);
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/ParserAbstract.php b/vendor/nikic/php-parser/lib/PhpParser/ParserAbstract.php
new file mode 100644
index 0000000000..2228aa0e76
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/ParserAbstract.php
@@ -0,0 +1,464 @@
+lexer = $lexer;
+        $this->errors = array();
+        $this->throwOnError = isset($options['throwOnError']) ? $options['throwOnError'] : true;
+    }
+
+    /**
+     * Get array of errors that occurred during the last parse.
+     *
+     * This method may only return multiple errors if the 'throwOnError' option is disabled.
+     *
+     * @return Error[]
+     */
+    public function getErrors() {
+        return $this->errors;
+    }
+
+    /**
+     * Parses PHP code into a node tree.
+     *
+     * @param string $code The source code to parse
+     *
+     * @return Node[]|null Array of statements (or null if the 'throwOnError' option is disabled and the parser was
+     *                     unable to recover from an error).
+     */
+    public function parse($code) {
+        $this->lexer->startLexing($code);
+        $this->errors = array();
+
+        // We start off with no lookahead-token
+        $symbol = self::SYMBOL_NONE;
+
+        // The attributes for a node are taken from the first and last token of the node.
+        // From the first token only the startAttributes are taken and from the last only
+        // the endAttributes. Both are merged using the array union operator (+).
+        $startAttributes = '*POISON';
+        $endAttributes = '*POISON';
+        $this->endAttributes = $endAttributes;
+
+        // In order to figure out the attributes for the starting token, we have to keep
+        // them in a stack
+        $this->startAttributeStack = array();
+
+        // Start off in the initial state and keep a stack of previous states
+        $state = 0;
+        $stateStack = array($state);
+
+        // Semantic value stack (contains values of tokens and semantic action results)
+        $this->semStack = array();
+
+        // Current position in the stack(s)
+        $this->stackPos = 0;
+
+        $errorState = 0;
+
+        for (;;) {
+            //$this->traceNewState($state, $symbol);
+
+            if ($this->actionBase[$state] == 0) {
+                $rule = $this->actionDefault[$state];
+            } else {
+                if ($symbol === self::SYMBOL_NONE) {
+                    // Fetch the next token id from the lexer and fetch additional info by-ref.
+                    // The end attributes are fetched into a temporary variable and only set once the token is really
+                    // shifted (not during read). Otherwise you would sometimes get off-by-one errors, when a rule is
+                    // reduced after a token was read but not yet shifted.
+                    $tokenId = $this->lexer->getNextToken($tokenValue, $startAttributes, $endAttributes);
+
+                    // map the lexer token id to the internally used symbols
+                    $symbol = $tokenId >= 0 && $tokenId < $this->tokenToSymbolMapSize
+                        ? $this->tokenToSymbol[$tokenId]
+                        : $this->invalidSymbol;
+
+                    if ($symbol === $this->invalidSymbol) {
+                        throw new \RangeException(sprintf(
+                            'The lexer returned an invalid token (id=%d, value=%s)',
+                            $tokenId, $tokenValue
+                        ));
+                    }
+
+                    // This is necessary to assign some meaningful attributes to /* empty */ productions. They'll get
+                    // the attributes of the next token, even though they don't contain it themselves.
+                    $this->startAttributeStack[$this->stackPos+1] = $startAttributes;
+
+                    //$this->traceRead($symbol);
+                }
+
+                $idx = $this->actionBase[$state] + $symbol;
+                if ((($idx >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] == $symbol)
+                     || ($state < $this->YY2TBLSTATE
+                         && ($idx = $this->actionBase[$state + $this->YYNLSTATES] + $symbol) >= 0
+                         && $idx < $this->actionTableSize && $this->actionCheck[$idx] == $symbol))
+                    && ($action = $this->action[$idx]) != $this->defaultAction) {
+                    /*
+                     * >= YYNLSTATES: shift and reduce
+                     * > 0: shift
+                     * = 0: accept
+                     * < 0: reduce
+                     * = -YYUNEXPECTED: error
+                     */
+                    if ($action > 0) {
+                        /* shift */
+                        //$this->traceShift($symbol);
+
+                        ++$this->stackPos;
+                        $stateStack[$this->stackPos] = $state = $action;
+                        $this->semStack[$this->stackPos] = $tokenValue;
+                        $this->startAttributeStack[$this->stackPos] = $startAttributes;
+                        $this->endAttributes = $endAttributes;
+                        $symbol = self::SYMBOL_NONE;
+
+                        if ($errorState) {
+                            --$errorState;
+                        }
+
+                        if ($action < $this->YYNLSTATES) {
+                            continue;
+                        }
+
+                        /* $yyn >= YYNLSTATES means shift-and-reduce */
+                        $rule = $action - $this->YYNLSTATES;
+                    } else {
+                        $rule = -$action;
+                    }
+                } else {
+                    $rule = $this->actionDefault[$state];
+                }
+            }
+
+            for (;;) {
+                if ($rule === 0) {
+                    /* accept */
+                    //$this->traceAccept();
+                    return $this->semValue;
+                } elseif ($rule !== $this->unexpectedTokenRule) {
+                    /* reduce */
+                    //$this->traceReduce($rule);
+
+                    try {
+                        $this->{'reduceRule' . $rule}();
+                    } catch (Error $e) {
+                        if (-1 === $e->getStartLine() && isset($startAttributes['startLine'])) {
+                            $e->setStartLine($startAttributes['startLine']);
+                        }
+
+                        $this->errors[] = $e;
+                        if ($this->throwOnError) {
+                            throw $e;
+                        } else {
+                            // Currently can't recover from "special" errors
+                            return null;
+                        }
+                    }
+
+                    /* Goto - shift nonterminal */
+                    $this->stackPos -= $this->ruleToLength[$rule];
+                    $nonTerminal = $this->ruleToNonTerminal[$rule];
+                    $idx = $this->gotoBase[$nonTerminal] + $stateStack[$this->stackPos];
+                    if ($idx >= 0 && $idx < $this->gotoTableSize && $this->gotoCheck[$idx] == $nonTerminal) {
+                        $state = $this->goto[$idx];
+                    } else {
+                        $state = $this->gotoDefault[$nonTerminal];
+                    }
+
+                    ++$this->stackPos;
+                    $stateStack[$this->stackPos]     = $state;
+                    $this->semStack[$this->stackPos] = $this->semValue;
+                } else {
+                    /* error */
+                    switch ($errorState) {
+                        case 0:
+                            $msg = $this->getErrorMessage($symbol, $state);
+                            $error = new Error($msg, $startAttributes + $endAttributes);
+                            $this->errors[] = $error;
+                            if ($this->throwOnError) {
+                                throw $error;
+                            }
+                            // Break missing intentionally
+                        case 1:
+                        case 2:
+                            $errorState = 3;
+
+                            // Pop until error-expecting state uncovered
+                            while (!(
+                                (($idx = $this->actionBase[$state] + $this->errorSymbol) >= 0
+                                    && $idx < $this->actionTableSize && $this->actionCheck[$idx] == $this->errorSymbol)
+                                || ($state < $this->YY2TBLSTATE
+                                    && ($idx = $this->actionBase[$state + $this->YYNLSTATES] + $this->errorSymbol) >= 0
+                                    && $idx < $this->actionTableSize && $this->actionCheck[$idx] == $this->errorSymbol)
+                            ) || ($action = $this->action[$idx]) == $this->defaultAction) { // Not totally sure about this
+                                if ($this->stackPos <= 0) {
+                                    // Could not recover from error
+                                    return null;
+                                }
+                                $state = $stateStack[--$this->stackPos];
+                                //$this->tracePop($state);
+                            }
+
+                            //$this->traceShift($this->errorSymbol);
+                            $stateStack[++$this->stackPos] = $state = $action;
+                            break;
+
+                        case 3:
+                            if ($symbol === 0) {
+                                // Reached EOF without recovering from error
+                                return null;
+                            }
+
+                            //$this->traceDiscard($symbol);
+                            $symbol = self::SYMBOL_NONE;
+                            break 2;
+                    }
+                }
+
+                if ($state < $this->YYNLSTATES) {
+                    break;
+                }
+
+                /* >= YYNLSTATES means shift-and-reduce */
+                $rule = $state - $this->YYNLSTATES;
+            }
+        }
+
+        throw new \RuntimeException('Reached end of parser loop');
+    }
+
+    protected function getErrorMessage($symbol, $state) {
+        $expectedString = '';
+        if ($expected = $this->getExpectedTokens($state)) {
+            $expectedString = ', expecting ' . implode(' or ', $expected);
+        }
+
+        return 'Syntax error, unexpected ' . $this->symbolToName[$symbol] . $expectedString;
+    }
+
+    protected function getExpectedTokens($state) {
+        $expected = array();
+
+        $base = $this->actionBase[$state];
+        foreach ($this->symbolToName as $symbol => $name) {
+            $idx = $base + $symbol;
+            if ($idx >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol
+                || $state < $this->YY2TBLSTATE
+                && ($idx = $this->actionBase[$state + $this->YYNLSTATES] + $symbol) >= 0
+                && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol
+            ) {
+                if ($this->action[$idx] != $this->unexpectedTokenRule) {
+                    if (count($expected) == 4) {
+                        /* Too many expected tokens */
+                        return array();
+                    }
+
+                    $expected[] = $name;
+                }
+            }
+        }
+
+        return $expected;
+    }
+
+    /*
+     * Tracing functions used for debugging the parser.
+     */
+
+    /*
+    protected function traceNewState($state, $symbol) {
+        echo '% State ' . $state
+            . ', Lookahead ' . ($symbol == self::SYMBOL_NONE ? '--none--' : $this->symbolToName[$symbol]) . "\n";
+    }
+
+    protected function traceRead($symbol) {
+        echo '% Reading ' . $this->symbolToName[$symbol] . "\n";
+    }
+
+    protected function traceShift($symbol) {
+        echo '% Shift ' . $this->symbolToName[$symbol] . "\n";
+    }
+
+    protected function traceAccept() {
+        echo "% Accepted.\n";
+    }
+
+    protected function traceReduce($n) {
+        echo '% Reduce by (' . $n . ') ' . $this->productions[$n] . "\n";
+    }
+
+    protected function tracePop($state) {
+        echo '% Recovering, uncovered state ' . $state . "\n";
+    }
+
+    protected function traceDiscard($symbol) {
+        echo '% Discard ' . $this->symbolToName[$symbol] . "\n";
+    }
+    */
+
+    /*
+     * Helper functions invoked by semantic actions
+     */
+
+    /**
+     * Moves statements of semicolon-style namespaces into $ns->stmts and checks various error conditions.
+     *
+     * @param Node[] $stmts
+     * @return Node[]
+     */
+    protected function handleNamespaces(array $stmts) {
+        $style = $this->getNamespacingStyle($stmts);
+        if (null === $style) {
+            // not namespaced, nothing to do
+            return $stmts;
+        } elseif ('brace' === $style) {
+            // For braced namespaces we only have to check that there are no invalid statements between the namespaces
+            $afterFirstNamespace = false;
+            foreach ($stmts as $stmt) {
+                if ($stmt instanceof Node\Stmt\Namespace_) {
+                    $afterFirstNamespace = true;
+                } elseif (!$stmt instanceof Node\Stmt\HaltCompiler && $afterFirstNamespace) {
+                    throw new Error('No code may exist outside of namespace {}', $stmt->getLine());
+                }
+            }
+            return $stmts;
+        } else {
+            // For semicolon namespaces we have to move the statements after a namespace declaration into ->stmts
+            $resultStmts = array();
+            $targetStmts =& $resultStmts;
+            foreach ($stmts as $stmt) {
+                if ($stmt instanceof Node\Stmt\Namespace_) {
+                    $stmt->stmts = array();
+                    $targetStmts =& $stmt->stmts;
+                    $resultStmts[] = $stmt;
+                } elseif ($stmt instanceof Node\Stmt\HaltCompiler) {
+                    // __halt_compiler() is not moved into the namespace
+                    $resultStmts[] = $stmt;
+                } else {
+                    $targetStmts[] = $stmt;
+                }
+            }
+            return $resultStmts;
+        }
+    }
+
+    private function getNamespacingStyle(array $stmts) {
+        $style = null;
+        $hasNotAllowedStmts = false;
+        foreach ($stmts as $stmt) {
+            if ($stmt instanceof Node\Stmt\Namespace_) {
+                $currentStyle = null === $stmt->stmts ? 'semicolon' : 'brace';
+                if (null === $style) {
+                    $style = $currentStyle;
+                    if ($hasNotAllowedStmts) {
+                        throw new Error('Namespace declaration statement has to be the very first statement in the script', $stmt->getLine());
+                    }
+                } elseif ($style !== $currentStyle) {
+                    throw new Error('Cannot mix bracketed namespace declarations with unbracketed namespace declarations', $stmt->getLine());
+                }
+            } elseif (!$stmt instanceof Node\Stmt\Declare_ && !$stmt instanceof Node\Stmt\HaltCompiler) {
+                $hasNotAllowedStmts = true;
+            }
+        }
+        return $style;
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php b/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php
new file mode 100644
index 0000000000..9d4ea2e8b4
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php
@@ -0,0 +1,784 @@
+type ? $this->pType($node->type) . ' ' : '')
+             . ($node->byRef ? '&' : '')
+             . ($node->variadic ? '...' : '')
+             . '$' . $node->name
+             . ($node->default ? ' = ' . $this->p($node->default) : '');
+    }
+
+    public function pArg(Node\Arg $node) {
+        return ($node->byRef ? '&' : '') . ($node->unpack ? '...' : '') . $this->p($node->value);
+    }
+
+    public function pConst(Node\Const_ $node) {
+        return $node->name . ' = ' . $this->p($node->value);
+    }
+
+    // Names
+
+    public function pName(Name $node) {
+        return implode('\\', $node->parts);
+    }
+
+    public function pName_FullyQualified(Name\FullyQualified $node) {
+        return '\\' . implode('\\', $node->parts);
+    }
+
+    public function pName_Relative(Name\Relative $node) {
+        return 'namespace\\' . implode('\\', $node->parts);
+    }
+
+    // Magic Constants
+
+    public function pScalar_MagicConst_Class(MagicConst\Class_ $node) {
+        return '__CLASS__';
+    }
+
+    public function pScalar_MagicConst_Dir(MagicConst\Dir $node) {
+        return '__DIR__';
+    }
+
+    public function pScalar_MagicConst_File(MagicConst\File $node) {
+        return '__FILE__';
+    }
+
+    public function pScalar_MagicConst_Function(MagicConst\Function_ $node) {
+        return '__FUNCTION__';
+    }
+
+    public function pScalar_MagicConst_Line(MagicConst\Line $node) {
+        return '__LINE__';
+    }
+
+    public function pScalar_MagicConst_Method(MagicConst\Method $node) {
+        return '__METHOD__';
+    }
+
+    public function pScalar_MagicConst_Namespace(MagicConst\Namespace_ $node) {
+        return '__NAMESPACE__';
+    }
+
+    public function pScalar_MagicConst_Trait(MagicConst\Trait_ $node) {
+        return '__TRAIT__';
+    }
+
+    // Scalars
+
+    public function pScalar_String(Scalar\String_ $node) {
+        return '\'' . $this->pNoIndent(addcslashes($node->value, '\'\\')) . '\'';
+    }
+
+    public function pScalar_Encapsed(Scalar\Encapsed $node) {
+        return '"' . $this->pEncapsList($node->parts, '"') . '"';
+    }
+
+    public function pScalar_LNumber(Scalar\LNumber $node) {
+        return (string) $node->value;
+    }
+
+    public function pScalar_DNumber(Scalar\DNumber $node) {
+        $stringValue = sprintf('%.16G', $node->value);
+        if ($node->value !== (double) $stringValue) {
+            $stringValue = sprintf('%.17G', $node->value);
+        }
+
+        // ensure that number is really printed as float
+        return preg_match('/^-?[0-9]+$/', $stringValue) ? $stringValue . '.0' : $stringValue;
+    }
+
+    // Assignments
+
+    public function pExpr_Assign(Expr\Assign $node) {
+        return $this->pInfixOp('Expr_Assign', $node->var, ' = ', $node->expr);
+    }
+
+    public function pExpr_AssignRef(Expr\AssignRef $node) {
+        return $this->pInfixOp('Expr_AssignRef', $node->var, ' =& ', $node->expr);
+    }
+
+    public function pExpr_AssignOp_Plus(AssignOp\Plus $node) {
+        return $this->pInfixOp('Expr_AssignOp_Plus', $node->var, ' += ', $node->expr);
+    }
+
+    public function pExpr_AssignOp_Minus(AssignOp\Minus $node) {
+        return $this->pInfixOp('Expr_AssignOp_Minus', $node->var, ' -= ', $node->expr);
+    }
+
+    public function pExpr_AssignOp_Mul(AssignOp\Mul $node) {
+        return $this->pInfixOp('Expr_AssignOp_Mul', $node->var, ' *= ', $node->expr);
+    }
+
+    public function pExpr_AssignOp_Div(AssignOp\Div $node) {
+        return $this->pInfixOp('Expr_AssignOp_Div', $node->var, ' /= ', $node->expr);
+    }
+
+    public function pExpr_AssignOp_Concat(AssignOp\Concat $node) {
+        return $this->pInfixOp('Expr_AssignOp_Concat', $node->var, ' .= ', $node->expr);
+    }
+
+    public function pExpr_AssignOp_Mod(AssignOp\Mod $node) {
+        return $this->pInfixOp('Expr_AssignOp_Mod', $node->var, ' %= ', $node->expr);
+    }
+
+    public function pExpr_AssignOp_BitwiseAnd(AssignOp\BitwiseAnd $node) {
+        return $this->pInfixOp('Expr_AssignOp_BitwiseAnd', $node->var, ' &= ', $node->expr);
+    }
+
+    public function pExpr_AssignOp_BitwiseOr(AssignOp\BitwiseOr $node) {
+        return $this->pInfixOp('Expr_AssignOp_BitwiseOr', $node->var, ' |= ', $node->expr);
+    }
+
+    public function pExpr_AssignOp_BitwiseXor(AssignOp\BitwiseXor $node) {
+        return $this->pInfixOp('Expr_AssignOp_BitwiseXor', $node->var, ' ^= ', $node->expr);
+    }
+
+    public function pExpr_AssignOp_ShiftLeft(AssignOp\ShiftLeft $node) {
+        return $this->pInfixOp('Expr_AssignOp_ShiftLeft', $node->var, ' <<= ', $node->expr);
+    }
+
+    public function pExpr_AssignOp_ShiftRight(AssignOp\ShiftRight $node) {
+        return $this->pInfixOp('Expr_AssignOp_ShiftRight', $node->var, ' >>= ', $node->expr);
+    }
+
+    public function pExpr_AssignOp_Pow(AssignOp\Pow $node) {
+        return $this->pInfixOp('Expr_AssignOp_Pow', $node->var, ' **= ', $node->expr);
+    }
+
+    // Binary expressions
+
+    public function pExpr_BinaryOp_Plus(BinaryOp\Plus $node) {
+        return $this->pInfixOp('Expr_BinaryOp_Plus', $node->left, ' + ', $node->right);
+    }
+
+    public function pExpr_BinaryOp_Minus(BinaryOp\Minus $node) {
+        return $this->pInfixOp('Expr_BinaryOp_Minus', $node->left, ' - ', $node->right);
+    }
+
+    public function pExpr_BinaryOp_Mul(BinaryOp\Mul $node) {
+        return $this->pInfixOp('Expr_BinaryOp_Mul', $node->left, ' * ', $node->right);
+    }
+
+    public function pExpr_BinaryOp_Div(BinaryOp\Div $node) {
+        return $this->pInfixOp('Expr_BinaryOp_Div', $node->left, ' / ', $node->right);
+    }
+
+    public function pExpr_BinaryOp_Concat(BinaryOp\Concat $node) {
+        return $this->pInfixOp('Expr_BinaryOp_Concat', $node->left, ' . ', $node->right);
+    }
+
+    public function pExpr_BinaryOp_Mod(BinaryOp\Mod $node) {
+        return $this->pInfixOp('Expr_BinaryOp_Mod', $node->left, ' % ', $node->right);
+    }
+
+    public function pExpr_BinaryOp_BooleanAnd(BinaryOp\BooleanAnd $node) {
+        return $this->pInfixOp('Expr_BinaryOp_BooleanAnd', $node->left, ' && ', $node->right);
+    }
+
+    public function pExpr_BinaryOp_BooleanOr(BinaryOp\BooleanOr $node) {
+        return $this->pInfixOp('Expr_BinaryOp_BooleanOr', $node->left, ' || ', $node->right);
+    }
+
+    public function pExpr_BinaryOp_BitwiseAnd(BinaryOp\BitwiseAnd $node) {
+        return $this->pInfixOp('Expr_BinaryOp_BitwiseAnd', $node->left, ' & ', $node->right);
+    }
+
+    public function pExpr_BinaryOp_BitwiseOr(BinaryOp\BitwiseOr $node) {
+        return $this->pInfixOp('Expr_BinaryOp_BitwiseOr', $node->left, ' | ', $node->right);
+    }
+
+    public function pExpr_BinaryOp_BitwiseXor(BinaryOp\BitwiseXor $node) {
+        return $this->pInfixOp('Expr_BinaryOp_BitwiseXor', $node->left, ' ^ ', $node->right);
+    }
+
+    public function pExpr_BinaryOp_ShiftLeft(BinaryOp\ShiftLeft $node) {
+        return $this->pInfixOp('Expr_BinaryOp_ShiftLeft', $node->left, ' << ', $node->right);
+    }
+
+    public function pExpr_BinaryOp_ShiftRight(BinaryOp\ShiftRight $node) {
+        return $this->pInfixOp('Expr_BinaryOp_ShiftRight', $node->left, ' >> ', $node->right);
+    }
+
+    public function pExpr_BinaryOp_Pow(BinaryOp\Pow $node) {
+        return $this->pInfixOp('Expr_BinaryOp_Pow', $node->left, ' ** ', $node->right);
+    }
+
+    public function pExpr_BinaryOp_LogicalAnd(BinaryOp\LogicalAnd $node) {
+        return $this->pInfixOp('Expr_BinaryOp_LogicalAnd', $node->left, ' and ', $node->right);
+    }
+
+    public function pExpr_BinaryOp_LogicalOr(BinaryOp\LogicalOr $node) {
+        return $this->pInfixOp('Expr_BinaryOp_LogicalOr', $node->left, ' or ', $node->right);
+    }
+
+    public function pExpr_BinaryOp_LogicalXor(BinaryOp\LogicalXor $node) {
+        return $this->pInfixOp('Expr_BinaryOp_LogicalXor', $node->left, ' xor ', $node->right);
+    }
+
+    public function pExpr_BinaryOp_Equal(BinaryOp\Equal $node) {
+        return $this->pInfixOp('Expr_BinaryOp_Equal', $node->left, ' == ', $node->right);
+    }
+
+    public function pExpr_BinaryOp_NotEqual(BinaryOp\NotEqual $node) {
+        return $this->pInfixOp('Expr_BinaryOp_NotEqual', $node->left, ' != ', $node->right);
+    }
+
+    public function pExpr_BinaryOp_Identical(BinaryOp\Identical $node) {
+        return $this->pInfixOp('Expr_BinaryOp_Identical', $node->left, ' === ', $node->right);
+    }
+
+    public function pExpr_BinaryOp_NotIdentical(BinaryOp\NotIdentical $node) {
+        return $this->pInfixOp('Expr_BinaryOp_NotIdentical', $node->left, ' !== ', $node->right);
+    }
+
+    public function pExpr_BinaryOp_Spaceship(BinaryOp\Spaceship $node) {
+        return $this->pInfixOp('Expr_BinaryOp_Spaceship', $node->left, ' <=> ', $node->right);
+    }
+
+    public function pExpr_BinaryOp_Greater(BinaryOp\Greater $node) {
+        return $this->pInfixOp('Expr_BinaryOp_Greater', $node->left, ' > ', $node->right);
+    }
+
+    public function pExpr_BinaryOp_GreaterOrEqual(BinaryOp\GreaterOrEqual $node) {
+        return $this->pInfixOp('Expr_BinaryOp_GreaterOrEqual', $node->left, ' >= ', $node->right);
+    }
+
+    public function pExpr_BinaryOp_Smaller(BinaryOp\Smaller $node) {
+        return $this->pInfixOp('Expr_BinaryOp_Smaller', $node->left, ' < ', $node->right);
+    }
+
+    public function pExpr_BinaryOp_SmallerOrEqual(BinaryOp\SmallerOrEqual $node) {
+        return $this->pInfixOp('Expr_BinaryOp_SmallerOrEqual', $node->left, ' <= ', $node->right);
+    }
+
+    public function pExpr_BinaryOp_Coalesce(BinaryOp\Coalesce $node) {
+        return $this->pInfixOp('Expr_BinaryOp_Coalesce', $node->left, ' ?? ', $node->right);
+    }
+
+    public function pExpr_Instanceof(Expr\Instanceof_ $node) {
+        return $this->pInfixOp('Expr_Instanceof', $node->expr, ' instanceof ', $node->class);
+    }
+
+    // Unary expressions
+
+    public function pExpr_BooleanNot(Expr\BooleanNot $node) {
+        return $this->pPrefixOp('Expr_BooleanNot', '!', $node->expr);
+    }
+
+    public function pExpr_BitwiseNot(Expr\BitwiseNot $node) {
+        return $this->pPrefixOp('Expr_BitwiseNot', '~', $node->expr);
+    }
+
+    public function pExpr_UnaryMinus(Expr\UnaryMinus $node) {
+        return $this->pPrefixOp('Expr_UnaryMinus', '-', $node->expr);
+    }
+
+    public function pExpr_UnaryPlus(Expr\UnaryPlus $node) {
+        return $this->pPrefixOp('Expr_UnaryPlus', '+', $node->expr);
+    }
+
+    public function pExpr_PreInc(Expr\PreInc $node) {
+        return $this->pPrefixOp('Expr_PreInc', '++', $node->var);
+    }
+
+    public function pExpr_PreDec(Expr\PreDec $node) {
+        return $this->pPrefixOp('Expr_PreDec', '--', $node->var);
+    }
+
+    public function pExpr_PostInc(Expr\PostInc $node) {
+        return $this->pPostfixOp('Expr_PostInc', $node->var, '++');
+    }
+
+    public function pExpr_PostDec(Expr\PostDec $node) {
+        return $this->pPostfixOp('Expr_PostDec', $node->var, '--');
+    }
+
+    public function pExpr_ErrorSuppress(Expr\ErrorSuppress $node) {
+        return $this->pPrefixOp('Expr_ErrorSuppress', '@', $node->expr);
+    }
+
+    public function pExpr_YieldFrom(Expr\YieldFrom $node) {
+        return $this->pPrefixOp('Expr_YieldFrom', 'yield from ', $node->expr);
+    }
+
+    public function pExpr_Print(Expr\Print_ $node) {
+        return $this->pPrefixOp('Expr_Print', 'print ', $node->expr);
+    }
+
+    // Casts
+
+    public function pExpr_Cast_Int(Cast\Int_ $node) {
+        return $this->pPrefixOp('Expr_Cast_Int', '(int) ', $node->expr);
+    }
+
+    public function pExpr_Cast_Double(Cast\Double $node) {
+        return $this->pPrefixOp('Expr_Cast_Double', '(double) ', $node->expr);
+    }
+
+    public function pExpr_Cast_String(Cast\String_ $node) {
+        return $this->pPrefixOp('Expr_Cast_String', '(string) ', $node->expr);
+    }
+
+    public function pExpr_Cast_Array(Cast\Array_ $node) {
+        return $this->pPrefixOp('Expr_Cast_Array', '(array) ', $node->expr);
+    }
+
+    public function pExpr_Cast_Object(Cast\Object_ $node) {
+        return $this->pPrefixOp('Expr_Cast_Object', '(object) ', $node->expr);
+    }
+
+    public function pExpr_Cast_Bool(Cast\Bool_ $node) {
+        return $this->pPrefixOp('Expr_Cast_Bool', '(bool) ', $node->expr);
+    }
+
+    public function pExpr_Cast_Unset(Cast\Unset_ $node) {
+        return $this->pPrefixOp('Expr_Cast_Unset', '(unset) ', $node->expr);
+    }
+
+    // Function calls and similar constructs
+
+    public function pExpr_FuncCall(Expr\FuncCall $node) {
+        return $this->p($node->name) . '(' . $this->pCommaSeparated($node->args) . ')';
+    }
+
+    public function pExpr_MethodCall(Expr\MethodCall $node) {
+        return $this->pVarOrNewExpr($node->var) . '->' . $this->pObjectProperty($node->name)
+             . '(' . $this->pCommaSeparated($node->args) . ')';
+    }
+
+    public function pExpr_StaticCall(Expr\StaticCall $node) {
+        return $this->p($node->class) . '::'
+             . ($node->name instanceof Expr
+                ? ($node->name instanceof Expr\Variable
+                   || $node->name instanceof Expr\ArrayDimFetch
+                   ? $this->p($node->name)
+                   : '{' . $this->p($node->name) . '}')
+                : $node->name)
+             . '(' . $this->pCommaSeparated($node->args) . ')';
+    }
+
+    public function pExpr_Empty(Expr\Empty_ $node) {
+        return 'empty(' . $this->p($node->expr) . ')';
+    }
+
+    public function pExpr_Isset(Expr\Isset_ $node) {
+        return 'isset(' . $this->pCommaSeparated($node->vars) . ')';
+    }
+
+    public function pExpr_Eval(Expr\Eval_ $node) {
+        return 'eval(' . $this->p($node->expr) . ')';
+    }
+
+    public function pExpr_Include(Expr\Include_ $node) {
+        static $map = array(
+            Expr\Include_::TYPE_INCLUDE      => 'include',
+            Expr\Include_::TYPE_INCLUDE_ONCE => 'include_once',
+            Expr\Include_::TYPE_REQUIRE      => 'require',
+            Expr\Include_::TYPE_REQUIRE_ONCE => 'require_once',
+        );
+
+        return $map[$node->type] . ' ' . $this->p($node->expr);
+    }
+
+    public function pExpr_List(Expr\List_ $node) {
+        $pList = array();
+        foreach ($node->vars as $var) {
+            if (null === $var) {
+                $pList[] = '';
+            } else {
+                $pList[] = $this->p($var);
+            }
+        }
+
+        return 'list(' . implode(', ', $pList) . ')';
+    }
+
+    // Other
+
+    public function pExpr_Variable(Expr\Variable $node) {
+        if ($node->name instanceof Expr) {
+            return '${' . $this->p($node->name) . '}';
+        } else {
+            return '$' . $node->name;
+        }
+    }
+
+    public function pExpr_Array(Expr\Array_ $node) {
+        return 'array(' . $this->pCommaSeparated($node->items) . ')';
+    }
+
+    public function pExpr_ArrayItem(Expr\ArrayItem $node) {
+        return (null !== $node->key ? $this->p($node->key) . ' => ' : '')
+             . ($node->byRef ? '&' : '') . $this->p($node->value);
+    }
+
+    public function pExpr_ArrayDimFetch(Expr\ArrayDimFetch $node) {
+        return $this->pVarOrNewExpr($node->var)
+             . '[' . (null !== $node->dim ? $this->p($node->dim) : '') . ']';
+    }
+
+    public function pExpr_ConstFetch(Expr\ConstFetch $node) {
+        return $this->p($node->name);
+    }
+
+    public function pExpr_ClassConstFetch(Expr\ClassConstFetch $node) {
+        return $this->p($node->class) . '::' . $node->name;
+    }
+
+    public function pExpr_PropertyFetch(Expr\PropertyFetch $node) {
+        return $this->pVarOrNewExpr($node->var) . '->' . $this->pObjectProperty($node->name);
+    }
+
+    public function pExpr_StaticPropertyFetch(Expr\StaticPropertyFetch $node) {
+        return $this->p($node->class) . '::$' . $this->pObjectProperty($node->name);
+    }
+
+    public function pExpr_ShellExec(Expr\ShellExec $node) {
+        return '`' . $this->pEncapsList($node->parts, '`') . '`';
+    }
+
+    public function pExpr_Closure(Expr\Closure $node) {
+        return ($node->static ? 'static ' : '')
+             . 'function ' . ($node->byRef ? '&' : '')
+             . '(' . $this->pCommaSeparated($node->params) . ')'
+             . (!empty($node->uses) ? ' use(' . $this->pCommaSeparated($node->uses) . ')': '')
+             . (null !== $node->returnType ? ' : ' . $this->pType($node->returnType) : '')
+             . ' {' . $this->pStmts($node->stmts) . "\n" . '}';
+    }
+
+    public function pExpr_ClosureUse(Expr\ClosureUse $node) {
+        return ($node->byRef ? '&' : '') . '$' . $node->var;
+    }
+
+    public function pExpr_New(Expr\New_ $node) {
+        if ($node->class instanceof Stmt\Class_) {
+            $args = $node->args ? '(' . $this->pCommaSeparated($node->args) . ')' : '';
+            return 'new ' . $this->pClassCommon($node->class, $args);
+        }
+        return 'new ' . $this->p($node->class) . '(' . $this->pCommaSeparated($node->args) . ')';
+    }
+
+    public function pExpr_Clone(Expr\Clone_ $node) {
+        return 'clone ' . $this->p($node->expr);
+    }
+
+    public function pExpr_Ternary(Expr\Ternary $node) {
+        // a bit of cheating: we treat the ternary as a binary op where the ?...: part is the operator.
+        // this is okay because the part between ? and : never needs parentheses.
+        return $this->pInfixOp('Expr_Ternary',
+            $node->cond, ' ?' . (null !== $node->if ? ' ' . $this->p($node->if) . ' ' : '') . ': ', $node->else
+        );
+    }
+
+    public function pExpr_Exit(Expr\Exit_ $node) {
+        return 'die' . (null !== $node->expr ? '(' . $this->p($node->expr) . ')' : '');
+    }
+
+    public function pExpr_Yield(Expr\Yield_ $node) {
+        if ($node->value === null) {
+            return 'yield';
+        } else {
+            // this is a bit ugly, but currently there is no way to detect whether the parentheses are necessary
+            return '(yield '
+                 . ($node->key !== null ? $this->p($node->key) . ' => ' : '')
+                 . $this->p($node->value)
+                 . ')';
+        }
+    }
+
+    // Declarations
+
+    public function pStmt_Namespace(Stmt\Namespace_ $node) {
+        if ($this->canUseSemicolonNamespaces) {
+            return 'namespace ' . $this->p($node->name) . ';' . "\n" . $this->pStmts($node->stmts, false);
+        } else {
+            return 'namespace' . (null !== $node->name ? ' ' . $this->p($node->name) : '')
+                 . ' {' . $this->pStmts($node->stmts) . "\n" . '}';
+        }
+    }
+
+    public function pStmt_Use(Stmt\Use_ $node) {
+        return 'use '
+             . ($node->type === Stmt\Use_::TYPE_FUNCTION ? 'function ' : '')
+             . ($node->type === Stmt\Use_::TYPE_CONSTANT ? 'const ' : '')
+             . $this->pCommaSeparated($node->uses) . ';';
+    }
+
+    public function pStmt_UseUse(Stmt\UseUse $node) {
+        return $this->p($node->name)
+             . ($node->name->getLast() !== $node->alias ? ' as ' . $node->alias : '');
+    }
+
+    public function pStmt_Interface(Stmt\Interface_ $node) {
+        return 'interface ' . $node->name
+             . (!empty($node->extends) ? ' extends ' . $this->pCommaSeparated($node->extends) : '')
+             . "\n" . '{' . $this->pStmts($node->stmts) . "\n" . '}';
+    }
+
+    public function pStmt_Class(Stmt\Class_ $node) {
+        return $this->pClassCommon($node, ' ' . $node->name);
+    }
+
+    public function pStmt_Trait(Stmt\Trait_ $node) {
+        return 'trait ' . $node->name
+             . "\n" . '{' . $this->pStmts($node->stmts) . "\n" . '}';
+    }
+
+    public function pStmt_TraitUse(Stmt\TraitUse $node) {
+        return 'use ' . $this->pCommaSeparated($node->traits)
+             . (empty($node->adaptations)
+                ? ';'
+                : ' {' . $this->pStmts($node->adaptations) . "\n" . '}');
+    }
+
+    public function pStmt_TraitUseAdaptation_Precedence(Stmt\TraitUseAdaptation\Precedence $node) {
+        return $this->p($node->trait) . '::' . $node->method
+             . ' insteadof ' . $this->pCommaSeparated($node->insteadof) . ';';
+    }
+
+    public function pStmt_TraitUseAdaptation_Alias(Stmt\TraitUseAdaptation\Alias $node) {
+        return (null !== $node->trait ? $this->p($node->trait) . '::' : '')
+             . $node->method . ' as'
+             . (null !== $node->newModifier ? ' ' . rtrim($this->pModifiers($node->newModifier), ' ') : '')
+             . (null !== $node->newName     ? ' ' . $node->newName                        : '')
+             . ';';
+    }
+
+    public function pStmt_Property(Stmt\Property $node) {
+        return (0 === $node->type ? 'var ' : $this->pModifiers($node->type)) . $this->pCommaSeparated($node->props) . ';';
+    }
+
+    public function pStmt_PropertyProperty(Stmt\PropertyProperty $node) {
+        return '$' . $node->name
+             . (null !== $node->default ? ' = ' . $this->p($node->default) : '');
+    }
+
+    public function pStmt_ClassMethod(Stmt\ClassMethod $node) {
+        return $this->pModifiers($node->type)
+             . 'function ' . ($node->byRef ? '&' : '') . $node->name
+             . '(' . $this->pCommaSeparated($node->params) . ')'
+             . (null !== $node->returnType ? ' : ' . $this->pType($node->returnType) : '')
+             . (null !== $node->stmts
+                ? "\n" . '{' . $this->pStmts($node->stmts) . "\n" . '}'
+                : ';');
+    }
+
+    public function pStmt_ClassConst(Stmt\ClassConst $node) {
+        return 'const ' . $this->pCommaSeparated($node->consts) . ';';
+    }
+
+    public function pStmt_Function(Stmt\Function_ $node) {
+        return 'function ' . ($node->byRef ? '&' : '') . $node->name
+             . '(' . $this->pCommaSeparated($node->params) . ')'
+             . (null !== $node->returnType ? ' : ' . $this->pType($node->returnType) : '')
+             . "\n" . '{' . $this->pStmts($node->stmts) . "\n" . '}';
+    }
+
+    public function pStmt_Const(Stmt\Const_ $node) {
+        return 'const ' . $this->pCommaSeparated($node->consts) . ';';
+    }
+
+    public function pStmt_Declare(Stmt\Declare_ $node) {
+        return 'declare (' . $this->pCommaSeparated($node->declares) . ') {'
+             . $this->pStmts($node->stmts) . "\n" . '}';
+    }
+
+    public function pStmt_DeclareDeclare(Stmt\DeclareDeclare $node) {
+        return $node->key . ' = ' . $this->p($node->value);
+    }
+
+    // Control flow
+
+    public function pStmt_If(Stmt\If_ $node) {
+        return 'if (' . $this->p($node->cond) . ') {'
+             . $this->pStmts($node->stmts) . "\n" . '}'
+             . $this->pImplode($node->elseifs)
+             . (null !== $node->else ? $this->p($node->else) : '');
+    }
+
+    public function pStmt_ElseIf(Stmt\ElseIf_ $node) {
+        return ' elseif (' . $this->p($node->cond) . ') {'
+             . $this->pStmts($node->stmts) . "\n" . '}';
+    }
+
+    public function pStmt_Else(Stmt\Else_ $node) {
+        return ' else {' . $this->pStmts($node->stmts) . "\n" . '}';
+    }
+
+    public function pStmt_For(Stmt\For_ $node) {
+        return 'for ('
+             . $this->pCommaSeparated($node->init) . ';' . (!empty($node->cond) ? ' ' : '')
+             . $this->pCommaSeparated($node->cond) . ';' . (!empty($node->loop) ? ' ' : '')
+             . $this->pCommaSeparated($node->loop)
+             . ') {' . $this->pStmts($node->stmts) . "\n" . '}';
+    }
+
+    public function pStmt_Foreach(Stmt\Foreach_ $node) {
+        return 'foreach (' . $this->p($node->expr) . ' as '
+             . (null !== $node->keyVar ? $this->p($node->keyVar) . ' => ' : '')
+             . ($node->byRef ? '&' : '') . $this->p($node->valueVar) . ') {'
+             . $this->pStmts($node->stmts) . "\n" . '}';
+    }
+
+    public function pStmt_While(Stmt\While_ $node) {
+        return 'while (' . $this->p($node->cond) . ') {'
+             . $this->pStmts($node->stmts) . "\n" . '}';
+    }
+
+    public function pStmt_Do(Stmt\Do_ $node) {
+        return 'do {' . $this->pStmts($node->stmts) . "\n"
+             . '} while (' . $this->p($node->cond) . ');';
+    }
+
+    public function pStmt_Switch(Stmt\Switch_ $node) {
+        return 'switch (' . $this->p($node->cond) . ') {'
+             . $this->pStmts($node->cases) . "\n" . '}';
+    }
+
+    public function pStmt_Case(Stmt\Case_ $node) {
+        return (null !== $node->cond ? 'case ' . $this->p($node->cond) : 'default') . ':'
+             . $this->pStmts($node->stmts);
+    }
+
+    public function pStmt_TryCatch(Stmt\TryCatch $node) {
+        return 'try {' . $this->pStmts($node->stmts) . "\n" . '}'
+             . $this->pImplode($node->catches)
+             . ($node->finallyStmts !== null
+                ? ' finally {' . $this->pStmts($node->finallyStmts) . "\n" . '}'
+                : '');
+    }
+
+    public function pStmt_Catch(Stmt\Catch_ $node) {
+        return ' catch (' . $this->p($node->type) . ' $' . $node->var . ') {'
+             . $this->pStmts($node->stmts) . "\n" . '}';
+    }
+
+    public function pStmt_Break(Stmt\Break_ $node) {
+        return 'break' . ($node->num !== null ? ' ' . $this->p($node->num) : '') . ';';
+    }
+
+    public function pStmt_Continue(Stmt\Continue_ $node) {
+        return 'continue' . ($node->num !== null ? ' ' . $this->p($node->num) : '') . ';';
+    }
+
+    public function pStmt_Return(Stmt\Return_ $node) {
+        return 'return' . (null !== $node->expr ? ' ' . $this->p($node->expr) : '') . ';';
+    }
+
+    public function pStmt_Throw(Stmt\Throw_ $node) {
+        return 'throw ' . $this->p($node->expr) . ';';
+    }
+
+    public function pStmt_Label(Stmt\Label $node) {
+        return $node->name . ':';
+    }
+
+    public function pStmt_Goto(Stmt\Goto_ $node) {
+        return 'goto ' . $node->name . ';';
+    }
+
+    // Other
+
+    public function pStmt_Echo(Stmt\Echo_ $node) {
+        return 'echo ' . $this->pCommaSeparated($node->exprs) . ';';
+    }
+
+    public function pStmt_Static(Stmt\Static_ $node) {
+        return 'static ' . $this->pCommaSeparated($node->vars) . ';';
+    }
+
+    public function pStmt_Global(Stmt\Global_ $node) {
+        return 'global ' . $this->pCommaSeparated($node->vars) . ';';
+    }
+
+    public function pStmt_StaticVar(Stmt\StaticVar $node) {
+        return '$' . $node->name
+             . (null !== $node->default ? ' = ' . $this->p($node->default) : '');
+    }
+
+    public function pStmt_Unset(Stmt\Unset_ $node) {
+        return 'unset(' . $this->pCommaSeparated($node->vars) . ');';
+    }
+
+    public function pStmt_InlineHTML(Stmt\InlineHTML $node) {
+        return '?>' . $this->pNoIndent("\n" . $node->value) . 'remaining;
+    }
+
+    // Helpers
+
+    protected function pType($node) {
+        return is_string($node) ? $node : $this->p($node);
+    }
+
+    protected function pClassCommon(Stmt\Class_ $node, $afterClassToken) {
+        return $this->pModifiers($node->type)
+        . 'class' . $afterClassToken
+        . (null !== $node->extends ? ' extends ' . $this->p($node->extends) : '')
+        . (!empty($node->implements) ? ' implements ' . $this->pCommaSeparated($node->implements) : '')
+        . "\n" . '{' . $this->pStmts($node->stmts) . "\n" . '}';
+    }
+
+    /** @internal */
+    public function pObjectProperty($node) {
+        if ($node instanceof Expr) {
+            return '{' . $this->p($node) . '}';
+        } else {
+            return $node;
+        }
+    }
+
+    /** @internal */
+    public function pModifiers($modifiers) {
+        return ($modifiers & Stmt\Class_::MODIFIER_PUBLIC    ? 'public '    : '')
+             . ($modifiers & Stmt\Class_::MODIFIER_PROTECTED ? 'protected ' : '')
+             . ($modifiers & Stmt\Class_::MODIFIER_PRIVATE   ? 'private '   : '')
+             . ($modifiers & Stmt\Class_::MODIFIER_STATIC    ? 'static '    : '')
+             . ($modifiers & Stmt\Class_::MODIFIER_ABSTRACT  ? 'abstract '  : '')
+             . ($modifiers & Stmt\Class_::MODIFIER_FINAL     ? 'final '     : '');
+    }
+
+    /** @internal */
+    public function pEncapsList(array $encapsList, $quote) {
+        $return = '';
+        foreach ($encapsList as $element) {
+            if (is_string($element)) {
+                $return .= addcslashes($element, "\n\r\t\f\v$" . $quote . "\\");
+            } else {
+                $return .= '{' . $this->p($element) . '}';
+            }
+        }
+
+        return $return;
+    }
+
+    /** @internal */
+    public function pVarOrNewExpr(Node $node) {
+        if ($node instanceof Expr\New_) {
+            return '(' . $this->p($node) . ')';
+        } else {
+            return $this->p($node);
+        }
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php b/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php
new file mode 100644
index 0000000000..e4195ff927
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php
@@ -0,0 +1,270 @@
+ array(  0,  1),
+        'Expr_BitwiseNot'              => array( 10,  1),
+        'Expr_PreInc'                  => array( 10,  1),
+        'Expr_PreDec'                  => array( 10,  1),
+        'Expr_PostInc'                 => array( 10, -1),
+        'Expr_PostDec'                 => array( 10, -1),
+        'Expr_UnaryPlus'               => array( 10,  1),
+        'Expr_UnaryMinus'              => array( 10,  1),
+        'Expr_Cast_Int'                => array( 10,  1),
+        'Expr_Cast_Double'             => array( 10,  1),
+        'Expr_Cast_String'             => array( 10,  1),
+        'Expr_Cast_Array'              => array( 10,  1),
+        'Expr_Cast_Object'             => array( 10,  1),
+        'Expr_Cast_Bool'               => array( 10,  1),
+        'Expr_Cast_Unset'              => array( 10,  1),
+        'Expr_ErrorSuppress'           => array( 10,  1),
+        'Expr_Instanceof'              => array( 20,  0),
+        'Expr_BooleanNot'              => array( 30,  1),
+        'Expr_BinaryOp_Mul'            => array( 40, -1),
+        'Expr_BinaryOp_Div'            => array( 40, -1),
+        'Expr_BinaryOp_Mod'            => array( 40, -1),
+        'Expr_BinaryOp_Plus'           => array( 50, -1),
+        'Expr_BinaryOp_Minus'          => array( 50, -1),
+        'Expr_BinaryOp_Concat'         => array( 50, -1),
+        'Expr_BinaryOp_ShiftLeft'      => array( 60, -1),
+        'Expr_BinaryOp_ShiftRight'     => array( 60, -1),
+        'Expr_BinaryOp_Smaller'        => array( 70,  0),
+        'Expr_BinaryOp_SmallerOrEqual' => array( 70,  0),
+        'Expr_BinaryOp_Greater'        => array( 70,  0),
+        'Expr_BinaryOp_GreaterOrEqual' => array( 70,  0),
+        'Expr_BinaryOp_Equal'          => array( 80,  0),
+        'Expr_BinaryOp_NotEqual'       => array( 80,  0),
+        'Expr_BinaryOp_Identical'      => array( 80,  0),
+        'Expr_BinaryOp_NotIdentical'   => array( 80,  0),
+        'Expr_BinaryOp_Spaceship'      => array( 80,  0),
+        'Expr_BinaryOp_BitwiseAnd'     => array( 90, -1),
+        'Expr_BinaryOp_BitwiseXor'     => array(100, -1),
+        'Expr_BinaryOp_BitwiseOr'      => array(110, -1),
+        'Expr_BinaryOp_BooleanAnd'     => array(120, -1),
+        'Expr_BinaryOp_BooleanOr'      => array(130, -1),
+        'Expr_BinaryOp_Coalesce'       => array(140,  1),
+        'Expr_Ternary'                 => array(150, -1),
+        // parser uses %left for assignments, but they really behave as %right
+        'Expr_Assign'                  => array(160,  1),
+        'Expr_AssignRef'               => array(160,  1),
+        'Expr_AssignOp_Plus'           => array(160,  1),
+        'Expr_AssignOp_Minus'          => array(160,  1),
+        'Expr_AssignOp_Mul'            => array(160,  1),
+        'Expr_AssignOp_Div'            => array(160,  1),
+        'Expr_AssignOp_Concat'         => array(160,  1),
+        'Expr_AssignOp_Mod'            => array(160,  1),
+        'Expr_AssignOp_BitwiseAnd'     => array(160,  1),
+        'Expr_AssignOp_BitwiseOr'      => array(160,  1),
+        'Expr_AssignOp_BitwiseXor'     => array(160,  1),
+        'Expr_AssignOp_ShiftLeft'      => array(160,  1),
+        'Expr_AssignOp_ShiftRight'     => array(160,  1),
+        'Expr_AssignOp_Pow'            => array(160,  1),
+        'Expr_YieldFrom'               => array(165,  1),
+        'Expr_Print'                   => array(168,  1),
+        'Expr_BinaryOp_LogicalAnd'     => array(170, -1),
+        'Expr_BinaryOp_LogicalXor'     => array(180, -1),
+        'Expr_BinaryOp_LogicalOr'      => array(190, -1),
+        'Expr_Include'                 => array(200, -1),
+    );
+
+    protected $noIndentToken;
+    protected $canUseSemicolonNamespaces;
+
+    public function __construct() {
+        $this->noIndentToken = '_NO_INDENT_' . mt_rand();
+    }
+
+    /**
+     * Pretty prints an array of statements.
+     *
+     * @param Node[] $stmts Array of statements
+     *
+     * @return string Pretty printed statements
+     */
+    public function prettyPrint(array $stmts) {
+        $this->preprocessNodes($stmts);
+
+        return ltrim(str_replace("\n" . $this->noIndentToken, "\n", $this->pStmts($stmts, false)));
+    }
+
+    /**
+     * Pretty prints an expression.
+     *
+     * @param Expr $node Expression node
+     *
+     * @return string Pretty printed node
+     */
+    public function prettyPrintExpr(Expr $node) {
+        return str_replace("\n" . $this->noIndentToken, "\n", $this->p($node));
+    }
+
+    /**
+     * Pretty prints a file of statements (includes the opening prettyPrint($stmts));
+
+        $p = preg_replace('/^\?>\n?/', '', $p, -1, $count);
+        $p = preg_replace('/<\?php$/', '', $p);
+
+        if (!$count) {
+            $p = "canUseSemicolonNamespaces = true;
+        foreach ($nodes as $node) {
+            if ($node instanceof Stmt\Namespace_ && null === $node->name) {
+                $this->canUseSemicolonNamespaces = false;
+            }
+        }
+    }
+
+    /**
+     * Pretty prints an array of nodes (statements) and indents them optionally.
+     *
+     * @param Node[] $nodes  Array of nodes
+     * @param bool   $indent Whether to indent the printed nodes
+     *
+     * @return string Pretty printed statements
+     */
+    protected function pStmts(array $nodes, $indent = true) {
+        $result = '';
+        foreach ($nodes as $node) {
+            $result .= "\n"
+                    . $this->pComments($node->getAttribute('comments', array()))
+                    . $this->p($node)
+                    . ($node instanceof Expr ? ';' : '');
+        }
+
+        if ($indent) {
+            return preg_replace('~\n(?!$|' . $this->noIndentToken . ')~', "\n    ", $result);
+        } else {
+            return $result;
+        }
+    }
+
+    /**
+     * Pretty prints a node.
+     *
+     * @param Node $node Node to be pretty printed
+     *
+     * @return string Pretty printed node
+     */
+    protected function p(Node $node) {
+        return $this->{'p' . $node->getType()}($node);
+    }
+
+    protected function pInfixOp($type, Node $leftNode, $operatorString, Node $rightNode) {
+        list($precedence, $associativity) = $this->precedenceMap[$type];
+
+        return $this->pPrec($leftNode, $precedence, $associativity, -1)
+             . $operatorString
+             . $this->pPrec($rightNode, $precedence, $associativity, 1);
+    }
+
+    protected function pPrefixOp($type, $operatorString, Node $node) {
+        list($precedence, $associativity) = $this->precedenceMap[$type];
+        return $operatorString . $this->pPrec($node, $precedence, $associativity, 1);
+    }
+
+    protected function pPostfixOp($type, Node $node, $operatorString) {
+        list($precedence, $associativity) = $this->precedenceMap[$type];
+        return $this->pPrec($node, $precedence, $associativity, -1) . $operatorString;
+    }
+
+    /**
+     * Prints an expression node with the least amount of parentheses necessary to preserve the meaning.
+     *
+     * @param Node $node                Node to pretty print
+     * @param int  $parentPrecedence    Precedence of the parent operator
+     * @param int  $parentAssociativity Associativity of parent operator
+     *                                  (-1 is left, 0 is nonassoc, 1 is right)
+     * @param int  $childPosition       Position of the node relative to the operator
+     *                                  (-1 is left, 1 is right)
+     *
+     * @return string The pretty printed node
+     */
+    protected function pPrec(Node $node, $parentPrecedence, $parentAssociativity, $childPosition) {
+        $type = $node->getType();
+        if (isset($this->precedenceMap[$type])) {
+            $childPrecedence = $this->precedenceMap[$type][0];
+            if ($childPrecedence > $parentPrecedence
+                || ($parentPrecedence == $childPrecedence && $parentAssociativity != $childPosition)
+            ) {
+                return '(' . $this->{'p' . $type}($node) . ')';
+            }
+        }
+
+        return $this->{'p' . $type}($node);
+    }
+
+    /**
+     * Pretty prints an array of nodes and implodes the printed values.
+     *
+     * @param Node[] $nodes Array of Nodes to be printed
+     * @param string $glue  Character to implode with
+     *
+     * @return string Imploded pretty printed nodes
+     */
+    protected function pImplode(array $nodes, $glue = '') {
+        $pNodes = array();
+        foreach ($nodes as $node) {
+            $pNodes[] = $this->p($node);
+        }
+
+        return implode($glue, $pNodes);
+    }
+
+    /**
+     * Pretty prints an array of nodes and implodes the printed values with commas.
+     *
+     * @param Node[] $nodes Array of Nodes to be printed
+     *
+     * @return string Comma separated pretty printed nodes
+     */
+    protected function pCommaSeparated(array $nodes) {
+        return $this->pImplode($nodes, ', ');
+    }
+
+    /**
+     * Signals the pretty printer that a string shall not be indented.
+     *
+     * @param string $string Not to be indented string
+     *
+     * @return mixed String marked with $this->noIndentToken's.
+     */
+    protected function pNoIndent($string) {
+        return str_replace("\n", "\n" . $this->noIndentToken, $string);
+    }
+
+    protected function pComments(array $comments) {
+        $result = '';
+
+        foreach ($comments as $comment) {
+            $result .= $comment->getReformattedText() . "\n";
+        }
+
+        return $result;
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Serializer.php b/vendor/nikic/php-parser/lib/PhpParser/Serializer.php
new file mode 100644
index 0000000000..7c173cda75
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Serializer.php
@@ -0,0 +1,15 @@
+writer = new XMLWriter;
+        $this->writer->openMemory();
+        $this->writer->setIndent(true);
+    }
+
+    public function serialize(array $nodes) {
+        $this->writer->flush();
+        $this->writer->startDocument('1.0', 'UTF-8');
+
+        $this->writer->startElement('AST');
+        $this->writer->writeAttribute('xmlns:node',      'http://nikic.github.com/PHPParser/XML/node');
+        $this->writer->writeAttribute('xmlns:subNode',   'http://nikic.github.com/PHPParser/XML/subNode');
+        $this->writer->writeAttribute('xmlns:attribute', 'http://nikic.github.com/PHPParser/XML/attribute');
+        $this->writer->writeAttribute('xmlns:scalar',    'http://nikic.github.com/PHPParser/XML/scalar');
+
+        $this->_serialize($nodes);
+
+        $this->writer->endElement();
+
+        return $this->writer->outputMemory();
+    }
+
+    protected function _serialize($node) {
+        if ($node instanceof Node) {
+            $this->writer->startElement('node:' . $node->getType());
+
+            foreach ($node->getAttributes() as $name => $value) {
+                $this->writer->startElement('attribute:' . $name);
+                $this->_serialize($value);
+                $this->writer->endElement();
+            }
+
+            foreach ($node as $name => $subNode) {
+                $this->writer->startElement('subNode:' . $name);
+                $this->_serialize($subNode);
+                $this->writer->endElement();
+            }
+
+            $this->writer->endElement();
+        } elseif ($node instanceof Comment) {
+            $this->writer->startElement('comment');
+            $this->writer->writeAttribute('isDocComment', $node instanceof Comment\Doc ? 'true' : 'false');
+            $this->writer->writeAttribute('line', (string) $node->getLine());
+            $this->writer->text($node->getText());
+            $this->writer->endElement();
+        } elseif (is_array($node)) {
+            $this->writer->startElement('scalar:array');
+            foreach ($node as $subNode) {
+                $this->_serialize($subNode);
+            }
+            $this->writer->endElement();
+        } elseif (is_string($node)) {
+            $this->writer->writeElement('scalar:string', $node);
+        } elseif (is_int($node)) {
+            $this->writer->writeElement('scalar:int', (string) $node);
+        } elseif (is_float($node)) {
+            // TODO Higher precision conversion?
+            $this->writer->writeElement('scalar:float', (string) $node);
+        } elseif (true === $node) {
+            $this->writer->writeElement('scalar:true');
+        } elseif (false === $node) {
+            $this->writer->writeElement('scalar:false');
+        } elseif (null === $node) {
+            $this->writer->writeElement('scalar:null');
+        } else {
+            throw new \InvalidArgumentException('Unexpected node type');
+        }
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Unserializer.php b/vendor/nikic/php-parser/lib/PhpParser/Unserializer.php
new file mode 100644
index 0000000000..bfa6da0c43
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Unserializer.php
@@ -0,0 +1,15 @@
+reader = new XMLReader;
+    }
+
+    public function unserialize($string) {
+        $this->reader->XML($string);
+
+        $this->reader->read();
+        if ('AST' !== $this->reader->name) {
+            throw new DomainException('AST root element not found');
+        }
+
+        return $this->read($this->reader->depth);
+    }
+
+    protected function read($depthLimit, $throw = true, &$nodeFound = null) {
+        $nodeFound = true;
+        while ($this->reader->read() && $depthLimit < $this->reader->depth) {
+            if (XMLReader::ELEMENT !== $this->reader->nodeType) {
+                continue;
+            }
+
+            if ('node' === $this->reader->prefix) {
+                return $this->readNode();
+            } elseif ('scalar' === $this->reader->prefix) {
+                return $this->readScalar();
+            } elseif ('comment' === $this->reader->name) {
+                return $this->readComment();
+            } else {
+                throw new DomainException(sprintf('Unexpected node of type "%s"', $this->reader->name));
+            }
+        }
+
+        $nodeFound = false;
+        if ($throw) {
+            throw new DomainException('Expected node or scalar');
+        }
+    }
+
+    protected function readNode() {
+        $className = $this->getClassNameFromType($this->reader->localName);
+
+        // create the node without calling it's constructor
+        $node = unserialize(
+            sprintf(
+                "O:%d:\"%s\":1:{s:13:\"\0*\0attributes\";a:0:{}}",
+                strlen($className), $className
+            )
+        );
+
+        $depthLimit = $this->reader->depth;
+        while ($this->reader->read() && $depthLimit < $this->reader->depth) {
+            if (XMLReader::ELEMENT !== $this->reader->nodeType) {
+                continue;
+            }
+
+            $type = $this->reader->prefix;
+            if ('subNode' !== $type && 'attribute' !== $type) {
+                throw new DomainException(
+                    sprintf('Expected sub node or attribute, got node of type "%s"', $this->reader->name)
+                );
+            }
+
+            $name = $this->reader->localName;
+            $value = $this->read($this->reader->depth);
+
+            if ('subNode' === $type) {
+                $node->$name = $value;
+            } else {
+                $node->setAttribute($name, $value);
+            }
+        }
+
+        return $node;
+    }
+
+    protected function readScalar() {
+        switch ($name = $this->reader->localName) {
+            case 'array':
+                $depth = $this->reader->depth;
+                $array = array();
+                while (true) {
+                    $node = $this->read($depth, false, $nodeFound);
+                    if (!$nodeFound) {
+                        break;
+                    }
+                    $array[] = $node;
+                }
+                return $array;
+            case 'string':
+                return $this->reader->readString();
+            case 'int':
+                return $this->parseInt($this->reader->readString());
+            case 'float':
+                $text = $this->reader->readString();
+                if (false === $float = filter_var($text, FILTER_VALIDATE_FLOAT)) {
+                    throw new DomainException(sprintf('"%s" is not a valid float', $text));
+                }
+                return $float;
+            case 'true':
+            case 'false':
+            case 'null':
+                if (!$this->reader->isEmptyElement) {
+                    throw new DomainException(sprintf('"%s" scalar must be empty', $name));
+                }
+                return constant($name);
+            default:
+                throw new DomainException(sprintf('Unknown scalar type "%s"', $name));
+        }
+    }
+
+    private function parseInt($text) {
+        if (false === $int = filter_var($text, FILTER_VALIDATE_INT)) {
+            throw new DomainException(sprintf('"%s" is not a valid integer', $text));
+        }
+        return $int;
+    }
+
+    protected function readComment() {
+        $className = $this->reader->getAttribute('isDocComment') === 'true'
+            ? 'PhpParser\Comment\Doc'
+            : 'PhpParser\Comment'
+        ;
+        return new $className(
+            $this->reader->readString(),
+            $this->parseInt($this->reader->getAttribute('line'))
+        );
+    }
+
+    protected function getClassNameFromType($type) {
+        $className = 'PhpParser\\Node\\' . strtr($type, '_', '\\');
+        if (!class_exists($className)) {
+            $className .= '_';
+        }
+        if (!class_exists($className)) {
+            throw new DomainException(sprintf('Unknown node type "%s"', $type));
+        }
+        return $className;
+    }
+}
diff --git a/vendor/nikic/php-parser/lib/bootstrap.php b/vendor/nikic/php-parser/lib/bootstrap.php
new file mode 100644
index 0000000000..b0f517822c
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/bootstrap.php
@@ -0,0 +1,6 @@
+
+
+
+    
+        
+            ./test/
+        
+    
+
+    
+        
+            ./lib/PhpParser/
+        
+    
+
\ No newline at end of file
diff --git a/vendor/nikic/php-parser/test/PhpParser/AutoloaderTest.php b/vendor/nikic/php-parser/test/PhpParser/AutoloaderTest.php
new file mode 100644
index 0000000000..4fdc4c2787
--- /dev/null
+++ b/vendor/nikic/php-parser/test/PhpParser/AutoloaderTest.php
@@ -0,0 +1,41 @@
+assertInstanceof('PhpParser\Lexer', $lexer);
+        $this->assertInstanceof('PhpParser\Parser', $parser);
+        $this->assertInstanceof('PhpParser\PrettyPrinter\Standard', $prettyPrinter);
+    }
+
+    public function testPhp7ReservedNames() {
+        if (version_compare(PHP_VERSION, '7.0-dev', '>=')) {
+            $this->markTestSkipped('Cannot create aliases to reserved names on PHP 7');
+        }
+
+        $this->assertTrue(new Expr\Cast\Bool_(new Expr\Variable('foo')) instanceof Expr\Cast\Bool);
+        $this->assertTrue(new Expr\Cast\Int_(new Expr\Variable('foo')) instanceof Expr\Cast\Int);
+
+        $this->assertInstanceof('PhpParser\Node\Expr\Cast\Object_', new Expr\Cast\Object(new Expr\Variable('foo')));
+        $this->assertInstanceof('PhpParser\Node\Expr\Cast\String_', new Expr\Cast\String(new Expr\Variable('foo')));
+        $this->assertInstanceof('PhpParser\Node\Scalar\String_', new Scalar\String('foobar'));
+    }
+
+    public function testClassExists() {
+        $this->assertTrue(class_exists('PhpParser\NodeVisitorAbstract'));
+        $this->assertTrue(class_exists('PHPParser_NodeVisitor_NameResolver'));
+
+        $this->assertFalse(class_exists('PhpParser\FooBar'));
+        $this->assertFalse(class_exists('PHPParser_FooBar'));
+    }
+}
diff --git a/vendor/nikic/php-parser/test/PhpParser/Builder/ClassTest.php b/vendor/nikic/php-parser/test/PhpParser/Builder/ClassTest.php
new file mode 100644
index 0000000000..94ce67afdc
--- /dev/null
+++ b/vendor/nikic/php-parser/test/PhpParser/Builder/ClassTest.php
@@ -0,0 +1,161 @@
+createClassBuilder('SomeLogger')
+            ->extend('BaseLogger')
+            ->implement('Namespaced\Logger', new Name('SomeInterface'))
+            ->implement('\Fully\Qualified', 'namespace\NamespaceRelative')
+            ->getNode()
+        ;
+
+        $this->assertEquals(
+            new Stmt\Class_('SomeLogger', array(
+                'extends' => new Name('BaseLogger'),
+                'implements' => array(
+                    new Name('Namespaced\Logger'),
+                    new Name('SomeInterface'),
+                    new Name\FullyQualified('Fully\Qualified'),
+                    new Name\Relative('NamespaceRelative'),
+                ),
+            )),
+            $node
+        );
+    }
+
+    public function testAbstract() {
+        $node = $this->createClassBuilder('Test')
+            ->makeAbstract()
+            ->getNode()
+        ;
+
+        $this->assertEquals(
+            new Stmt\Class_('Test', array(
+                'type' => Stmt\Class_::MODIFIER_ABSTRACT
+            )),
+            $node
+        );
+    }
+
+    public function testFinal() {
+        $node = $this->createClassBuilder('Test')
+            ->makeFinal()
+            ->getNode()
+        ;
+
+        $this->assertEquals(
+            new Stmt\Class_('Test', array(
+                'type' => Stmt\Class_::MODIFIER_FINAL
+            )),
+            $node
+        );
+    }
+
+    public function testStatementOrder() {
+        $method = new Stmt\ClassMethod('testMethod');
+        $property = new Stmt\Property(
+            Stmt\Class_::MODIFIER_PUBLIC,
+            array(new Stmt\PropertyProperty('testProperty'))
+        );
+        $const = new Stmt\ClassConst(array(
+            new Node\Const_('TEST_CONST', new Node\Scalar\String_('ABC'))
+        ));
+        $use = new Stmt\TraitUse(array(new Name('SomeTrait')));
+
+        $node = $this->createClassBuilder('Test')
+            ->addStmt($method)
+            ->addStmt($property)
+            ->addStmts(array($const, $use))
+            ->getNode()
+        ;
+
+        $this->assertEquals(
+            new Stmt\Class_('Test', array(
+                'stmts' => array($use, $const, $property, $method)
+            )),
+            $node
+        );
+    }
+
+    public function testDocComment() {
+        $docComment = <<<'DOC'
+/**
+ * Test
+ */
+DOC;
+        $class = $this->createClassBuilder('Test')
+            ->setDocComment($docComment)
+            ->getNode();
+
+        $this->assertEquals(
+            new Stmt\Class_('Test', array(), array(
+                'comments' => array(
+                    new Comment\Doc($docComment)
+                )
+            )),
+            $class
+        );
+
+        $class = $this->createClassBuilder('Test')
+            ->setDocComment(new Comment\Doc($docComment))
+            ->getNode();
+
+        $this->assertEquals(
+            new Stmt\Class_('Test', array(), array(
+                'comments' => array(
+                    new Comment\Doc($docComment)
+                )
+            )),
+            $class
+        );
+    }
+
+    /**
+     * @expectedException \LogicException
+     * @expectedExceptionMessage Unexpected node of type "Stmt_Echo"
+     */
+    public function testInvalidStmtError() {
+        $this->createClassBuilder('Test')
+            ->addStmt(new Stmt\Echo_(array()))
+        ;
+    }
+
+    /**
+     * @expectedException \LogicException
+     * @expectedExceptionMessage Doc comment must be a string or an instance of PhpParser\Comment\Doc
+     */
+    public function testInvalidDocComment() {
+        $this->createClassBuilder('Test')
+            ->setDocComment(new Comment('Test'));
+    }
+
+    /**
+     * @expectedException \LogicException
+     * @expectedExceptionMessage Name cannot be empty
+     */
+    public function testEmptyName() {
+        $this->createClassBuilder('Test')
+            ->extend('');
+    }
+
+    /**
+     * @expectedException \LogicException
+     * @expectedExceptionMessage Name must be a string or an instance of PhpParser\Node\Name
+     */
+    public function testInvalidName() {
+        $this->createClassBuilder('Test')
+            ->extend(array('Foo'));
+    }
+}
diff --git a/vendor/nikic/php-parser/test/PhpParser/Builder/FunctionTest.php b/vendor/nikic/php-parser/test/PhpParser/Builder/FunctionTest.php
new file mode 100644
index 0000000000..88fb205295
--- /dev/null
+++ b/vendor/nikic/php-parser/test/PhpParser/Builder/FunctionTest.php
@@ -0,0 +1,88 @@
+createFunctionBuilder('test')
+            ->makeReturnByRef()
+            ->getNode()
+        ;
+
+        $this->assertEquals(
+            new Stmt\Function_('test', array(
+                'byRef' => true
+            )),
+            $node
+        );
+    }
+
+    public function testParams() {
+        $param1 = new Node\Param('test1');
+        $param2 = new Node\Param('test2');
+        $param3 = new Node\Param('test3');
+
+        $node = $this->createFunctionBuilder('test')
+            ->addParam($param1)
+            ->addParams(array($param2, $param3))
+            ->getNode()
+        ;
+
+        $this->assertEquals(
+            new Stmt\Function_('test', array(
+                'params' => array($param1, $param2, $param3)
+            )),
+            $node
+        );
+    }
+
+    public function testStmts() {
+        $stmt1 = new Print_(new String_('test1'));
+        $stmt2 = new Print_(new String_('test2'));
+        $stmt3 = new Print_(new String_('test3'));
+
+        $node = $this->createFunctionBuilder('test')
+            ->addStmt($stmt1)
+            ->addStmts(array($stmt2, $stmt3))
+            ->getNode()
+        ;
+
+        $this->assertEquals(
+            new Stmt\Function_('test', array(
+                'stmts' => array($stmt1, $stmt2, $stmt3)
+            )),
+            $node
+        );
+    }
+
+    public function testDocComment() {
+        $node = $this->createFunctionBuilder('test')
+            ->setDocComment('/** Test */')
+            ->getNode();
+
+        $this->assertEquals(new Stmt\Function_('test', array(), array(
+            'comments' => array(new Comment\Doc('/** Test */'))
+        )), $node);
+    }
+
+    /**
+     * @expectedException \LogicException
+     * @expectedExceptionMessage Expected parameter node, got "Name"
+     */
+    public function testInvalidParamError() {
+        $this->createFunctionBuilder('test')
+            ->addParam(new Node\Name('foo'))
+        ;
+    }
+}
diff --git a/vendor/nikic/php-parser/test/PhpParser/Builder/InterfaceTest.php b/vendor/nikic/php-parser/test/PhpParser/Builder/InterfaceTest.php
new file mode 100644
index 0000000000..c0d2fe372f
--- /dev/null
+++ b/vendor/nikic/php-parser/test/PhpParser/Builder/InterfaceTest.php
@@ -0,0 +1,105 @@
+builder = new Interface_('Contract');
+    }
+
+    private function dump($node) {
+        $pp = new \PhpParser\PrettyPrinter\Standard;
+        return $pp->prettyPrint(array($node));
+    }
+
+    public function testEmpty() {
+        $contract = $this->builder->getNode();
+        $this->assertInstanceOf('PhpParser\Node\Stmt\Interface_', $contract);
+        $this->assertSame('Contract', $contract->name);
+    }
+
+    public function testExtending() {
+        $contract = $this->builder->extend('Space\Root1', 'Root2')->getNode();
+        $this->assertEquals(
+            new Stmt\Interface_('Contract', array(
+                'extends' => array(
+                    new Node\Name('Space\Root1'),
+                    new Node\Name('Root2')
+                ),
+            )), $contract
+        );
+    }
+
+    public function testAddMethod() {
+        $method = new Stmt\ClassMethod('doSomething');
+        $contract = $this->builder->addStmt($method)->getNode();
+        $this->assertSame(array($method), $contract->stmts);
+    }
+
+    public function testAddConst() {
+        $const = new Stmt\ClassConst(array(
+            new Node\Const_('SPEED_OF_LIGHT', new DNumber(299792458.0))
+        ));
+        $contract = $this->builder->addStmt($const)->getNode();
+        $this->assertSame(299792458.0, $contract->stmts[0]->consts[0]->value->value);
+    }
+
+    public function testOrder() {
+        $const = new Stmt\ClassConst(array(
+            new Node\Const_('SPEED_OF_LIGHT', new DNumber(299792458))
+        ));
+        $method = new Stmt\ClassMethod('doSomething');
+        $contract = $this->builder
+            ->addStmt($method)
+            ->addStmt($const)
+            ->getNode()
+        ;
+
+        $this->assertInstanceOf('PhpParser\Node\Stmt\ClassConst', $contract->stmts[0]);
+        $this->assertInstanceOf('PhpParser\Node\Stmt\ClassMethod', $contract->stmts[1]);
+    }
+
+    public function testDocComment() {
+        $node = $this->builder
+            ->setDocComment('/** Test */')
+            ->getNode();
+
+        $this->assertEquals(new Stmt\Interface_('Contract', array(), array(
+            'comments' => array(new Comment\Doc('/** Test */'))
+        )), $node);
+    }
+
+    /**
+     * @expectedException \LogicException
+     * @expectedExceptionMessage Unexpected node of type "Stmt_PropertyProperty"
+     */
+    public function testInvalidStmtError() {
+        $this->builder->addStmt(new Stmt\PropertyProperty('invalid'));
+    }
+
+    public function testFullFunctional() {
+        $const = new Stmt\ClassConst(array(
+            new Node\Const_('SPEED_OF_LIGHT', new DNumber(299792458))
+        ));
+        $method = new Stmt\ClassMethod('doSomething');
+        $contract = $this->builder
+            ->addStmt($method)
+            ->addStmt($const)
+            ->getNode()
+        ;
+
+        eval($this->dump($contract));
+
+        $this->assertTrue(interface_exists('Contract', false));
+    }
+}
+
diff --git a/vendor/nikic/php-parser/test/PhpParser/Builder/MethodTest.php b/vendor/nikic/php-parser/test/PhpParser/Builder/MethodTest.php
new file mode 100644
index 0000000000..668d13fb32
--- /dev/null
+++ b/vendor/nikic/php-parser/test/PhpParser/Builder/MethodTest.php
@@ -0,0 +1,154 @@
+createMethodBuilder('test')
+            ->makePublic()
+            ->makeAbstract()
+            ->makeStatic()
+            ->getNode()
+        ;
+
+        $this->assertEquals(
+            new Stmt\ClassMethod('test', array(
+                'type' => Stmt\Class_::MODIFIER_PUBLIC
+                        | Stmt\Class_::MODIFIER_ABSTRACT
+                        | Stmt\Class_::MODIFIER_STATIC,
+                'stmts' => null,
+            )),
+            $node
+        );
+
+        $node = $this->createMethodBuilder('test')
+            ->makeProtected()
+            ->makeFinal()
+            ->getNode()
+        ;
+
+        $this->assertEquals(
+            new Stmt\ClassMethod('test', array(
+                'type' => Stmt\Class_::MODIFIER_PROTECTED
+                        | Stmt\Class_::MODIFIER_FINAL
+            )),
+            $node
+        );
+
+        $node = $this->createMethodBuilder('test')
+            ->makePrivate()
+            ->getNode()
+        ;
+
+        $this->assertEquals(
+            new Stmt\ClassMethod('test', array(
+                'type' => Stmt\Class_::MODIFIER_PRIVATE
+            )),
+            $node
+        );
+    }
+
+    public function testReturnByRef() {
+        $node = $this->createMethodBuilder('test')
+            ->makeReturnByRef()
+            ->getNode()
+        ;
+
+        $this->assertEquals(
+            new Stmt\ClassMethod('test', array(
+                'byRef' => true
+            )),
+            $node
+        );
+    }
+
+    public function testParams() {
+        $param1 = new Node\Param('test1');
+        $param2 = new Node\Param('test2');
+        $param3 = new Node\Param('test3');
+
+        $node = $this->createMethodBuilder('test')
+            ->addParam($param1)
+            ->addParams(array($param2, $param3))
+            ->getNode()
+        ;
+
+        $this->assertEquals(
+            new Stmt\ClassMethod('test', array(
+                'params' => array($param1, $param2, $param3)
+            )),
+            $node
+        );
+    }
+
+    public function testStmts() {
+        $stmt1 = new Print_(new String_('test1'));
+        $stmt2 = new Print_(new String_('test2'));
+        $stmt3 = new Print_(new String_('test3'));
+
+        $node = $this->createMethodBuilder('test')
+            ->addStmt($stmt1)
+            ->addStmts(array($stmt2, $stmt3))
+            ->getNode()
+        ;
+
+        $this->assertEquals(
+            new Stmt\ClassMethod('test', array(
+                'stmts' => array($stmt1, $stmt2, $stmt3)
+            )),
+            $node
+        );
+    }
+    public function testDocComment() {
+        $node = $this->createMethodBuilder('test')
+            ->setDocComment('/** Test */')
+            ->getNode();
+
+        $this->assertEquals(new Stmt\ClassMethod('test', array(), array(
+            'comments' => array(new Comment\Doc('/** Test */'))
+        )), $node);
+    }
+
+    /**
+     * @expectedException \LogicException
+     * @expectedExceptionMessage Cannot add statements to an abstract method
+     */
+    public function testAddStmtToAbstractMethodError() {
+        $this->createMethodBuilder('test')
+            ->makeAbstract()
+            ->addStmt(new Print_(new String_('test')))
+        ;
+    }
+
+    /**
+     * @expectedException \LogicException
+     * @expectedExceptionMessage Cannot make method with statements abstract
+     */
+    public function testMakeMethodWithStmtsAbstractError() {
+        $this->createMethodBuilder('test')
+            ->addStmt(new Print_(new String_('test')))
+            ->makeAbstract()
+        ;
+    }
+
+    /**
+     * @expectedException \LogicException
+     * @expectedExceptionMessage Expected parameter node, got "Name"
+     */
+    public function testInvalidParamError() {
+        $this->createMethodBuilder('test')
+            ->addParam(new Node\Name('foo'))
+        ;
+    }
+}
diff --git a/vendor/nikic/php-parser/test/PhpParser/Builder/NamespaceTest.php b/vendor/nikic/php-parser/test/PhpParser/Builder/NamespaceTest.php
new file mode 100644
index 0000000000..54e8c93df6
--- /dev/null
+++ b/vendor/nikic/php-parser/test/PhpParser/Builder/NamespaceTest.php
@@ -0,0 +1,41 @@
+createNamespaceBuilder('Name\Space')
+            ->addStmt($stmt1)
+            ->addStmts(array($stmt2, $stmt3))
+            ->getNode()
+        ;
+        $this->assertEquals($expected, $node);
+
+        $node = $this->createNamespaceBuilder(new Node\Name(array('Name', 'Space')))
+            ->addStmts(array($stmt1, $stmt2))
+            ->addStmt($stmt3)
+            ->getNode()
+        ;
+        $this->assertEquals($expected, $node);
+
+        $node = $this->createNamespaceBuilder(null)->getNode();
+        $this->assertNull($node->name);
+        $this->assertEmpty($node->stmts);
+    }
+}
diff --git a/vendor/nikic/php-parser/test/PhpParser/Builder/ParamTest.php b/vendor/nikic/php-parser/test/PhpParser/Builder/ParamTest.php
new file mode 100644
index 0000000000..f71a10c2c0
--- /dev/null
+++ b/vendor/nikic/php-parser/test/PhpParser/Builder/ParamTest.php
@@ -0,0 +1,124 @@
+createParamBuilder('test')
+            ->setDefault($value)
+            ->getNode()
+        ;
+
+        $this->assertEquals($expectedValueNode, $node->default);
+    }
+
+    public function provideTestDefaultValues() {
+        return array(
+            array(
+                null,
+                new Expr\ConstFetch(new Node\Name('null'))
+            ),
+            array(
+                true,
+                new Expr\ConstFetch(new Node\Name('true'))
+            ),
+            array(
+                false,
+                new Expr\ConstFetch(new Node\Name('false'))
+            ),
+            array(
+                31415,
+                new Scalar\LNumber(31415)
+            ),
+            array(
+                3.1415,
+                new Scalar\DNumber(3.1415)
+            ),
+            array(
+                'Hallo World',
+                new Scalar\String_('Hallo World')
+            ),
+            array(
+                array(1, 2, 3),
+                new Expr\Array_(array(
+                    new Expr\ArrayItem(new Scalar\LNumber(1)),
+                    new Expr\ArrayItem(new Scalar\LNumber(2)),
+                    new Expr\ArrayItem(new Scalar\LNumber(3)),
+                ))
+            ),
+            array(
+                array('foo' => 'bar', 'bar' => 'foo'),
+                new Expr\Array_(array(
+                    new Expr\ArrayItem(
+                        new Scalar\String_('bar'),
+                        new Scalar\String_('foo')
+                    ),
+                    new Expr\ArrayItem(
+                        new Scalar\String_('foo'),
+                        new Scalar\String_('bar')
+                    ),
+                ))
+            ),
+            array(
+                new Scalar\MagicConst\Dir,
+                new Scalar\MagicConst\Dir
+            )
+        );
+    }
+
+    public function testTypeHints() {
+        $node = $this->createParamBuilder('test')
+            ->setTypeHint('array')
+            ->getNode()
+        ;
+
+        $this->assertEquals(
+            new Node\Param('test', null, 'array'),
+            $node
+        );
+
+        $node = $this->createParamBuilder('test')
+            ->setTypeHint('callable')
+            ->getNode()
+        ;
+
+        $this->assertEquals(
+            new Node\Param('test', null, 'callable'),
+            $node
+        );
+
+        $node = $this->createParamBuilder('test')
+            ->setTypeHint('Some\Class')
+            ->getNode()
+        ;
+
+        $this->assertEquals(
+            new Node\Param('test', null, new Node\Name('Some\Class')),
+            $node
+        );
+    }
+
+    public function testByRef() {
+        $node = $this->createParamBuilder('test')
+            ->makeByRef()
+            ->getNode()
+        ;
+
+        $this->assertEquals(
+            new Node\Param('test', null, null, true),
+            $node
+        );
+    }
+}
diff --git a/vendor/nikic/php-parser/test/PhpParser/Builder/PropertyTest.php b/vendor/nikic/php-parser/test/PhpParser/Builder/PropertyTest.php
new file mode 100644
index 0000000000..1e62173dec
--- /dev/null
+++ b/vendor/nikic/php-parser/test/PhpParser/Builder/PropertyTest.php
@@ -0,0 +1,147 @@
+createPropertyBuilder('test')
+            ->makePrivate()
+            ->makeStatic()
+            ->getNode()
+        ;
+
+        $this->assertEquals(
+            new Stmt\Property(
+                Stmt\Class_::MODIFIER_PRIVATE
+              | Stmt\Class_::MODIFIER_STATIC,
+                array(
+                    new Stmt\PropertyProperty('test')
+                )
+            ),
+            $node
+        );
+
+        $node = $this->createPropertyBuilder('test')
+            ->makeProtected()
+            ->getNode()
+        ;
+
+        $this->assertEquals(
+            new Stmt\Property(
+                Stmt\Class_::MODIFIER_PROTECTED,
+                array(
+                    new Stmt\PropertyProperty('test')
+                )
+            ),
+            $node
+        );
+
+        $node = $this->createPropertyBuilder('test')
+            ->makePublic()
+            ->getNode()
+        ;
+
+        $this->assertEquals(
+            new Stmt\Property(
+                Stmt\Class_::MODIFIER_PUBLIC,
+                array(
+                    new Stmt\PropertyProperty('test')
+                )
+            ),
+            $node
+        );
+    }
+
+    public function testDocComment() {
+        $node = $this->createPropertyBuilder('test')
+            ->setDocComment('/** Test */')
+            ->getNode();
+
+        $this->assertEquals(new Stmt\Property(
+            Stmt\Class_::MODIFIER_PUBLIC,
+            array(
+                new Stmt\PropertyProperty('test')
+            ),
+            array(
+                'comments' => array(new Comment\Doc('/** Test */'))
+            )
+        ), $node);
+    }
+
+    /**
+     * @dataProvider provideTestDefaultValues
+     */
+    public function testDefaultValues($value, $expectedValueNode) {
+        $node = $this->createPropertyBuilder('test')
+            ->setDefault($value)
+            ->getNode()
+        ;
+
+        $this->assertEquals($expectedValueNode, $node->props[0]->default);
+    }
+
+    public function provideTestDefaultValues() {
+        return array(
+            array(
+                null,
+                new Expr\ConstFetch(new Name('null'))
+            ),
+            array(
+                true,
+                new Expr\ConstFetch(new Name('true'))
+            ),
+            array(
+                false,
+                new Expr\ConstFetch(new Name('false'))
+            ),
+            array(
+                31415,
+                new Scalar\LNumber(31415)
+            ),
+            array(
+                3.1415,
+                new Scalar\DNumber(3.1415)
+            ),
+            array(
+                'Hallo World',
+                new Scalar\String_('Hallo World')
+            ),
+            array(
+                array(1, 2, 3),
+                new Expr\Array_(array(
+                    new Expr\ArrayItem(new Scalar\LNumber(1)),
+                    new Expr\ArrayItem(new Scalar\LNumber(2)),
+                    new Expr\ArrayItem(new Scalar\LNumber(3)),
+                ))
+            ),
+            array(
+                array('foo' => 'bar', 'bar' => 'foo'),
+                new Expr\Array_(array(
+                    new Expr\ArrayItem(
+                        new Scalar\String_('bar'),
+                        new Scalar\String_('foo')
+                    ),
+                    new Expr\ArrayItem(
+                        new Scalar\String_('foo'),
+                        new Scalar\String_('bar')
+                    ),
+                ))
+            ),
+            array(
+                new Scalar\MagicConst\Dir,
+                new Scalar\MagicConst\Dir
+            )
+        );
+    }
+}
diff --git a/vendor/nikic/php-parser/test/PhpParser/Builder/TraitTest.php b/vendor/nikic/php-parser/test/PhpParser/Builder/TraitTest.php
new file mode 100644
index 0000000000..a6d69adaf1
--- /dev/null
+++ b/vendor/nikic/php-parser/test/PhpParser/Builder/TraitTest.php
@@ -0,0 +1,47 @@
+createTraitBuilder('TestTrait')
+            ->setDocComment('/** Nice trait */')
+            ->addStmt($method1)
+            ->addStmts(array($method2, $method3))
+            ->addStmt($prop)
+            ->getNode();
+        $this->assertEquals(new Stmt\Trait_('TestTrait', array(
+            $prop, $method1, $method2, $method3
+        ), array(
+            'comments' => array(
+                new Comment\Doc('/** Nice trait */')
+            )
+        )), $trait);
+    }
+
+    /**
+     * @expectedException \LogicException
+     * @expectedExceptionMessage Unexpected node of type "Stmt_Echo"
+     */
+    public function testInvalidStmtError() {
+        $this->createTraitBuilder('Test')
+            ->addStmt(new Stmt\Echo_(array()))
+        ;
+    }
+}
diff --git a/vendor/nikic/php-parser/test/PhpParser/Builder/UseTest.php b/vendor/nikic/php-parser/test/PhpParser/Builder/UseTest.php
new file mode 100644
index 0000000000..adaeb3a5ed
--- /dev/null
+++ b/vendor/nikic/php-parser/test/PhpParser/Builder/UseTest.php
@@ -0,0 +1,35 @@
+createUseBuilder('Foo\Bar')->getNode();
+        $this->assertEquals(new Stmt\Use_(array(
+            new Stmt\UseUse(new Name('Foo\Bar'), 'Bar')
+        )), $node);
+
+        $node = $this->createUseBuilder(new Name('Foo\Bar'))->as('XYZ')->getNode();
+        $this->assertEquals(new Stmt\Use_(array(
+            new Stmt\UseUse(new Name('Foo\Bar'), 'XYZ')
+        )), $node);
+
+        $node = $this->createUseBuilder('foo\bar', Stmt\Use_::TYPE_FUNCTION)->as('foo')->getNode();
+        $this->assertEquals(new Stmt\Use_(array(
+            new Stmt\UseUse(new Name('foo\bar'), 'foo')
+        ), Stmt\Use_::TYPE_FUNCTION), $node);
+    }
+
+    public function testNonExistingMethod() {
+        $this->setExpectedException('LogicException', 'Method "foo" does not exist');
+        $builder = $this->createUseBuilder('Test');
+        $builder->foo();
+    }
+}
diff --git a/vendor/nikic/php-parser/test/PhpParser/BuilderFactoryTest.php b/vendor/nikic/php-parser/test/PhpParser/BuilderFactoryTest.php
new file mode 100644
index 0000000000..1c3ef18dfa
--- /dev/null
+++ b/vendor/nikic/php-parser/test/PhpParser/BuilderFactoryTest.php
@@ -0,0 +1,108 @@
+assertInstanceOf($className, $factory->$methodName('test'));
+    }
+
+    public function provideTestFactory() {
+        return array(
+            array('namespace', 'PhpParser\Builder\Namespace_'),
+            array('class',     'PhpParser\Builder\Class_'),
+            array('interface', 'PhpParser\Builder\Interface_'),
+            array('trait',     'PhpParser\Builder\Trait_'),
+            array('method',    'PhpParser\Builder\Method'),
+            array('function',  'PhpParser\Builder\Function_'),
+            array('property',  'PhpParser\Builder\Property'),
+            array('param',     'PhpParser\Builder\Param'),
+            array('use',       'PhpParser\Builder\Use_'),
+        );
+    }
+
+    public function testNonExistingMethod() {
+        $this->setExpectedException('LogicException', 'Method "foo" does not exist');
+        $factory = new BuilderFactory();
+        $factory->foo();
+    }
+
+    public function testIntegration() {
+        $factory = new BuilderFactory;
+        $node = $factory->namespace('Name\Space')
+            ->addStmt($factory->use('Foo\Bar\SomeOtherClass'))
+            ->addStmt($factory->use('Foo\Bar')->as('A'))
+            ->addStmt($factory
+                ->class('SomeClass')
+                ->extend('SomeOtherClass')
+                ->implement('A\Few', '\Interfaces')
+                ->makeAbstract()
+
+                ->addStmt($factory->method('firstMethod'))
+
+                ->addStmt($factory->method('someMethod')
+                    ->makePublic()
+                    ->makeAbstract()
+                    ->addParam($factory->param('someParam')->setTypeHint('SomeClass'))
+                    ->setDocComment('/**
+                                      * This method does something.
+                                      *
+                                      * @param SomeClass And takes a parameter
+                                      */'))
+
+                ->addStmt($factory->method('anotherMethod')
+                    ->makeProtected()
+                    ->addParam($factory->param('someParam')->setDefault('test'))
+                    ->addStmt(new Expr\Print_(new Expr\Variable('someParam'))))
+
+                ->addStmt($factory->property('someProperty')->makeProtected())
+                ->addStmt($factory->property('anotherProperty')
+                    ->makePrivate()
+                    ->setDefault(array(1, 2, 3))))
+            ->getNode()
+        ;
+
+        $expected = <<<'EOC'
+prettyPrintFile($stmts);
+
+        $this->assertEquals(
+            str_replace("\r\n", "\n", $expected),
+            str_replace("\r\n", "\n", $generated)
+        );
+    }
+}
diff --git a/vendor/nikic/php-parser/test/PhpParser/CodeTestAbstract.php b/vendor/nikic/php-parser/test/PhpParser/CodeTestAbstract.php
new file mode 100644
index 0000000000..d22617e7ce
--- /dev/null
+++ b/vendor/nikic/php-parser/test/PhpParser/CodeTestAbstract.php
@@ -0,0 +1,53 @@
+getPathname());
+            $fileContents = file_get_contents($fileName);
+
+            // evaluate @@{expr}@@ expressions
+            $fileContents = preg_replace_callback(
+                '/@@\{(.*?)\}@@/',
+                array($this, 'evalCallback'),
+                $fileContents
+            );
+
+            // parse sections
+            $parts = array_map('trim', explode('-----', $fileContents));
+
+            // first part is the name
+            $name = array_shift($parts) . ' (' . $fileName . ')';
+
+            // multiple sections possible with always two forming a pair
+            foreach (array_chunk($parts, 2) as $chunk) {
+                $tests[] = array($name, $chunk[0], $chunk[1]);
+            }
+        }
+
+        return $tests;
+    }
+
+    protected function evalCallback($matches) {
+        return eval('return ' . $matches[1] . ';');
+    }
+
+    protected function canonicalize($str) {
+        // trim from both sides
+        $str = trim($str);
+
+        // normalize EOL to \n
+        $str = str_replace(array("\r\n", "\r"), "\n", $str);
+
+        // trim right side of all lines
+        return implode("\n", array_map('rtrim', explode("\n", $str)));
+    }
+}
diff --git a/vendor/nikic/php-parser/test/PhpParser/CommentTest.php b/vendor/nikic/php-parser/test/PhpParser/CommentTest.php
new file mode 100644
index 0000000000..96db6e684f
--- /dev/null
+++ b/vendor/nikic/php-parser/test/PhpParser/CommentTest.php
@@ -0,0 +1,71 @@
+assertSame('/* Some comment */', $comment->getText());
+        $this->assertSame('/* Some comment */', (string) $comment);
+        $this->assertSame(1, $comment->getLine());
+
+        $comment->setText('/* Some other comment */');
+        $comment->setLine(10);
+
+        $this->assertSame('/* Some other comment */', $comment->getText());
+        $this->assertSame('/* Some other comment */', (string) $comment);
+        $this->assertSame(10, $comment->getLine());
+    }
+
+    /**
+     * @dataProvider provideTestReformatting
+     */
+    public function testReformatting($commentText, $reformattedText) {
+        $comment = new Comment($commentText);
+        $this->assertSame($reformattedText, $comment->getReformattedText());
+    }
+
+    public function provideTestReformatting() {
+        return array(
+            array('// Some text' . "\n", '// Some text'),
+            array('/* Some text */', '/* Some text */'),
+            array(
+                '/**
+     * Some text.
+     * Some more text.
+     */',
+                '/**
+ * Some text.
+ * Some more text.
+ */'
+            ),
+            array(
+                '/*
+        Some text.
+        Some more text.
+    */',
+                '/*
+    Some text.
+    Some more text.
+*/'
+            ),
+            array(
+                '/* Some text.
+       More text.
+       Even more text. */',
+                '/* Some text.
+   More text.
+   Even more text. */'
+            ),
+            // invalid comment -> no reformatting
+            array(
+                'hallo
+    world',
+                'hallo
+    world',
+            ),
+        );
+    }
+}
\ No newline at end of file
diff --git a/vendor/nikic/php-parser/test/PhpParser/ErrorTest.php b/vendor/nikic/php-parser/test/PhpParser/ErrorTest.php
new file mode 100644
index 0000000000..021a7f8911
--- /dev/null
+++ b/vendor/nikic/php-parser/test/PhpParser/ErrorTest.php
@@ -0,0 +1,112 @@
+ 10,
+            'endLine' => 11,
+        );
+        $error = new Error('Some error', $attributes);
+
+        $this->assertSame('Some error', $error->getRawMessage());
+        $this->assertSame($attributes, $error->getAttributes());
+        $this->assertSame(10, $error->getStartLine());
+        $this->assertSame(11, $error->getEndLine());
+        $this->assertSame(10, $error->getRawLine());
+        $this->assertSame('Some error on line 10', $error->getMessage());
+
+        return $error;
+    }
+
+    /**
+     * @depends testConstruct
+     */
+    public function testSetMessageAndLine(Error $error) {
+        $error->setRawMessage('Some other error');
+        $this->assertSame('Some other error', $error->getRawMessage());
+
+        $error->setStartLine(15);
+        $this->assertSame(15, $error->getStartLine());
+        $this->assertSame('Some other error on line 15', $error->getMessage());
+
+        $error->setRawLine(17);
+        $this->assertSame(17, $error->getRawLine());
+        $this->assertSame('Some other error on line 17', $error->getMessage());
+    }
+
+    public function testUnknownLine() {
+        $error = new Error('Some error');
+
+        $this->assertSame(-1, $error->getStartLine());
+        $this->assertSame(-1, $error->getEndLine());
+        $this->assertSame(-1, $error->getRawLine());
+        $this->assertSame('Some error on unknown line', $error->getMessage());
+    }
+
+    /** @dataProvider provideTestColumnInfo */
+    public function testColumnInfo($code, $startPos, $endPos, $startColumn, $endColumn) {
+        $error = new Error('Some error', array(
+            'startFilePos' => $startPos,
+            'endFilePos' => $endPos,
+        ));
+
+        $this->assertSame(true, $error->hasColumnInfo());
+        $this->assertSame($startColumn, $error->getStartColumn($code));
+        $this->assertSame($endColumn, $error->getEndColumn($code));
+
+    }
+
+    public function provideTestColumnInfo() {
+        return array(
+            // Error at "bar"
+            array("assertSame(false, $error->hasColumnInfo());
+        try {
+            $error->getStartColumn('');
+            $this->fail('Expected RuntimeException');
+        } catch (\RuntimeException $e) {
+            $this->assertSame('Error does not have column information', $e->getMessage());
+        }
+        try {
+            $error->getEndColumn('');
+            $this->fail('Expected RuntimeException');
+        } catch (\RuntimeException $e) {
+            $this->assertSame('Error does not have column information', $e->getMessage());
+        }
+    }
+
+    /**
+     * @expectedException \RuntimeException
+     * @expectedExceptionMessage Invalid position information
+     */
+    public function testInvalidPosInfo() {
+        $error = new Error('Some error', array(
+            'startFilePos' => 10,
+            'endFilePos' => 11,
+        ));
+        $error->getStartColumn('code');
+    }
+}
diff --git a/vendor/nikic/php-parser/test/PhpParser/Lexer/EmulativeTest.php b/vendor/nikic/php-parser/test/PhpParser/Lexer/EmulativeTest.php
new file mode 100644
index 0000000000..7743428c98
--- /dev/null
+++ b/vendor/nikic/php-parser/test/PhpParser/Lexer/EmulativeTest.php
@@ -0,0 +1,133 @@
+getLexer();
+        $lexer->startLexing('assertSame($expectedToken, $lexer->getNextToken());
+        $this->assertSame(0, $lexer->getNextToken());
+    }
+
+    /**
+     * @dataProvider provideTestReplaceKeywords
+     */
+    public function testNoReplaceKeywordsAfterObjectOperator($keyword) {
+        $lexer = $this->getLexer();
+        $lexer->startLexing('' . $keyword);
+
+        $this->assertSame(Parser::T_OBJECT_OPERATOR, $lexer->getNextToken());
+        $this->assertSame(Parser::T_STRING, $lexer->getNextToken());
+        $this->assertSame(0, $lexer->getNextToken());
+    }
+
+    public function provideTestReplaceKeywords() {
+        return array(
+            // PHP 5.5
+            array('finally',       Parser::T_FINALLY),
+            array('yield',         Parser::T_YIELD),
+
+            // PHP 5.4
+            array('callable',      Parser::T_CALLABLE),
+            array('insteadof',     Parser::T_INSTEADOF),
+            array('trait',         Parser::T_TRAIT),
+            array('__TRAIT__',     Parser::T_TRAIT_C),
+
+            // PHP 5.3
+            array('__DIR__',       Parser::T_DIR),
+            array('goto',          Parser::T_GOTO),
+            array('namespace',     Parser::T_NAMESPACE),
+            array('__NAMESPACE__', Parser::T_NS_C),
+        );
+    }
+
+    /**
+     * @dataProvider provideTestLexNewFeatures
+     */
+    public function testLexNewFeatures($code, array $expectedTokens) {
+        $lexer = $this->getLexer();
+        $lexer->startLexing('assertSame($expectedTokenType, $lexer->getNextToken($text));
+            $this->assertSame($expectedTokenText, $text);
+        }
+        $this->assertSame(0, $lexer->getNextToken());
+    }
+
+    /**
+     * @dataProvider provideTestLexNewFeatures
+     */
+    public function testLeaveStuffAloneInStrings($code) {
+        $stringifiedToken = '"' . addcslashes($code, '"\\') . '"';
+
+        $lexer = $this->getLexer();
+        $lexer->startLexing('assertSame(Parser::T_CONSTANT_ENCAPSED_STRING, $lexer->getNextToken($text));
+        $this->assertSame($stringifiedToken, $text);
+        $this->assertSame(0, $lexer->getNextToken());
+    }
+
+    public function provideTestLexNewFeatures() {
+        return array(
+            array('yield from', array(
+                array(Parser::T_YIELD_FROM, 'yield from'),
+            )),
+            array("yield\r\nfrom", array(
+                array(Parser::T_YIELD_FROM, "yield\r\nfrom"),
+            )),
+            array('...', array(
+                array(Parser::T_ELLIPSIS, '...'),
+            )),
+            array('**', array(
+                array(Parser::T_POW, '**'),
+            )),
+            array('**=', array(
+                array(Parser::T_POW_EQUAL, '**='),
+            )),
+            array('??', array(
+                array(Parser::T_COALESCE, '??'),
+            )),
+            array('<=>', array(
+                array(Parser::T_SPACESHIP, '<=>'),
+            )),
+            array('0b1010110', array(
+                array(Parser::T_LNUMBER, '0b1010110'),
+            )),
+            array('0b1011010101001010110101010010101011010101010101101011001110111100', array(
+                array(Parser::T_DNUMBER, '0b1011010101001010110101010010101011010101010101101011001110111100'),
+            )),
+            array('\\', array(
+                array(Parser::T_NS_SEPARATOR, '\\'),
+            )),
+            array("<<<'NOWDOC'\nNOWDOC;\n", array(
+                array(Parser::T_START_HEREDOC, "<<<'NOWDOC'\n"),
+                array(Parser::T_END_HEREDOC, 'NOWDOC'),
+                array(ord(';'), ';'),
+            )),
+            array("<<<'NOWDOC'\nFoobar\nNOWDOC;\n", array(
+                array(Parser::T_START_HEREDOC, "<<<'NOWDOC'\n"),
+                array(Parser::T_ENCAPSED_AND_WHITESPACE, "Foobar\n"),
+                array(Parser::T_END_HEREDOC, 'NOWDOC'),
+                array(ord(';'), ';'),
+            )),
+        );
+    }
+}
diff --git a/vendor/nikic/php-parser/test/PhpParser/LexerTest.php b/vendor/nikic/php-parser/test/PhpParser/LexerTest.php
new file mode 100644
index 0000000000..5b20989751
--- /dev/null
+++ b/vendor/nikic/php-parser/test/PhpParser/LexerTest.php
@@ -0,0 +1,246 @@
+markTestSkipped('HHVM does not throw warnings from token_get_all()');
+        }
+
+        $lexer = $this->getLexer();
+        try {
+            $lexer->startLexing($code);
+        } catch (Error $e) {
+            $this->assertSame($message, $e->getMessage());
+
+            return;
+        }
+
+        $this->fail('Expected PhpParser\Error');
+    }
+
+    public function provideTestError() {
+        return array(
+            array('getLexer($options);
+        $lexer->startLexing($code);
+        while ($id = $lexer->getNextToken($value, $startAttributes, $endAttributes)) {
+            $token = array_shift($tokens);
+
+            $this->assertSame($token[0], $id);
+            $this->assertSame($token[1], $value);
+            $this->assertEquals($token[2], $startAttributes);
+            $this->assertEquals($token[3], $endAttributes);
+        }
+    }
+
+    public function provideTestLex() {
+        return array(
+            // tests conversion of closing PHP tag and drop of whitespace and opening tags
+            array(
+                'plaintext',
+                array(),
+                array(
+                    array(
+                        Parser::T_STRING, 'tokens',
+                        array('startLine' => 1), array('endLine' => 1)
+                    ),
+                    array(
+                        ord(';'), '?>',
+                        array('startLine' => 1), array('endLine' => 1)
+                    ),
+                    array(
+                        Parser::T_INLINE_HTML, 'plaintext',
+                        array('startLine' => 1), array('endLine' => 1)
+                    ),
+                )
+            ),
+            // tests line numbers
+            array(
+                ' 2), array('endLine' => 2)
+                    ),
+                    array(
+                        Parser::T_STRING, 'token',
+                        array('startLine' => 2), array('endLine' => 2)
+                    ),
+                    array(
+                        ord('$'), '$',
+                        array(
+                            'startLine' => 3,
+                            'comments' => array(new Comment\Doc('/** doc' . "\n" . 'comment */', 2))
+                        ),
+                        array('endLine' => 3)
+                    ),
+                )
+            ),
+            // tests comment extraction
+            array(
+                ' 2,
+                            'comments' => array(
+                                new Comment('/* comment */', 1),
+                                new Comment('// comment' . "\n", 1),
+                                new Comment\Doc('/** docComment 1 */', 2),
+                                new Comment\Doc('/** docComment 2 */', 2),
+                            ),
+                        ),
+                        array('endLine' => 2)
+                    ),
+                )
+            ),
+            // tests differing start and end line
+            array(
+                ' 1), array('endLine' => 2)
+                    ),
+                )
+            ),
+            // tests exact file offsets
+            array(
+                ' array('startFilePos', 'endFilePos')),
+                array(
+                    array(
+                        Parser::T_CONSTANT_ENCAPSED_STRING, '"a"',
+                        array('startFilePos' => 6), array('endFilePos' => 8)
+                    ),
+                    array(
+                        ord(';'), ';',
+                        array('startFilePos' => 9), array('endFilePos' => 9)
+                    ),
+                    array(
+                        Parser::T_CONSTANT_ENCAPSED_STRING, '"b"',
+                        array('startFilePos' => 18), array('endFilePos' => 20)
+                    ),
+                    array(
+                        ord(';'), ';',
+                        array('startFilePos' => 21), array('endFilePos' => 21)
+                    ),
+                )
+            ),
+            // tests token offsets
+            array(
+                ' array('startTokenPos', 'endTokenPos')),
+                array(
+                    array(
+                        Parser::T_CONSTANT_ENCAPSED_STRING, '"a"',
+                        array('startTokenPos' => 1), array('endTokenPos' => 1)
+                    ),
+                    array(
+                        ord(';'), ';',
+                        array('startTokenPos' => 2), array('endTokenPos' => 2)
+                    ),
+                    array(
+                        Parser::T_CONSTANT_ENCAPSED_STRING, '"b"',
+                        array('startTokenPos' => 5), array('endTokenPos' => 5)
+                    ),
+                    array(
+                        ord(';'), ';',
+                        array('startTokenPos' => 6), array('endTokenPos' => 6)
+                    ),
+                )
+            ),
+            // tests all attributes being disabled
+            array(
+                ' array()),
+                array(
+                    array(
+                        Parser::T_VARIABLE, '$bar',
+                        array(), array()
+                    ),
+                    array(
+                        ord(';'), ';',
+                        array(), array()
+                    )
+                )
+            )
+        );
+    }
+
+    /**
+     * @dataProvider provideTestHaltCompiler
+     */
+    public function testHandleHaltCompiler($code, $remaining) {
+        $lexer = $this->getLexer();
+        $lexer->startLexing($code);
+
+        while (Parser::T_HALT_COMPILER !== $lexer->getNextToken());
+
+        $this->assertSame($remaining, $lexer->handleHaltCompiler());
+        $this->assertSame(0, $lexer->getNextToken());
+    }
+
+    public function provideTestHaltCompiler() {
+        return array(
+            array('Remaining Text', 'Remaining Text'),
+            //array('getLexer();
+        $lexer->startLexing('getNextToken());
+        $lexer->handleHaltCompiler();
+    }
+
+    public function testGetTokens() {
+        $code = 'getLexer();
+        $lexer->startLexing($code);
+        $this->assertSame($expectedTokens, $lexer->getTokens());
+    }
+}
diff --git a/vendor/nikic/php-parser/test/PhpParser/Node/NameTest.php b/vendor/nikic/php-parser/test/PhpParser/Node/NameTest.php
new file mode 100644
index 0000000000..1b20ae3b6b
--- /dev/null
+++ b/vendor/nikic/php-parser/test/PhpParser/Node/NameTest.php
@@ -0,0 +1,132 @@
+assertSame(array('foo', 'bar'), $name->parts);
+
+        $name = new Name('foo\bar');
+        $this->assertSame(array('foo', 'bar'), $name->parts);
+    }
+
+    public function testGet() {
+        $name = new Name('foo');
+        $this->assertSame('foo', $name->getFirst());
+        $this->assertSame('foo', $name->getLast());
+
+        $name = new Name('foo\bar');
+        $this->assertSame('foo', $name->getFirst());
+        $this->assertSame('bar', $name->getLast());
+    }
+
+    public function testToString() {
+        $name = new Name('foo\bar');
+
+        $this->assertSame('foo\bar', (string) $name);
+        $this->assertSame('foo\bar', $name->toString());
+        $this->assertSame('foo_bar', $name->toString('_'));
+    }
+
+    public function testSet() {
+        $name = new Name('foo');
+
+        $name->set('foo\bar');
+        $this->assertSame('foo\bar', $name->toString());
+
+        $name->set(array('foo', 'bar'));
+        $this->assertSame('foo\bar', $name->toString());
+
+        $name->set(new Name('foo\bar'));
+        $this->assertSame('foo\bar', $name->toString());
+    }
+
+    public function testSetFirst() {
+        $name = new Name('foo');
+
+        $name->setFirst('bar');
+        $this->assertSame('bar', $name->toString());
+
+        $name->setFirst('A\B');
+        $this->assertSame('A\B', $name->toString());
+
+        $name->setFirst('C');
+        $this->assertSame('C\B', $name->toString());
+
+        $name->setFirst('D\E');
+        $this->assertSame('D\E\B', $name->toString());
+    }
+
+    public function testSetLast() {
+        $name = new Name('foo');
+
+        $name->setLast('bar');
+        $this->assertSame('bar', $name->toString());
+
+        $name->setLast('A\B');
+        $this->assertSame('A\B', $name->toString());
+
+        $name->setLast('C');
+        $this->assertSame('A\C', $name->toString());
+
+        $name->setLast('D\E');
+        $this->assertSame('A\D\E', $name->toString());
+    }
+
+    public function testAppend() {
+        $name = new Name('foo');
+
+        $name->append('bar');
+        $this->assertSame('foo\bar', $name->toString());
+
+        $name->append('bar\foo');
+        $this->assertSame('foo\bar\bar\foo', $name->toString());
+    }
+
+    public function testPrepend() {
+        $name = new Name('foo');
+
+        $name->prepend('bar');
+        $this->assertSame('bar\foo', $name->toString());
+
+        $name->prepend('foo\bar');
+        $this->assertSame('foo\bar\bar\foo', $name->toString());
+    }
+
+    public function testIs() {
+        $name = new Name('foo');
+        $this->assertTrue ($name->isUnqualified());
+        $this->assertFalse($name->isQualified());
+        $this->assertFalse($name->isFullyQualified());
+        $this->assertFalse($name->isRelative());
+
+        $name = new Name('foo\bar');
+        $this->assertFalse($name->isUnqualified());
+        $this->assertTrue ($name->isQualified());
+        $this->assertFalse($name->isFullyQualified());
+        $this->assertFalse($name->isRelative());
+
+        $name = new Name\FullyQualified('foo');
+        $this->assertFalse($name->isUnqualified());
+        $this->assertFalse($name->isQualified());
+        $this->assertTrue ($name->isFullyQualified());
+        $this->assertFalse($name->isRelative());
+
+        $name = new Name\Relative('foo');
+        $this->assertFalse($name->isUnqualified());
+        $this->assertFalse($name->isQualified());
+        $this->assertFalse($name->isFullyQualified());
+        $this->assertTrue ($name->isRelative());
+    }
+
+    /**
+     * @expectedException        \InvalidArgumentException
+     * @expectedExceptionMessage When changing a name you need to pass either a string, an array or a Name node
+     */
+    public function testInvalidArg() {
+        $name = new Name('foo');
+        $name->set(new \stdClass);
+    }
+}
\ No newline at end of file
diff --git a/vendor/nikic/php-parser/test/PhpParser/Node/Scalar/MagicConstTest.php b/vendor/nikic/php-parser/test/PhpParser/Node/Scalar/MagicConstTest.php
new file mode 100644
index 0000000000..3141f563d1
--- /dev/null
+++ b/vendor/nikic/php-parser/test/PhpParser/Node/Scalar/MagicConstTest.php
@@ -0,0 +1,25 @@
+assertSame($name, $magicConst->getName());
+    }
+
+    public function provideTestGetName() {
+        return array(
+            array(new MagicConst\Class_, '__CLASS__'),
+            array(new MagicConst\Dir, '__DIR__'),
+            array(new MagicConst\File, '__FILE__'),
+            array(new MagicConst\Function_, '__FUNCTION__'),
+            array(new MagicConst\Line, '__LINE__'),
+            array(new MagicConst\Method, '__METHOD__'),
+            array(new MagicConst\Namespace_, '__NAMESPACE__'),
+            array(new MagicConst\Trait_, '__TRAIT__'),
+        );
+    }
+}
\ No newline at end of file
diff --git a/vendor/nikic/php-parser/test/PhpParser/Node/Scalar/StringTest.php b/vendor/nikic/php-parser/test/PhpParser/Node/Scalar/StringTest.php
new file mode 100644
index 0000000000..be39035782
--- /dev/null
+++ b/vendor/nikic/php-parser/test/PhpParser/Node/Scalar/StringTest.php
@@ -0,0 +1,61 @@
+assertSame(
+            $expected,
+            String_::parseEscapeSequences($string, $quote)
+        );
+    }
+
+    /**
+     * @dataProvider provideTestParse
+     */
+    public function testCreate($expected, $string) {
+        $this->assertSame(
+            $expected,
+            String_::parse($string)
+        );
+    }
+
+    public function provideTestParseEscapeSequences() {
+        return array(
+            array('"',              '\\"',              '"'),
+            array('\\"',            '\\"',              '`'),
+            array('\\"\\`',         '\\"\\`',           null),
+            array("\\\$\n\r\t\f\v", '\\\\\$\n\r\t\f\v', null),
+            array("\x1B",           '\e',               null),
+            array(chr(255),         '\xFF',             null),
+            array(chr(255),         '\377',             null),
+            array(chr(0),           '\400',             null),
+            array("\0",             '\0',               null),
+            array('\xFF',           '\\\\xFF',          null),
+        );
+    }
+
+    public function provideTestParse() {
+        $tests = array(
+            array('A', '\'A\''),
+            array('A', 'b\'A\''),
+            array('A', '"A"'),
+            array('A', 'b"A"'),
+            array('\\', '\'\\\\\''),
+            array('\'', '\'\\\'\''),
+        );
+
+        foreach ($this->provideTestParseEscapeSequences() as $i => $test) {
+            // skip second and third tests, they aren't for double quotes
+            if ($i != 1 && $i != 2) {
+                $tests[] = array($test[0], '"' . $test[1] . '"');
+            }
+        }
+
+        return $tests;
+    }
+}
diff --git a/vendor/nikic/php-parser/test/PhpParser/Node/Stmt/ClassMethodTest.php b/vendor/nikic/php-parser/test/PhpParser/Node/Stmt/ClassMethodTest.php
new file mode 100644
index 0000000000..fa8aed8088
--- /dev/null
+++ b/vendor/nikic/php-parser/test/PhpParser/Node/Stmt/ClassMethodTest.php
@@ -0,0 +1,63 @@
+ constant('PhpParser\Node\Stmt\Class_::MODIFIER_' . strtoupper($modifier))
+        ));
+
+        $this->assertTrue($node->{'is' . $modifier}());
+    }
+
+    public function testNoModifiers() {
+        $node = new ClassMethod('foo', array('type' => 0));
+
+        $this->assertTrue($node->isPublic());
+        $this->assertFalse($node->isProtected());
+        $this->assertFalse($node->isPrivate());
+        $this->assertFalse($node->isAbstract());
+        $this->assertFalse($node->isFinal());
+        $this->assertFalse($node->isStatic());
+    }
+
+    public function provideModifiers() {
+        return array(
+            array('public'),
+            array('protected'),
+            array('private'),
+            array('abstract'),
+            array('final'),
+            array('static'),
+        );
+    }
+
+    /**
+     * Checks that implicit public modifier detection for method is working
+     *
+     * @dataProvider implicitPublicModifiers
+     *
+     * @param integer $modifier Node type modifier
+     */
+    public function testImplicitPublic($modifier)
+    {
+        $node = new ClassMethod('foo', array(
+            'type' => constant('PhpParser\Node\Stmt\Class_::MODIFIER_' . strtoupper($modifier))
+        ));
+
+        $this->assertTrue($node->isPublic(), 'Node should be implicitly public');
+    }
+
+    public function implicitPublicModifiers() {
+        return array(
+            array('abstract'),
+            array('final'),
+            array('static'),
+        );
+    }
+}
diff --git a/vendor/nikic/php-parser/test/PhpParser/Node/Stmt/ClassTest.php b/vendor/nikic/php-parser/test/PhpParser/Node/Stmt/ClassTest.php
new file mode 100644
index 0000000000..643b15cb1c
--- /dev/null
+++ b/vendor/nikic/php-parser/test/PhpParser/Node/Stmt/ClassTest.php
@@ -0,0 +1,59 @@
+ Class_::MODIFIER_ABSTRACT));
+        $this->assertTrue($class->isAbstract());
+
+        $class = new Class_('Foo');
+        $this->assertFalse($class->isAbstract());
+    }
+
+    public function testIsFinal() {
+        $class = new Class_('Foo', array('type' => Class_::MODIFIER_FINAL));
+        $this->assertTrue($class->isFinal());
+
+        $class = new Class_('Foo');
+        $this->assertFalse($class->isFinal());
+    }
+
+    public function testGetMethods() {
+        $methods = array(
+            new ClassMethod('foo'),
+            new ClassMethod('bar'),
+            new ClassMethod('fooBar'),
+        );
+        $class = new Class_('Foo', array(
+            'stmts' => array(
+                new TraitUse(array()),
+                $methods[0],
+                new ClassConst(array()),
+                $methods[1],
+                new Property(0, array()),
+                $methods[2],
+            )
+        ));
+
+        $this->assertSame($methods, $class->getMethods());
+    }
+
+    public function testGetMethod() {
+        $methodConstruct = new ClassMethod('__CONSTRUCT');
+        $methodTest = new ClassMethod('test');
+        $class = new Class_('Foo', array(
+            'stmts' => array(
+                new ClassConst(array()),
+                $methodConstruct,
+                new Property(0, array()),
+                $methodTest,
+            )
+        ));
+
+        $this->assertSame($methodConstruct, $class->getMethod('__construct'));
+        $this->assertSame($methodTest, $class->getMethod('test'));
+        $this->assertNull($class->getMethod('nonExisting'));
+    }
+}
diff --git a/vendor/nikic/php-parser/test/PhpParser/Node/Stmt/InterfaceTest.php b/vendor/nikic/php-parser/test/PhpParser/Node/Stmt/InterfaceTest.php
new file mode 100644
index 0000000000..c499058265
--- /dev/null
+++ b/vendor/nikic/php-parser/test/PhpParser/Node/Stmt/InterfaceTest.php
@@ -0,0 +1,26 @@
+ array(
+                new Node\Stmt\ClassConst(array(new Node\Const_('C1', new Node\Scalar\String_('C1')))),
+                $methods[0],
+                new Node\Stmt\ClassConst(array(new Node\Const_('C2', new Node\Scalar\String_('C2')))),
+                $methods[1],
+                new Node\Stmt\ClassConst(array(new Node\Const_('C3', new Node\Scalar\String_('C3')))),
+            )
+        ));
+
+        $this->assertSame($methods, $interface->getMethods());
+    }
+}
diff --git a/vendor/nikic/php-parser/test/PhpParser/Node/Stmt/PropertyTest.php b/vendor/nikic/php-parser/test/PhpParser/Node/Stmt/PropertyTest.php
new file mode 100644
index 0000000000..bcfc0c6bd7
--- /dev/null
+++ b/vendor/nikic/php-parser/test/PhpParser/Node/Stmt/PropertyTest.php
@@ -0,0 +1,44 @@
+assertTrue($node->{'is' . $modifier}());
+    }
+
+    public function testNoModifiers() {
+        $node = new Property(0, array());
+
+        $this->assertTrue($node->isPublic());
+        $this->assertFalse($node->isProtected());
+        $this->assertFalse($node->isPrivate());
+        $this->assertFalse($node->isStatic());
+    }
+
+    public function testStaticImplicitlyPublic() {
+        $node = new Property(Class_::MODIFIER_STATIC, array());
+        $this->assertTrue($node->isPublic());
+        $this->assertFalse($node->isProtected());
+        $this->assertFalse($node->isPrivate());
+        $this->assertTrue($node->isStatic());
+    }
+
+    public function provideModifiers() {
+        return array(
+            array('public'),
+            array('protected'),
+            array('private'),
+            array('static'),
+        );
+    }
+}
diff --git a/vendor/nikic/php-parser/test/PhpParser/NodeAbstractTest.php b/vendor/nikic/php-parser/test/PhpParser/NodeAbstractTest.php
new file mode 100644
index 0000000000..dc2e6f71a9
--- /dev/null
+++ b/vendor/nikic/php-parser/test/PhpParser/NodeAbstractTest.php
@@ -0,0 +1,161 @@
+subNode1 = $subNode1;
+        $this->subNode2 = $subNode2;
+    }
+
+    public function getSubNodeNames() {
+        return array('subNode1', 'subNode2');
+    }
+
+    // This method is only overwritten because the node is located in an unusual namespace
+    public function getType() {
+        return 'Dummy';
+    }
+}
+
+class NodeAbstractTest extends \PHPUnit_Framework_TestCase
+{
+    public function provideNodes() {
+        $attributes = array(
+            'startLine' => 10,
+            'comments'  => array(
+                new Comment('// Comment' . "\n"),
+                new Comment\Doc('/** doc comment */'),
+            ),
+        );
+
+        $node1 = $this->getMockForAbstractClass(
+            'PhpParser\NodeAbstract',
+            array(
+                array(
+                    'subNode1' => 'value1',
+                    'subNode2' => 'value2',
+                ),
+                $attributes
+            ),
+            'PhpParser_Node_Dummy'
+        );
+        $node1->notSubNode = 'value3';
+
+        $node2 = new DummyNode('value1', 'value2', $attributes);
+        $node2->notSubNode = 'value3';
+
+        return array(
+            array($attributes, $node1),
+            array($attributes, $node2),
+        );
+    }
+
+    /**
+     * @dataProvider provideNodes
+     */
+    public function testConstruct(array $attributes, Node $node) {
+        $this->assertSame('Dummy', $node->getType());
+        $this->assertSame(array('subNode1', 'subNode2'), $node->getSubNodeNames());
+        $this->assertSame(10, $node->getLine());
+        $this->assertSame('/** doc comment */', $node->getDocComment()->getText());
+        $this->assertSame('value1', $node->subNode1);
+        $this->assertSame('value2', $node->subNode2);
+        $this->assertTrue(isset($node->subNode1));
+        $this->assertTrue(isset($node->subNode2));
+        $this->assertFalse(isset($node->subNode3));
+        $this->assertSame($attributes, $node->getAttributes());
+
+        return $node;
+    }
+
+    /**
+     * @dataProvider provideNodes
+     */
+    public function testGetDocComment(array $attributes, Node $node) {
+        $this->assertSame('/** doc comment */', $node->getDocComment()->getText());
+        array_pop($node->getAttribute('comments')); // remove doc comment
+        $this->assertNull($node->getDocComment());
+        array_pop($node->getAttribute('comments')); // remove comment
+        $this->assertNull($node->getDocComment());
+    }
+
+    /**
+     * @dataProvider provideNodes
+     */
+    public function testChange(array $attributes, Node $node) {
+        // change of line
+        $node->setLine(15);
+        $this->assertSame(15, $node->getLine());
+
+        // direct modification
+        $node->subNode = 'newValue';
+        $this->assertSame('newValue', $node->subNode);
+
+        // indirect modification
+        $subNode =& $node->subNode;
+        $subNode = 'newNewValue';
+        $this->assertSame('newNewValue', $node->subNode);
+
+        // removal
+        unset($node->subNode);
+        $this->assertFalse(isset($node->subNode));
+    }
+
+    /**
+     * @dataProvider provideNodes
+     */
+    public function testIteration(array $attributes, Node $node) {
+        // Iteration is simple object iteration over properties,
+        // not over subnodes
+        $i = 0;
+        foreach ($node as $key => $value) {
+            if ($i === 0) {
+                $this->assertSame('subNode1', $key);
+                $this->assertSame('value1', $value);
+            } else if ($i === 1) {
+                $this->assertSame('subNode2', $key);
+                $this->assertSame('value2', $value);
+            } else if ($i === 2) {
+                $this->assertSame('notSubNode', $key);
+                $this->assertSame('value3', $value);
+            } else {
+                throw new \Exception;
+            }
+            $i++;
+        }
+        $this->assertSame(3, $i);
+    }
+
+    public function testAttributes() {
+        /** @var $node Node */
+        $node = $this->getMockForAbstractClass('PhpParser\NodeAbstract');
+
+        $this->assertEmpty($node->getAttributes());
+
+        $node->setAttribute('key', 'value');
+        $this->assertTrue($node->hasAttribute('key'));
+        $this->assertSame('value', $node->getAttribute('key'));
+
+        $this->assertFalse($node->hasAttribute('doesNotExist'));
+        $this->assertNull($node->getAttribute('doesNotExist'));
+        $this->assertSame('default', $node->getAttribute('doesNotExist', 'default'));
+
+        $node->setAttribute('null', null);
+        $this->assertTrue($node->hasAttribute('null'));
+        $this->assertNull($node->getAttribute('null'));
+        $this->assertNull($node->getAttribute('null', 'default'));
+
+        $this->assertSame(
+            array(
+                'key'  => 'value',
+                'null' => null,
+            ),
+            $node->getAttributes()
+        );
+    }
+}
diff --git a/vendor/nikic/php-parser/test/PhpParser/NodeDumperTest.php b/vendor/nikic/php-parser/test/PhpParser/NodeDumperTest.php
new file mode 100644
index 0000000000..306bc20d54
--- /dev/null
+++ b/vendor/nikic/php-parser/test/PhpParser/NodeDumperTest.php
@@ -0,0 +1,72 @@
+assertSame($this->canonicalize($dump), $this->canonicalize($dumper->dump($node)));
+    }
+
+    public function provideTestDump() {
+        return array(
+            array(
+                array(),
+'array(
+)'
+            ),
+            array(
+                array('Foo', 'Bar', 'Key' => 'FooBar'),
+'array(
+    0: Foo
+    1: Bar
+    Key: FooBar
+)'
+            ),
+            array(
+                new Node\Name(array('Hallo', 'World')),
+'Name(
+    parts: array(
+        0: Hallo
+        1: World
+    )
+)'
+            ),
+            array(
+                new Node\Expr\Array_(array(
+                    new Node\Expr\ArrayItem(new Node\Scalar\String_('Foo'))
+                )),
+'Expr_Array(
+    items: array(
+        0: Expr_ArrayItem(
+            key: null
+            value: Scalar_String(
+                value: Foo
+            )
+            byRef: false
+        )
+    )
+)'
+            ),
+        );
+    }
+
+    /**
+     * @expectedException        \InvalidArgumentException
+     * @expectedExceptionMessage Can only dump nodes and arrays.
+     */
+    public function testError() {
+        $dumper = new NodeDumper;
+        $dumper->dump(new \stdClass);
+    }
+}
diff --git a/vendor/nikic/php-parser/test/PhpParser/NodeTraverserTest.php b/vendor/nikic/php-parser/test/PhpParser/NodeTraverserTest.php
new file mode 100644
index 0000000000..3b702ea70a
--- /dev/null
+++ b/vendor/nikic/php-parser/test/PhpParser/NodeTraverserTest.php
@@ -0,0 +1,203 @@
+getMock('PhpParser\NodeVisitor');
+
+        $visitor->expects($this->at(0))->method('beforeTraverse')->with($stmts);
+        $visitor->expects($this->at(1))->method('enterNode')->with($echoNode);
+        $visitor->expects($this->at(2))->method('enterNode')->with($str1Node);
+        $visitor->expects($this->at(3))->method('leaveNode')->with($str1Node);
+        $visitor->expects($this->at(4))->method('enterNode')->with($str2Node);
+        $visitor->expects($this->at(5))->method('leaveNode')->with($str2Node);
+        $visitor->expects($this->at(6))->method('leaveNode')->with($echoNode);
+        $visitor->expects($this->at(7))->method('afterTraverse')->with($stmts);
+
+        $traverser = new NodeTraverser;
+        $traverser->addVisitor($visitor);
+
+        $this->assertEquals($stmts, $traverser->traverse($stmts));
+    }
+
+    public function testModifying() {
+        $str1Node  = new String_('Foo');
+        $str2Node  = new String_('Bar');
+        $printNode = new Expr\Print_($str1Node);
+
+        // first visitor changes the node, second verifies the change
+        $visitor1 = $this->getMock('PhpParser\NodeVisitor');
+        $visitor2 = $this->getMock('PhpParser\NodeVisitor');
+
+        // replace empty statements with string1 node
+        $visitor1->expects($this->at(0))->method('beforeTraverse')->with(array())
+                 ->will($this->returnValue(array($str1Node)));
+        $visitor2->expects($this->at(0))->method('beforeTraverse')->with(array($str1Node));
+
+        // replace string1 node with print node
+        $visitor1->expects($this->at(1))->method('enterNode')->with($str1Node)
+                 ->will($this->returnValue($printNode));
+        $visitor2->expects($this->at(1))->method('enterNode')->with($printNode);
+
+        // replace string1 node with string2 node
+        $visitor1->expects($this->at(2))->method('enterNode')->with($str1Node)
+                 ->will($this->returnValue($str2Node));
+        $visitor2->expects($this->at(2))->method('enterNode')->with($str2Node);
+
+        // replace string2 node with string1 node again
+        $visitor1->expects($this->at(3))->method('leaveNode')->with($str2Node)
+                 ->will($this->returnValue($str1Node));
+        $visitor2->expects($this->at(3))->method('leaveNode')->with($str1Node);
+
+        // replace print node with string1 node again
+        $visitor1->expects($this->at(4))->method('leaveNode')->with($printNode)
+                 ->will($this->returnValue($str1Node));
+        $visitor2->expects($this->at(4))->method('leaveNode')->with($str1Node);
+
+        // replace string1 node with empty statements again
+        $visitor1->expects($this->at(5))->method('afterTraverse')->with(array($str1Node))
+                 ->will($this->returnValue(array()));
+        $visitor2->expects($this->at(5))->method('afterTraverse')->with(array());
+
+        $traverser = new NodeTraverser;
+        $traverser->addVisitor($visitor1);
+        $traverser->addVisitor($visitor2);
+
+        // as all operations are reversed we end where we start
+        $this->assertEquals(array(), $traverser->traverse(array()));
+    }
+
+    public function testRemove() {
+        $str1Node = new String_('Foo');
+        $str2Node = new String_('Bar');
+
+        $visitor = $this->getMock('PhpParser\NodeVisitor');
+
+        // remove the string1 node, leave the string2 node
+        $visitor->expects($this->at(2))->method('leaveNode')->with($str1Node)
+                ->will($this->returnValue(false));
+
+        $traverser = new NodeTraverser;
+        $traverser->addVisitor($visitor);
+
+        $this->assertEquals(array($str2Node), $traverser->traverse(array($str1Node, $str2Node)));
+    }
+
+    public function testMerge() {
+        $strStart  = new String_('Start');
+        $strMiddle = new String_('End');
+        $strEnd    = new String_('Middle');
+        $strR1     = new String_('Replacement 1');
+        $strR2     = new String_('Replacement 2');
+
+        $visitor = $this->getMock('PhpParser\NodeVisitor');
+
+        // replace strMiddle with strR1 and strR2 by merge
+        $visitor->expects($this->at(4))->method('leaveNode')->with($strMiddle)
+                ->will($this->returnValue(array($strR1, $strR2)));
+
+        $traverser = new NodeTraverser;
+        $traverser->addVisitor($visitor);
+
+        $this->assertEquals(
+            array($strStart, $strR1, $strR2, $strEnd),
+            $traverser->traverse(array($strStart, $strMiddle, $strEnd))
+        );
+    }
+
+    public function testDeepArray() {
+        $strNode = new String_('Foo');
+        $stmts = array(array(array($strNode)));
+
+        $visitor = $this->getMock('PhpParser\NodeVisitor');
+        $visitor->expects($this->at(1))->method('enterNode')->with($strNode);
+
+        $traverser = new NodeTraverser;
+        $traverser->addVisitor($visitor);
+
+        $this->assertEquals($stmts, $traverser->traverse($stmts));
+    }
+
+    public function testDontTraverseChildren() {
+        $strNode = new String_('str');
+        $printNode = new Expr\Print_($strNode);
+        $varNode = new Expr\Variable('foo');
+        $mulNode = new Expr\BinaryOp\Mul($varNode, $varNode);
+        $negNode = new Expr\UnaryMinus($mulNode);
+        $stmts = array($printNode, $negNode);
+
+        $visitor1 = $this->getMock('PhpParser\NodeVisitor');
+        $visitor2 = $this->getMock('PhpParser\NodeVisitor');
+
+        $visitor1->expects($this->at(1))->method('enterNode')->with($printNode)
+            ->will($this->returnValue(NodeTraverser::DONT_TRAVERSE_CHILDREN));
+        $visitor2->expects($this->at(1))->method('enterNode')->with($printNode);
+
+        $visitor1->expects($this->at(2))->method('leaveNode')->with($printNode);
+        $visitor2->expects($this->at(2))->method('leaveNode')->with($printNode);
+
+        $visitor1->expects($this->at(3))->method('enterNode')->with($negNode);
+        $visitor2->expects($this->at(3))->method('enterNode')->with($negNode);
+
+        $visitor1->expects($this->at(4))->method('enterNode')->with($mulNode);
+        $visitor2->expects($this->at(4))->method('enterNode')->with($mulNode)
+            ->will($this->returnValue(NodeTraverser::DONT_TRAVERSE_CHILDREN));
+
+        $visitor1->expects($this->at(5))->method('leaveNode')->with($mulNode);
+        $visitor2->expects($this->at(5))->method('leaveNode')->with($mulNode);
+
+        $visitor1->expects($this->at(6))->method('leaveNode')->with($negNode);
+        $visitor2->expects($this->at(6))->method('leaveNode')->with($negNode);
+
+        $traverser = new NodeTraverser;
+        $traverser->addVisitor($visitor1);
+        $traverser->addVisitor($visitor2);
+
+        $this->assertEquals($stmts, $traverser->traverse($stmts));
+    }
+
+    public function testRemovingVisitor() {
+        $visitor1 = $this->getMock('PhpParser\NodeVisitor');
+        $visitor2 = $this->getMock('PhpParser\NodeVisitor');
+        $visitor3 = $this->getMock('PhpParser\NodeVisitor');
+
+        $traverser = new NodeTraverser;
+        $traverser->addVisitor($visitor1);
+        $traverser->addVisitor($visitor2);
+        $traverser->addVisitor($visitor3);
+
+        $preExpected = array($visitor1, $visitor2, $visitor3);
+        $this->assertAttributeSame($preExpected, 'visitors', $traverser, 'The appropriate visitors have not been added');
+
+        $traverser->removeVisitor($visitor2);
+
+        $postExpected = array(0 => $visitor1, 2 => $visitor3);
+        $this->assertAttributeSame($postExpected, 'visitors', $traverser, 'The appropriate visitors are not present after removal');
+    }
+
+    public function testCloneNodesByDefault() {
+        $stmts = array(new Node\Stmt\Echo_(array(new String_('Foo'), new String_('Bar'))));
+
+        $traverser = new NodeTraverser;
+
+        $this->assertNotSame($stmts, $traverser->traverse($stmts));
+    }
+
+    public function testCloneNodesDisabled() {
+        $stmts = array(new Node\Stmt\Echo_(array(new String_('Foo'), new String_('Bar'))));
+
+        $traverser = new NodeTraverser(false);
+
+        $this->assertSame($stmts, $traverser->traverse($stmts));
+    }
+}
diff --git a/vendor/nikic/php-parser/test/PhpParser/NodeVisitor/NameResolverTest.php b/vendor/nikic/php-parser/test/PhpParser/NodeVisitor/NameResolverTest.php
new file mode 100644
index 0000000000..08027e21bb
--- /dev/null
+++ b/vendor/nikic/php-parser/test/PhpParser/NodeVisitor/NameResolverTest.php
@@ -0,0 +1,398 @@
+addVisitor(new NameResolver);
+
+        $stmts = $parser->parse($code);
+        $stmts = $traverser->traverse($stmts);
+
+        $this->assertSame(
+            $this->canonicalize($expectedCode),
+            $prettyPrinter->prettyPrint($stmts)
+        );
+    }
+
+    /**
+     * @covers PhpParser\NodeVisitor\NameResolver
+     */
+    public function testResolveLocations() {
+        $code = <<<'EOC'
+addVisitor(new NameResolver);
+
+        $stmts = $parser->parse($code);
+        $stmts = $traverser->traverse($stmts);
+
+        $this->assertSame(
+            $this->canonicalize($expectedCode),
+            $prettyPrinter->prettyPrint($stmts)
+        );
+    }
+
+    public function testNoResolveSpecialName() {
+        $stmts = array(new Node\Expr\New_(new Name('self')));
+
+        $traverser = new PhpParser\NodeTraverser;
+        $traverser->addVisitor(new NameResolver);
+
+        $this->assertEquals($stmts, $traverser->traverse($stmts));
+    }
+
+    protected function createNamespacedAndNonNamespaced(array $stmts) {
+        return array(
+            new Stmt\Namespace_(new Name('NS'), $stmts),
+            new Stmt\Namespace_(null,                          $stmts),
+        );
+    }
+
+    public function testAddNamespacedName() {
+        $stmts = $this->createNamespacedAndNonNamespaced(array(
+            new Stmt\Class_('A'),
+            new Stmt\Interface_('B'),
+            new Stmt\Function_('C'),
+            new Stmt\Const_(array(
+                new Node\Const_('D', new Node\Scalar\String_('E'))
+            )),
+            new Expr\New_(new Stmt\Class_(null)),
+        ));
+
+        $traverser = new PhpParser\NodeTraverser;
+        $traverser->addVisitor(new NameResolver);
+
+        $stmts = $traverser->traverse($stmts);
+
+        $this->assertSame('NS\\A', (string) $stmts[0]->stmts[0]->namespacedName);
+        $this->assertSame('NS\\B', (string) $stmts[0]->stmts[1]->namespacedName);
+        $this->assertSame('NS\\C', (string) $stmts[0]->stmts[2]->namespacedName);
+        $this->assertSame('NS\\D', (string) $stmts[0]->stmts[3]->consts[0]->namespacedName);
+        $this->assertObjectNotHasAttribute('namespacedName', $stmts[0]->stmts[4]->class);
+        $this->assertSame('A',     (string) $stmts[1]->stmts[0]->namespacedName);
+        $this->assertSame('B',     (string) $stmts[1]->stmts[1]->namespacedName);
+        $this->assertSame('C',     (string) $stmts[1]->stmts[2]->namespacedName);
+        $this->assertSame('D',     (string) $stmts[1]->stmts[3]->consts[0]->namespacedName);
+        $this->assertObjectNotHasAttribute('namespacedName', $stmts[1]->stmts[4]->class);
+    }
+
+    public function testAddTraitNamespacedName() {
+        $stmts = $this->createNamespacedAndNonNamespaced(array(
+            new Stmt\Trait_('A')
+        ));
+
+        $traverser = new PhpParser\NodeTraverser;
+        $traverser->addVisitor(new NameResolver);
+
+        $stmts = $traverser->traverse($stmts);
+
+        $this->assertSame('NS\\A', (string) $stmts[0]->stmts[0]->namespacedName);
+        $this->assertSame('A',     (string) $stmts[1]->stmts[0]->namespacedName);
+    }
+
+    /**
+     * @dataProvider provideTestError
+     */
+    public function testError(Node $stmt, $errorMsg) {
+        $this->setExpectedException('PhpParser\Error', $errorMsg);
+
+        $traverser = new PhpParser\NodeTraverser;
+        $traverser->addVisitor(new NameResolver);
+        $traverser->traverse(array($stmt));
+    }
+
+    public function provideTestError() {
+        return array(
+            array(
+                new Stmt\Use_(array(
+                    new Stmt\UseUse(new Name('A\B'), 'B', array('startLine' => 1)),
+                    new Stmt\UseUse(new Name('C\D'), 'B', array('startLine' => 2)),
+                ), Stmt\Use_::TYPE_NORMAL),
+                'Cannot use C\D as B because the name is already in use on line 2'
+            ),
+            array(
+                new Stmt\Use_(array(
+                    new Stmt\UseUse(new Name('a\b'), 'b', array('startLine' => 1)),
+                    new Stmt\UseUse(new Name('c\d'), 'B', array('startLine' => 2)),
+                ), Stmt\Use_::TYPE_FUNCTION),
+                'Cannot use function c\d as B because the name is already in use on line 2'
+            ),
+            array(
+                new Stmt\Use_(array(
+                    new Stmt\UseUse(new Name('A\B'), 'B', array('startLine' => 1)),
+                    new Stmt\UseUse(new Name('C\D'), 'B', array('startLine' => 2)),
+                ), Stmt\Use_::TYPE_CONSTANT),
+                'Cannot use const C\D as B because the name is already in use on line 2'
+            ),
+            array(
+                new Expr\New_(new Name\FullyQualified('self', array('startLine' => 3))),
+                "'\\self' is an invalid class name on line 3"
+            ),
+            array(
+                new Expr\New_(new Name\Relative('self', array('startLine' => 3))),
+                "'\\self' is an invalid class name on line 3"
+            ),
+            array(
+                new Expr\New_(new Name\FullyQualified('PARENT', array('startLine' => 3))),
+                "'\\PARENT' is an invalid class name on line 3"
+            ),
+            array(
+                new Expr\New_(new Name\Relative('STATIC', array('startLine' => 3))),
+                "'\\STATIC' is an invalid class name on line 3"
+            ),
+        );
+    }
+
+    public function testClassNameIsCaseInsensitive()
+    {
+        $source = <<<'EOC'
+parse($source);
+
+        $traverser = new PhpParser\NodeTraverser;
+        $traverser->addVisitor(new NameResolver);
+
+        $stmts = $traverser->traverse($stmts);
+        $stmt = $stmts[0];
+
+        $this->assertSame(array('Bar', 'Baz'), $stmt->stmts[1]->expr->class->parts);
+    }
+
+    public function testSpecialClassNamesAreCaseInsensitive() {
+        $source = <<<'EOC'
+parse($source);
+
+        $traverser = new PhpParser\NodeTraverser;
+        $traverser->addVisitor(new NameResolver);
+
+        $stmts = $traverser->traverse($stmts);
+        $classStmt = $stmts[0];
+        $methodStmt = $classStmt->stmts[0]->stmts[0];
+
+        $this->assertSame('SELF', (string)$methodStmt->stmts[0]->class);
+        $this->assertSame('PARENT', (string)$methodStmt->stmts[1]->class);
+        $this->assertSame('STATIC', (string)$methodStmt->stmts[2]->class);
+    }
+}
diff --git a/vendor/nikic/php-parser/test/PhpParser/ParserTest.php b/vendor/nikic/php-parser/test/PhpParser/ParserTest.php
new file mode 100644
index 0000000000..b066ee10ca
--- /dev/null
+++ b/vendor/nikic/php-parser/test/PhpParser/ParserTest.php
@@ -0,0 +1,154 @@
+ array(
+            'startLine', 'endLine', 'startFilePos', 'endFilePos'
+        )));
+        $parser = new Parser($lexer, array(
+            'throwOnError' => false,
+        ));
+
+        $stmts = $parser->parse($code);
+        $errors = $parser->getErrors();
+
+        $output = '';
+        foreach ($errors as $error) {
+            $output .= $this->formatErrorMessage($error, $code) . "\n";
+        }
+
+        if (null !== $stmts) {
+            $dumper = new NodeDumper;
+            $output .= $dumper->dump($stmts);
+        }
+
+        $this->assertSame($this->canonicalize($expected), $this->canonicalize($output), $name);
+    }
+
+    public function provideTestParse() {
+        return $this->getTests(__DIR__ . '/../code/parser', 'test');
+    }
+
+    private function formatErrorMessage(Error $e, $code) {
+        if ($e->hasColumnInfo()) {
+            return $e->getRawMessage() . ' from ' . $e->getStartLine() . ':' . $e->getStartColumn($code)
+                . ' to ' . $e->getEndLine() . ':' . $e->getEndColumn($code);
+        } else {
+            return $e->getMessage();
+        }
+    }
+
+    /**
+     * @expectedException \PhpParser\Error
+     * @expectedExceptionMessage Syntax error, unexpected EOF on line 1
+     */
+    public function testParserThrowsSyntaxError() {
+        $parser = new Parser(new Lexer());
+        $parser->parse('parse(' array(
+                'comments', 'startLine', 'endLine',
+                'startTokenPos', 'endTokenPos',
+            )
+        ));
+
+        $code = <<<'EOC'
+canonicalize($code);
+
+        $parser = new Parser($lexer);
+        $stmts = $parser->parse($code);
+
+        /** @var \PhpParser\Node\Stmt\Function_ $fn */
+        $fn = $stmts[0];
+        $this->assertInstanceOf('PhpParser\Node\Stmt\Function_', $fn);
+        $this->assertEquals(array(
+            'comments' => array(
+                new Comment\Doc('/** Doc comment */', 2),
+            ),
+            'startLine' => 3,
+            'endLine' => 7,
+            'startTokenPos' => 3,
+            'endTokenPos' => 21,
+        ), $fn->getAttributes());
+
+        $param = $fn->params[0];
+        $this->assertInstanceOf('PhpParser\Node\Param', $param);
+        $this->assertEquals(array(
+            'startLine' => 3,
+            'endLine' => 3,
+            'startTokenPos' => 7,
+            'endTokenPos' => 7,
+        ), $param->getAttributes());
+
+        /** @var \PhpParser\Node\Stmt\Echo_ $echo */
+        $echo = $fn->stmts[0];
+        $this->assertInstanceOf('PhpParser\Node\Stmt\Echo_', $echo);
+        $this->assertEquals(array(
+            'comments' => array(
+                new Comment("// Line\n", 4),
+                new Comment("// Comments\n", 5),
+            ),
+            'startLine' => 6,
+            'endLine' => 6,
+            'startTokenPos' => 16,
+            'endTokenPos' => 19,
+        ), $echo->getAttributes());
+
+        /** @var \PhpParser\Node\Expr\Variable $var */
+        $var = $echo->exprs[0];
+        $this->assertInstanceOf('PhpParser\Node\Expr\Variable', $var);
+        $this->assertEquals(array(
+            'startLine' => 6,
+            'endLine' => 6,
+            'startTokenPos' => 18,
+            'endTokenPos' => 18,
+        ), $var->getAttributes());
+    }
+
+    /**
+     * @expectedException \RangeException
+     * @expectedExceptionMessage The lexer returned an invalid token (id=999, value=foobar)
+     */
+    public function testInvalidToken() {
+        $lexer = new InvalidTokenLexer;
+        $parser = new Parser($lexer);
+        $parser->parse('dummy');
+    }
+}
+
+class InvalidTokenLexer extends Lexer {
+    public function getNextToken(&$value = null, &$startAttributes = null, &$endAttributes = null) {
+        $value = 'foobar';
+        return 999;
+    }
+}
diff --git a/vendor/nikic/php-parser/test/PhpParser/PrettyPrinterTest.php b/vendor/nikic/php-parser/test/PhpParser/PrettyPrinterTest.php
new file mode 100644
index 0000000000..6415b06c58
--- /dev/null
+++ b/vendor/nikic/php-parser/test/PhpParser/PrettyPrinterTest.php
@@ -0,0 +1,63 @@
+parse($code);
+        $this->assertSame(
+            $this->canonicalize($dump),
+            $this->canonicalize($prettyPrinter->$method($stmts)),
+            $name
+        );
+    }
+
+    /**
+     * @dataProvider provideTestPrettyPrint
+     * @covers PhpParser\PrettyPrinter\Standard
+     */
+    public function testPrettyPrint($name, $code, $dump) {
+        $this->doTestPrettyPrintMethod('prettyPrint', $name, $code, $dump);
+    }
+
+    /**
+     * @dataProvider provideTestPrettyPrintFile
+     * @covers PhpParser\PrettyPrinter\Standard
+     */
+    public function testPrettyPrintFile($name, $code, $dump) {
+        $this->doTestPrettyPrintMethod('prettyPrintFile', $name, $code, $dump);
+    }
+
+    public function provideTestPrettyPrint() {
+        return $this->getTests(__DIR__ . '/../code/prettyPrinter', 'test');
+    }
+
+    public function provideTestPrettyPrintFile() {
+        return $this->getTests(__DIR__ . '/../code/prettyPrinter', 'file-test');
+    }
+
+    public function testPrettyPrintExpr() {
+        $prettyPrinter = new Standard;
+        $expr = new Expr\BinaryOp\Mul(
+            new Expr\BinaryOp\Plus(new Expr\Variable('a'), new Expr\Variable('b')),
+            new Expr\Variable('c')
+        );
+        $this->assertEquals('($a + $b) * $c', $prettyPrinter->prettyPrintExpr($expr));
+
+        $expr = new Expr\Closure(array(
+            'stmts' => array(new Stmt\Return_(new String_("a\nb")))
+        ));
+        $this->assertEquals("function () {\n    return 'a\nb';\n}", $prettyPrinter->prettyPrintExpr($expr));
+    }
+}
diff --git a/vendor/nikic/php-parser/test/PhpParser/Serializer/XMLTest.php b/vendor/nikic/php-parser/test/PhpParser/Serializer/XMLTest.php
new file mode 100644
index 0000000000..78370c6d9e
--- /dev/null
+++ b/vendor/nikic/php-parser/test/PhpParser/Serializer/XMLTest.php
@@ -0,0 +1,165 @@
+
+     */
+    public function testSerialize() {
+        $code = <<
+
+ 
+  
+   
+    
+     // comment
+
+     /** doc comment */
+    
+   
+   
+    4
+   
+   
+    6
+   
+   
+    
+   
+   
+    functionName
+   
+   
+    
+     
+      
+       4
+      
+      
+       4
+      
+      
+       
+      
+      
+       
+      
+      
+       
+      
+      
+       a
+      
+      
+       
+        
+         4
+        
+        
+         4
+        
+        
+         0
+        
+       
+      
+     
+     
+      
+       4
+      
+      
+       4
+      
+      
+       
+      
+      
+       
+      
+      
+       
+      
+      
+       b
+      
+      
+       
+        
+         4
+        
+        
+         4
+        
+        
+         1
+        
+       
+      
+     
+    
+   
+   
+     
+   
+   
+    
+     
+      
+       5
+      
+      
+       5
+      
+      
+       
+        
+         
+          5
+         
+         
+          5
+         
+         
+          Foo
+         
+        
+       
+      
+     
+    
+   
+  
+ 
+
+XML;
+
+        $parser     = new PhpParser\Parser(new PhpParser\Lexer);
+        $serializer = new XML;
+
+        $stmts = $parser->parse($code);
+        $this->assertXmlStringEqualsXmlString($xml, $serializer->serialize($stmts));
+    }
+
+    /**
+     * @expectedException        \InvalidArgumentException
+     * @expectedExceptionMessage Unexpected node type
+     */
+    public function testError() {
+        $serializer = new XML;
+        $serializer->serialize(array(new \stdClass));
+    }
+}
diff --git a/vendor/nikic/php-parser/test/PhpParser/Unserializer/XMLTest.php b/vendor/nikic/php-parser/test/PhpParser/Unserializer/XMLTest.php
new file mode 100644
index 0000000000..8ee5d7b57e
--- /dev/null
+++ b/vendor/nikic/php-parser/test/PhpParser/Unserializer/XMLTest.php
@@ -0,0 +1,150 @@
+
+
+ 
+  
+   1
+  
+  
+   
+    // comment
+
+    /** doc comment */
+   
+  
+  
+   Test
+  
+ 
+
+XML;
+
+        $unserializer  = new XML;
+        $this->assertEquals(
+            new Scalar\String_('Test', array(
+                'startLine' => 1,
+                'comments'  => array(
+                    new Comment('// comment' . "\n", 2),
+                    new Comment\Doc('/** doc comment */', 3),
+                ),
+            )),
+            $unserializer->unserialize($xml)
+        );
+    }
+
+    public function testEmptyNode() {
+        $xml = <<
+
+ 
+
+XML;
+
+        $unserializer  = new XML;
+
+        $this->assertEquals(
+            new Scalar\MagicConst\Class_,
+            $unserializer->unserialize($xml)
+        );
+    }
+
+    public function testScalars() {
+        $xml = <<
+
+ 
+  
+  
+  test
+  
+  
+  1
+  1
+  1.5
+  
+  
+  
+ 
+
+XML;
+        $result = array(
+            array(), array(),
+            'test', '', '',
+            1,
+            1, 1.5,
+            true, false, null
+        );
+
+        $unserializer  = new XML;
+        $this->assertEquals($result, $unserializer->unserialize($xml));
+    }
+
+    /**
+     * @expectedException        \DomainException
+     * @expectedExceptionMessage AST root element not found
+     */
+    public function testWrongRootElementError() {
+        $xml = <<
+
+XML;
+
+        $unserializer = new XML;
+        $unserializer->unserialize($xml);
+    }
+
+    /**
+     * @dataProvider             provideTestErrors
+     */
+    public function testErrors($xml, $errorMsg) {
+        $this->setExpectedException('DomainException', $errorMsg);
+
+        $xml = <<
+
+ $xml
+
+XML;
+
+        $unserializer = new XML;
+        $unserializer->unserialize($xml);
+    }
+
+    public function provideTestErrors() {
+        return array(
+            array('test',   '"true" scalar must be empty'),
+            array('test', '"false" scalar must be empty'),
+            array('test',   '"null" scalar must be empty'),
+            array('bar',      'Unknown scalar type "foo"'),
+            array('x',        '"x" is not a valid int'),
+            array('x',    '"x" is not a valid float'),
+            array('',                                  'Expected node or scalar'),
+            array('test',           'Unexpected node of type "foo:bar"'),
+            array(
+                'test',
+                'Expected sub node or attribute, got node of type "foo:bar"'
+            ),
+            array(
+                '',
+                'Expected node or scalar'
+            ),
+            array(
+                '',
+                'Unknown node type "Foo"'
+            ),
+        );
+    }
+}
diff --git a/vendor/nikic/php-parser/test/code/parser/errorHandling/eofError.test b/vendor/nikic/php-parser/test/code/parser/errorHandling/eofError.test
new file mode 100644
index 0000000000..8914f56a7c
--- /dev/null
+++ b/vendor/nikic/php-parser/test/code/parser/errorHandling/eofError.test
@@ -0,0 +1,13 @@
+Error positions
+-----
+ 'd', 'e' => &$f);
+
+// short array syntax
+[];
+[1, 2, 3];
+['a' => 'b'];
+-----
+array(
+    0: Expr_Array(
+        items: array(
+        )
+    )
+    1: Expr_Array(
+        items: array(
+            0: Expr_ArrayItem(
+                key: null
+                value: Scalar_String(
+                    value: a
+                )
+                byRef: false
+            )
+        )
+    )
+    2: Expr_Array(
+        items: array(
+            0: Expr_ArrayItem(
+                key: null
+                value: Scalar_String(
+                    value: a
+                )
+                byRef: false
+            )
+        )
+    )
+    3: Expr_Array(
+        items: array(
+            0: Expr_ArrayItem(
+                key: null
+                value: Scalar_String(
+                    value: a
+                )
+                byRef: false
+            )
+            1: Expr_ArrayItem(
+                key: null
+                value: Scalar_String(
+                    value: b
+                )
+                byRef: false
+            )
+        )
+    )
+    4: Expr_Array(
+        items: array(
+            0: Expr_ArrayItem(
+                key: null
+                value: Scalar_String(
+                    value: a
+                )
+                byRef: false
+            )
+            1: Expr_ArrayItem(
+                key: null
+                value: Expr_Variable(
+                    name: b
+                )
+                byRef: true
+            )
+            2: Expr_ArrayItem(
+                key: Scalar_String(
+                    value: c
+                )
+                value: Scalar_String(
+                    value: d
+                )
+                byRef: false
+            )
+            3: Expr_ArrayItem(
+                key: Scalar_String(
+                    value: e
+                )
+                value: Expr_Variable(
+                    name: f
+                )
+                byRef: true
+            )
+        )
+    )
+    5: Expr_Array(
+        items: array(
+        )
+    )
+    6: Expr_Array(
+        items: array(
+            0: Expr_ArrayItem(
+                key: null
+                value: Scalar_LNumber(
+                    value: 1
+                )
+                byRef: false
+            )
+            1: Expr_ArrayItem(
+                key: null
+                value: Scalar_LNumber(
+                    value: 2
+                )
+                byRef: false
+            )
+            2: Expr_ArrayItem(
+                key: null
+                value: Scalar_LNumber(
+                    value: 3
+                )
+                byRef: false
+            )
+        )
+    )
+    7: Expr_Array(
+        items: array(
+            0: Expr_ArrayItem(
+                key: Scalar_String(
+                    value: a
+                )
+                value: Scalar_String(
+                    value: b
+                )
+                byRef: false
+            )
+        )
+    )
+)
\ No newline at end of file
diff --git a/vendor/nikic/php-parser/test/code/parser/expr/assign.test b/vendor/nikic/php-parser/test/code/parser/expr/assign.test
new file mode 100644
index 0000000000..66ae18f498
--- /dev/null
+++ b/vendor/nikic/php-parser/test/code/parser/expr/assign.test
@@ -0,0 +1,255 @@
+Assignments
+-----
+>= $b;
+$a **= $b;
+
+// chained assign
+$a = $b *= $c **= $d;
+
+// by ref assign
+$a =& $b;
+$a =& new B;
+
+// list() assign
+list($a) = $b;
+list($a, , $b) = $c;
+list($a, list(, $c), $d) = $e;
+
+// inc/dec
+++$a;
+$a++;
+--$a;
+$a--;
+-----
+array(
+    0: Expr_Assign(
+        var: Expr_Variable(
+            name: a
+        )
+        expr: Expr_Variable(
+            name: b
+        )
+    )
+    1: Expr_AssignOp_BitwiseAnd(
+        var: Expr_Variable(
+            name: a
+        )
+        expr: Expr_Variable(
+            name: b
+        )
+    )
+    2: Expr_AssignOp_BitwiseOr(
+        var: Expr_Variable(
+            name: a
+        )
+        expr: Expr_Variable(
+            name: b
+        )
+    )
+    3: Expr_AssignOp_BitwiseXor(
+        var: Expr_Variable(
+            name: a
+        )
+        expr: Expr_Variable(
+            name: b
+        )
+    )
+    4: Expr_AssignOp_Concat(
+        var: Expr_Variable(
+            name: a
+        )
+        expr: Expr_Variable(
+            name: b
+        )
+    )
+    5: Expr_AssignOp_Div(
+        var: Expr_Variable(
+            name: a
+        )
+        expr: Expr_Variable(
+            name: b
+        )
+    )
+    6: Expr_AssignOp_Minus(
+        var: Expr_Variable(
+            name: a
+        )
+        expr: Expr_Variable(
+            name: b
+        )
+    )
+    7: Expr_AssignOp_Mod(
+        var: Expr_Variable(
+            name: a
+        )
+        expr: Expr_Variable(
+            name: b
+        )
+    )
+    8: Expr_AssignOp_Mul(
+        var: Expr_Variable(
+            name: a
+        )
+        expr: Expr_Variable(
+            name: b
+        )
+    )
+    9: Expr_AssignOp_Plus(
+        var: Expr_Variable(
+            name: a
+        )
+        expr: Expr_Variable(
+            name: b
+        )
+    )
+    10: Expr_AssignOp_ShiftLeft(
+        var: Expr_Variable(
+            name: a
+        )
+        expr: Expr_Variable(
+            name: b
+        )
+    )
+    11: Expr_AssignOp_ShiftRight(
+        var: Expr_Variable(
+            name: a
+        )
+        expr: Expr_Variable(
+            name: b
+        )
+    )
+    12: Expr_AssignOp_Pow(
+        var: Expr_Variable(
+            name: a
+        )
+        expr: Expr_Variable(
+            name: b
+        )
+    )
+    13: Expr_Assign(
+        var: Expr_Variable(
+            name: a
+        )
+        expr: Expr_AssignOp_Mul(
+            var: Expr_Variable(
+                name: b
+            )
+            expr: Expr_AssignOp_Pow(
+                var: Expr_Variable(
+                    name: c
+                )
+                expr: Expr_Variable(
+                    name: d
+                )
+            )
+        )
+    )
+    14: Expr_AssignRef(
+        var: Expr_Variable(
+            name: a
+        )
+        expr: Expr_Variable(
+            name: b
+        )
+    )
+    15: Expr_AssignRef(
+        var: Expr_Variable(
+            name: a
+        )
+        expr: Expr_New(
+            class: Name(
+                parts: array(
+                    0: B
+                )
+            )
+            args: array(
+            )
+        )
+    )
+    16: Expr_Assign(
+        var: Expr_List(
+            vars: array(
+                0: Expr_Variable(
+                    name: a
+                )
+            )
+        )
+        expr: Expr_Variable(
+            name: b
+        )
+    )
+    17: Expr_Assign(
+        var: Expr_List(
+            vars: array(
+                0: Expr_Variable(
+                    name: a
+                )
+                1: null
+                2: Expr_Variable(
+                    name: b
+                )
+            )
+        )
+        expr: Expr_Variable(
+            name: c
+        )
+    )
+    18: Expr_Assign(
+        var: Expr_List(
+            vars: array(
+                0: Expr_Variable(
+                    name: a
+                )
+                1: Expr_List(
+                    vars: array(
+                        0: null
+                        1: Expr_Variable(
+                            name: c
+                        )
+                    )
+                )
+                2: Expr_Variable(
+                    name: d
+                )
+            )
+        )
+        expr: Expr_Variable(
+            name: e
+        )
+    )
+    19: Expr_PreInc(
+        var: Expr_Variable(
+            name: a
+        )
+    )
+    20: Expr_PostInc(
+        var: Expr_Variable(
+            name: a
+        )
+    )
+    21: Expr_PreDec(
+        var: Expr_Variable(
+            name: a
+        )
+    )
+    22: Expr_PostDec(
+        var: Expr_Variable(
+            name: a
+        )
+    )
+)
\ No newline at end of file
diff --git a/vendor/nikic/php-parser/test/code/parser/expr/cast.test b/vendor/nikic/php-parser/test/code/parser/expr/cast.test
new file mode 100644
index 0000000000..3c54ba72d3
--- /dev/null
+++ b/vendor/nikic/php-parser/test/code/parser/expr/cast.test
@@ -0,0 +1,72 @@
+Casts
+-----
+ $b;
+$a >= $b;
+$a == $b;
+$a === $b;
+$a != $b;
+$a !== $b;
+$a <=> $b;
+$a instanceof B;
+$a instanceof $b;
+-----
+array(
+    0: Expr_BinaryOp_Smaller(
+        left: Expr_Variable(
+            name: a
+        )
+        right: Expr_Variable(
+            name: b
+        )
+    )
+    1: Expr_BinaryOp_SmallerOrEqual(
+        left: Expr_Variable(
+            name: a
+        )
+        right: Expr_Variable(
+            name: b
+        )
+    )
+    2: Expr_BinaryOp_Greater(
+        left: Expr_Variable(
+            name: a
+        )
+        right: Expr_Variable(
+            name: b
+        )
+    )
+    3: Expr_BinaryOp_GreaterOrEqual(
+        left: Expr_Variable(
+            name: a
+        )
+        right: Expr_Variable(
+            name: b
+        )
+    )
+    4: Expr_BinaryOp_Equal(
+        left: Expr_Variable(
+            name: a
+        )
+        right: Expr_Variable(
+            name: b
+        )
+    )
+    5: Expr_BinaryOp_Identical(
+        left: Expr_Variable(
+            name: a
+        )
+        right: Expr_Variable(
+            name: b
+        )
+    )
+    6: Expr_BinaryOp_NotEqual(
+        left: Expr_Variable(
+            name: a
+        )
+        right: Expr_Variable(
+            name: b
+        )
+    )
+    7: Expr_BinaryOp_NotIdentical(
+        left: Expr_Variable(
+            name: a
+        )
+        right: Expr_Variable(
+            name: b
+        )
+    )
+    8: Expr_BinaryOp_Spaceship(
+        left: Expr_Variable(
+            name: a
+        )
+        right: Expr_Variable(
+            name: b
+        )
+    )
+    9: Expr_Instanceof(
+        expr: Expr_Variable(
+            name: a
+        )
+        class: Name(
+            parts: array(
+                0: B
+            )
+        )
+    )
+    10: Expr_Instanceof(
+        expr: Expr_Variable(
+            name: a
+        )
+        class: Expr_Variable(
+            name: b
+        )
+    )
+)
diff --git a/vendor/nikic/php-parser/test/code/parser/expr/constant_expr.test b/vendor/nikic/php-parser/test/code/parser/expr/constant_expr.test
new file mode 100644
index 0000000000..3e7a23ef0d
--- /dev/null
+++ b/vendor/nikic/php-parser/test/code/parser/expr/constant_expr.test
@@ -0,0 +1,621 @@
+Expressions in static scalar context
+-----
+ 0;
+const T_20 = 1 >= 0;
+const T_21 = 1 === 1;
+const T_22 = 1 !== 1;
+const T_23 = 0 != "0";
+const T_24 = 1 == "1";
+const T_25 = 1 + 2 * 3;
+const T_26 = "1" + 2 + "3";
+const T_27 = 2 ** 3;
+const T_28 = [1, 2, 3][1];
+const T_29 = 12 - 13;
+const T_30 = 12 ^ 13;
+const T_31 = 12 & 13;
+const T_32 = 12 | 13;
+const T_33 = 12 % 3;
+const T_34 = 100 >> 4;
+const T_35 = !false;
+-----
+array(
+    0: Stmt_Const(
+        consts: array(
+            0: Const(
+                name: T_1
+                value: Expr_BinaryOp_ShiftLeft(
+                    left: Scalar_LNumber(
+                        value: 1
+                    )
+                    right: Scalar_LNumber(
+                        value: 1
+                    )
+                )
+            )
+        )
+    )
+    1: Stmt_Const(
+        consts: array(
+            0: Const(
+                name: T_2
+                value: Expr_BinaryOp_Div(
+                    left: Scalar_LNumber(
+                        value: 1
+                    )
+                    right: Scalar_LNumber(
+                        value: 2
+                    )
+                )
+            )
+        )
+    )
+    2: Stmt_Const(
+        consts: array(
+            0: Const(
+                name: T_3
+                value: Expr_BinaryOp_Plus(
+                    left: Scalar_DNumber(
+                        value: 1.5
+                    )
+                    right: Scalar_DNumber(
+                        value: 1.5
+                    )
+                )
+            )
+        )
+    )
+    3: Stmt_Const(
+        consts: array(
+            0: Const(
+                name: T_4
+                value: Expr_BinaryOp_Concat(
+                    left: Scalar_String(
+                        value: foo
+                    )
+                    right: Scalar_String(
+                        value: bar
+                    )
+                )
+            )
+        )
+    )
+    4: Stmt_Const(
+        consts: array(
+            0: Const(
+                name: T_5
+                value: Expr_BinaryOp_Mul(
+                    left: Expr_BinaryOp_Plus(
+                        left: Scalar_DNumber(
+                            value: 1.5
+                        )
+                        right: Scalar_DNumber(
+                            value: 1.5
+                        )
+                    )
+                    right: Scalar_LNumber(
+                        value: 2
+                    )
+                )
+            )
+        )
+    )
+    5: Stmt_Const(
+        consts: array(
+            0: Const(
+                name: T_6
+                value: Expr_BinaryOp_Concat(
+                    left: Expr_BinaryOp_Concat(
+                        left: Expr_BinaryOp_Concat(
+                            left: Scalar_String(
+                                value: foo
+                            )
+                            right: Scalar_LNumber(
+                                value: 2
+                            )
+                        )
+                        right: Scalar_LNumber(
+                            value: 3
+                        )
+                    )
+                    right: Scalar_DNumber(
+                        value: 4
+                    )
+                )
+            )
+        )
+    )
+    6: Stmt_Const(
+        consts: array(
+            0: Const(
+                name: T_7
+                value: Scalar_MagicConst_Line(
+                )
+            )
+        )
+    )
+    7: Stmt_Const(
+        consts: array(
+            0: Const(
+                name: T_8
+                value: Scalar_String(
+                    value: This is a test string
+                )
+            )
+        )
+    )
+    8: Stmt_Const(
+        consts: array(
+            0: Const(
+                name: T_9
+                value: Expr_BitwiseNot(
+                    expr: Expr_UnaryMinus(
+                        expr: Scalar_LNumber(
+                            value: 1
+                        )
+                    )
+                )
+            )
+        )
+    )
+    9: Stmt_Const(
+        consts: array(
+            0: Const(
+                name: T_10
+                value: Expr_BinaryOp_Plus(
+                    left: Expr_Ternary(
+                        cond: Expr_UnaryMinus(
+                            expr: Scalar_LNumber(
+                                value: 1
+                            )
+                        )
+                        if: null
+                        else: Scalar_LNumber(
+                            value: 1
+                        )
+                    )
+                    right: Expr_Ternary(
+                        cond: Scalar_LNumber(
+                            value: 0
+                        )
+                        if: Scalar_LNumber(
+                            value: 2
+                        )
+                        else: Scalar_LNumber(
+                            value: 3
+                        )
+                    )
+                )
+            )
+        )
+    )
+    10: Stmt_Const(
+        consts: array(
+            0: Const(
+                name: T_11
+                value: Expr_BinaryOp_BooleanAnd(
+                    left: Scalar_LNumber(
+                        value: 1
+                    )
+                    right: Scalar_LNumber(
+                        value: 0
+                    )
+                )
+            )
+        )
+    )
+    11: Stmt_Const(
+        consts: array(
+            0: Const(
+                name: T_12
+                value: Expr_BinaryOp_LogicalAnd(
+                    left: Scalar_LNumber(
+                        value: 1
+                    )
+                    right: Scalar_LNumber(
+                        value: 1
+                    )
+                )
+            )
+        )
+    )
+    12: Stmt_Const(
+        consts: array(
+            0: Const(
+                name: T_13
+                value: Expr_BinaryOp_BooleanOr(
+                    left: Scalar_LNumber(
+                        value: 0
+                    )
+                    right: Scalar_LNumber(
+                        value: 0
+                    )
+                )
+            )
+        )
+    )
+    13: Stmt_Const(
+        consts: array(
+            0: Const(
+                name: T_14
+                value: Expr_BinaryOp_LogicalOr(
+                    left: Scalar_LNumber(
+                        value: 1
+                    )
+                    right: Scalar_LNumber(
+                        value: 0
+                    )
+                )
+            )
+        )
+    )
+    14: Stmt_Const(
+        consts: array(
+            0: Const(
+                name: T_15
+                value: Expr_BinaryOp_LogicalXor(
+                    left: Scalar_LNumber(
+                        value: 1
+                    )
+                    right: Scalar_LNumber(
+                        value: 1
+                    )
+                )
+            )
+        )
+    )
+    15: Stmt_Const(
+        consts: array(
+            0: Const(
+                name: T_16
+                value: Expr_BinaryOp_LogicalXor(
+                    left: Scalar_LNumber(
+                        value: 1
+                    )
+                    right: Scalar_LNumber(
+                        value: 0
+                    )
+                )
+            )
+        )
+    )
+    16: Stmt_Const(
+        consts: array(
+            0: Const(
+                name: T_17
+                value: Expr_BinaryOp_Smaller(
+                    left: Scalar_LNumber(
+                        value: 1
+                    )
+                    right: Scalar_LNumber(
+                        value: 0
+                    )
+                )
+            )
+        )
+    )
+    17: Stmt_Const(
+        consts: array(
+            0: Const(
+                name: T_18
+                value: Expr_BinaryOp_SmallerOrEqual(
+                    left: Scalar_LNumber(
+                        value: 0
+                    )
+                    right: Scalar_LNumber(
+                        value: 0
+                    )
+                )
+            )
+        )
+    )
+    18: Stmt_Const(
+        consts: array(
+            0: Const(
+                name: T_19
+                value: Expr_BinaryOp_Greater(
+                    left: Scalar_LNumber(
+                        value: 1
+                    )
+                    right: Scalar_LNumber(
+                        value: 0
+                    )
+                )
+            )
+        )
+    )
+    19: Stmt_Const(
+        consts: array(
+            0: Const(
+                name: T_20
+                value: Expr_BinaryOp_GreaterOrEqual(
+                    left: Scalar_LNumber(
+                        value: 1
+                    )
+                    right: Scalar_LNumber(
+                        value: 0
+                    )
+                )
+            )
+        )
+    )
+    20: Stmt_Const(
+        consts: array(
+            0: Const(
+                name: T_21
+                value: Expr_BinaryOp_Identical(
+                    left: Scalar_LNumber(
+                        value: 1
+                    )
+                    right: Scalar_LNumber(
+                        value: 1
+                    )
+                )
+            )
+        )
+    )
+    21: Stmt_Const(
+        consts: array(
+            0: Const(
+                name: T_22
+                value: Expr_BinaryOp_NotIdentical(
+                    left: Scalar_LNumber(
+                        value: 1
+                    )
+                    right: Scalar_LNumber(
+                        value: 1
+                    )
+                )
+            )
+        )
+    )
+    22: Stmt_Const(
+        consts: array(
+            0: Const(
+                name: T_23
+                value: Expr_BinaryOp_NotEqual(
+                    left: Scalar_LNumber(
+                        value: 0
+                    )
+                    right: Scalar_String(
+                        value: 0
+                    )
+                )
+            )
+        )
+    )
+    23: Stmt_Const(
+        consts: array(
+            0: Const(
+                name: T_24
+                value: Expr_BinaryOp_Equal(
+                    left: Scalar_LNumber(
+                        value: 1
+                    )
+                    right: Scalar_String(
+                        value: 1
+                    )
+                )
+            )
+        )
+    )
+    24: Stmt_Const(
+        consts: array(
+            0: Const(
+                name: T_25
+                value: Expr_BinaryOp_Plus(
+                    left: Scalar_LNumber(
+                        value: 1
+                    )
+                    right: Expr_BinaryOp_Mul(
+                        left: Scalar_LNumber(
+                            value: 2
+                        )
+                        right: Scalar_LNumber(
+                            value: 3
+                        )
+                    )
+                )
+            )
+        )
+    )
+    25: Stmt_Const(
+        consts: array(
+            0: Const(
+                name: T_26
+                value: Expr_BinaryOp_Plus(
+                    left: Expr_BinaryOp_Plus(
+                        left: Scalar_String(
+                            value: 1
+                        )
+                        right: Scalar_LNumber(
+                            value: 2
+                        )
+                    )
+                    right: Scalar_String(
+                        value: 3
+                    )
+                )
+            )
+        )
+    )
+    26: Stmt_Const(
+        consts: array(
+            0: Const(
+                name: T_27
+                value: Expr_BinaryOp_Pow(
+                    left: Scalar_LNumber(
+                        value: 2
+                    )
+                    right: Scalar_LNumber(
+                        value: 3
+                    )
+                )
+            )
+        )
+    )
+    27: Stmt_Const(
+        consts: array(
+            0: Const(
+                name: T_28
+                value: Expr_ArrayDimFetch(
+                    var: Expr_Array(
+                        items: array(
+                            0: Expr_ArrayItem(
+                                key: null
+                                value: Scalar_LNumber(
+                                    value: 1
+                                )
+                                byRef: false
+                            )
+                            1: Expr_ArrayItem(
+                                key: null
+                                value: Scalar_LNumber(
+                                    value: 2
+                                )
+                                byRef: false
+                            )
+                            2: Expr_ArrayItem(
+                                key: null
+                                value: Scalar_LNumber(
+                                    value: 3
+                                )
+                                byRef: false
+                            )
+                        )
+                    )
+                    dim: Scalar_LNumber(
+                        value: 1
+                    )
+                )
+            )
+        )
+    )
+    28: Stmt_Const(
+        consts: array(
+            0: Const(
+                name: T_29
+                value: Expr_BinaryOp_Minus(
+                    left: Scalar_LNumber(
+                        value: 12
+                    )
+                    right: Scalar_LNumber(
+                        value: 13
+                    )
+                )
+            )
+        )
+    )
+    29: Stmt_Const(
+        consts: array(
+            0: Const(
+                name: T_30
+                value: Expr_BinaryOp_BitwiseXor(
+                    left: Scalar_LNumber(
+                        value: 12
+                    )
+                    right: Scalar_LNumber(
+                        value: 13
+                    )
+                )
+            )
+        )
+    )
+    30: Stmt_Const(
+        consts: array(
+            0: Const(
+                name: T_31
+                value: Expr_BinaryOp_BitwiseAnd(
+                    left: Scalar_LNumber(
+                        value: 12
+                    )
+                    right: Scalar_LNumber(
+                        value: 13
+                    )
+                )
+            )
+        )
+    )
+    31: Stmt_Const(
+        consts: array(
+            0: Const(
+                name: T_32
+                value: Expr_BinaryOp_BitwiseOr(
+                    left: Scalar_LNumber(
+                        value: 12
+                    )
+                    right: Scalar_LNumber(
+                        value: 13
+                    )
+                )
+            )
+        )
+    )
+    32: Stmt_Const(
+        consts: array(
+            0: Const(
+                name: T_33
+                value: Expr_BinaryOp_Mod(
+                    left: Scalar_LNumber(
+                        value: 12
+                    )
+                    right: Scalar_LNumber(
+                        value: 3
+                    )
+                )
+            )
+        )
+    )
+    33: Stmt_Const(
+        consts: array(
+            0: Const(
+                name: T_34
+                value: Expr_BinaryOp_ShiftRight(
+                    left: Scalar_LNumber(
+                        value: 100
+                    )
+                    right: Scalar_LNumber(
+                        value: 4
+                    )
+                )
+            )
+        )
+    )
+    34: Stmt_Const(
+        consts: array(
+            0: Const(
+                name: T_35
+                value: Expr_BooleanNot(
+                    expr: Expr_ConstFetch(
+                        name: Name(
+                            parts: array(
+                                0: false
+                            )
+                        )
+                    )
+                )
+            )
+        )
+    )
+)
\ No newline at end of file
diff --git a/vendor/nikic/php-parser/test/code/parser/expr/errorSuppress.test b/vendor/nikic/php-parser/test/code/parser/expr/errorSuppress.test
new file mode 100644
index 0000000000..ce3fce96a2
--- /dev/null
+++ b/vendor/nikic/php-parser/test/code/parser/expr/errorSuppress.test
@@ -0,0 +1,12 @@
+Error suppression
+-----
+b['c']();
+
+// array dereferencing
+a()['b'];
+-----
+array(
+    0: Expr_FuncCall(
+        name: Name(
+            parts: array(
+                0: a
+            )
+        )
+        args: array(
+        )
+    )
+    1: Expr_FuncCall(
+        name: Expr_Variable(
+            name: a
+        )
+        args: array(
+        )
+    )
+    2: Expr_FuncCall(
+        name: Expr_Variable(
+            name: Scalar_String(
+                value: a
+            )
+        )
+        args: array(
+        )
+    )
+    3: Expr_FuncCall(
+        name: Expr_Variable(
+            name: Expr_Variable(
+                name: a
+            )
+        )
+        args: array(
+        )
+    )
+    4: Expr_FuncCall(
+        name: Expr_Variable(
+            name: Expr_Variable(
+                name: Expr_Variable(
+                    name: a
+                )
+            )
+        )
+        args: array(
+        )
+    )
+    5: Expr_FuncCall(
+        name: Expr_ArrayDimFetch(
+            var: Expr_Variable(
+                name: a
+            )
+            dim: Scalar_String(
+                value: b
+            )
+        )
+        args: array(
+        )
+    )
+    6: Expr_FuncCall(
+        name: Expr_ArrayDimFetch(
+            var: Expr_Variable(
+                name: a
+            )
+            dim: Scalar_String(
+                value: b
+            )
+        )
+        args: array(
+        )
+    )
+    7: Expr_FuncCall(
+        name: Expr_ArrayDimFetch(
+            var: Expr_PropertyFetch(
+                var: Expr_Variable(
+                    name: a
+                )
+                name: b
+            )
+            dim: Scalar_String(
+                value: c
+            )
+        )
+        args: array(
+        )
+    )
+    8: Expr_ArrayDimFetch(
+        var: Expr_FuncCall(
+            name: Name(
+                parts: array(
+                    0: a
+                )
+            )
+            args: array(
+            )
+        )
+        dim: Scalar_String(
+            value: b
+        )
+    )
+)
\ No newline at end of file
diff --git a/vendor/nikic/php-parser/test/code/parser/expr/fetchAndCall/newDeref.test b/vendor/nikic/php-parser/test/code/parser/expr/fetchAndCall/newDeref.test
new file mode 100644
index 0000000000..5e36ff8102
--- /dev/null
+++ b/vendor/nikic/php-parser/test/code/parser/expr/fetchAndCall/newDeref.test
@@ -0,0 +1,70 @@
+New expression dereferencing
+-----
+b;
+(new A)->b();
+(new A)['b'];
+(new A)['b']['c'];
+-----
+array(
+    0: Expr_PropertyFetch(
+        var: Expr_New(
+            class: Name(
+                parts: array(
+                    0: A
+                )
+            )
+            args: array(
+            )
+        )
+        name: b
+    )
+    1: Expr_MethodCall(
+        var: Expr_New(
+            class: Name(
+                parts: array(
+                    0: A
+                )
+            )
+            args: array(
+            )
+        )
+        name: b
+        args: array(
+        )
+    )
+    2: Expr_ArrayDimFetch(
+        var: Expr_New(
+            class: Name(
+                parts: array(
+                    0: A
+                )
+            )
+            args: array(
+            )
+        )
+        dim: Scalar_String(
+            value: b
+        )
+    )
+    3: Expr_ArrayDimFetch(
+        var: Expr_ArrayDimFetch(
+            var: Expr_New(
+                class: Name(
+                    parts: array(
+                        0: A
+                    )
+                )
+                args: array(
+                )
+            )
+            dim: Scalar_String(
+                value: b
+            )
+        )
+        dim: Scalar_String(
+            value: c
+        )
+    )
+)
\ No newline at end of file
diff --git a/vendor/nikic/php-parser/test/code/parser/expr/fetchAndCall/objectAccess.test b/vendor/nikic/php-parser/test/code/parser/expr/fetchAndCall/objectAccess.test
new file mode 100644
index 0000000000..9dd1858f5b
--- /dev/null
+++ b/vendor/nikic/php-parser/test/code/parser/expr/fetchAndCall/objectAccess.test
@@ -0,0 +1,118 @@
+Object access
+-----
+b;
+$a->b['c'];
+$a->b{'c'};
+
+// method call variations
+$a->b();
+$a->{'b'}();
+$a->$b();
+$a->$b['c']();
+
+// array dereferencing
+$a->b()['c'];
+$a->b(){'c'}; // invalid PHP: drop Support?
+-----
+array(
+    0: Expr_PropertyFetch(
+        var: Expr_Variable(
+            name: a
+        )
+        name: b
+    )
+    1: Expr_ArrayDimFetch(
+        var: Expr_PropertyFetch(
+            var: Expr_Variable(
+                name: a
+            )
+            name: b
+        )
+        dim: Scalar_String(
+            value: c
+        )
+    )
+    2: Expr_ArrayDimFetch(
+        var: Expr_PropertyFetch(
+            var: Expr_Variable(
+                name: a
+            )
+            name: b
+        )
+        dim: Scalar_String(
+            value: c
+        )
+    )
+    3: Expr_MethodCall(
+        var: Expr_Variable(
+            name: a
+        )
+        name: b
+        args: array(
+        )
+    )
+    4: Expr_MethodCall(
+        var: Expr_Variable(
+            name: a
+        )
+        name: Scalar_String(
+            value: b
+        )
+        args: array(
+        )
+    )
+    5: Expr_MethodCall(
+        var: Expr_Variable(
+            name: a
+        )
+        name: Expr_Variable(
+            name: b
+        )
+        args: array(
+        )
+    )
+    6: Expr_MethodCall(
+        var: Expr_Variable(
+            name: a
+        )
+        name: Expr_ArrayDimFetch(
+            var: Expr_Variable(
+                name: b
+            )
+            dim: Scalar_String(
+                value: c
+            )
+        )
+        args: array(
+        )
+    )
+    7: Expr_ArrayDimFetch(
+        var: Expr_MethodCall(
+            var: Expr_Variable(
+                name: a
+            )
+            name: b
+            args: array(
+            )
+        )
+        dim: Scalar_String(
+            value: c
+        )
+    )
+    8: Expr_ArrayDimFetch(
+        var: Expr_MethodCall(
+            var: Expr_Variable(
+                name: a
+            )
+            name: b
+            args: array(
+            )
+        )
+        dim: Scalar_String(
+            value: c
+        )
+    )
+)
\ No newline at end of file
diff --git a/vendor/nikic/php-parser/test/code/parser/expr/fetchAndCall/simpleArrayAccess.test b/vendor/nikic/php-parser/test/code/parser/expr/fetchAndCall/simpleArrayAccess.test
new file mode 100644
index 0000000000..ea3f9ef431
--- /dev/null
+++ b/vendor/nikic/php-parser/test/code/parser/expr/fetchAndCall/simpleArrayAccess.test
@@ -0,0 +1,62 @@
+Simple array access
+-----
+> $b;
+$a ** $b;
+
+// associativity
+$a * $b * $c;
+$a * ($b * $c);
+
+// precedence
+$a + $b * $c;
+($a + $b) * $c;
+
+// pow is special
+$a ** $b ** $c;
+($a ** $b) ** $c;
+-----
+array(
+    0: Expr_BitwiseNot(
+        expr: Expr_Variable(
+            name: a
+        )
+    )
+    1: Expr_UnaryPlus(
+        expr: Expr_Variable(
+            name: a
+        )
+    )
+    2: Expr_UnaryMinus(
+        expr: Expr_Variable(
+            name: a
+        )
+    )
+    3: Expr_BinaryOp_BitwiseAnd(
+        left: Expr_Variable(
+            name: a
+        )
+        right: Expr_Variable(
+            name: b
+        )
+    )
+    4: Expr_BinaryOp_BitwiseOr(
+        left: Expr_Variable(
+            name: a
+        )
+        right: Expr_Variable(
+            name: b
+        )
+    )
+    5: Expr_BinaryOp_BitwiseXor(
+        left: Expr_Variable(
+            name: a
+        )
+        right: Expr_Variable(
+            name: b
+        )
+    )
+    6: Expr_BinaryOp_Concat(
+        left: Expr_Variable(
+            name: a
+        )
+        right: Expr_Variable(
+            name: b
+        )
+    )
+    7: Expr_BinaryOp_Div(
+        left: Expr_Variable(
+            name: a
+        )
+        right: Expr_Variable(
+            name: b
+        )
+    )
+    8: Expr_BinaryOp_Minus(
+        left: Expr_Variable(
+            name: a
+        )
+        right: Expr_Variable(
+            name: b
+        )
+    )
+    9: Expr_BinaryOp_Mod(
+        left: Expr_Variable(
+            name: a
+        )
+        right: Expr_Variable(
+            name: b
+        )
+    )
+    10: Expr_BinaryOp_Mul(
+        left: Expr_Variable(
+            name: a
+        )
+        right: Expr_Variable(
+            name: b
+        )
+    )
+    11: Expr_BinaryOp_Plus(
+        left: Expr_Variable(
+            name: a
+        )
+        right: Expr_Variable(
+            name: b
+        )
+    )
+    12: Expr_BinaryOp_ShiftLeft(
+        left: Expr_Variable(
+            name: a
+        )
+        right: Expr_Variable(
+            name: b
+        )
+    )
+    13: Expr_BinaryOp_ShiftRight(
+        left: Expr_Variable(
+            name: a
+        )
+        right: Expr_Variable(
+            name: b
+        )
+    )
+    14: Expr_BinaryOp_Pow(
+        left: Expr_Variable(
+            name: a
+        )
+        right: Expr_Variable(
+            name: b
+        )
+    )
+    15: Expr_BinaryOp_Mul(
+        left: Expr_BinaryOp_Mul(
+            left: Expr_Variable(
+                name: a
+            )
+            right: Expr_Variable(
+                name: b
+            )
+        )
+        right: Expr_Variable(
+            name: c
+        )
+    )
+    16: Expr_BinaryOp_Mul(
+        left: Expr_Variable(
+            name: a
+        )
+        right: Expr_BinaryOp_Mul(
+            left: Expr_Variable(
+                name: b
+            )
+            right: Expr_Variable(
+                name: c
+            )
+        )
+    )
+    17: Expr_BinaryOp_Plus(
+        left: Expr_Variable(
+            name: a
+        )
+        right: Expr_BinaryOp_Mul(
+            left: Expr_Variable(
+                name: b
+            )
+            right: Expr_Variable(
+                name: c
+            )
+        )
+    )
+    18: Expr_BinaryOp_Mul(
+        left: Expr_BinaryOp_Plus(
+            left: Expr_Variable(
+                name: a
+            )
+            right: Expr_Variable(
+                name: b
+            )
+        )
+        right: Expr_Variable(
+            name: c
+        )
+    )
+    19: Expr_BinaryOp_Pow(
+        left: Expr_Variable(
+            name: a
+        )
+        right: Expr_BinaryOp_Pow(
+            left: Expr_Variable(
+                name: b
+            )
+            right: Expr_Variable(
+                name: c
+            )
+        )
+    )
+    20: Expr_BinaryOp_Pow(
+        left: Expr_BinaryOp_Pow(
+            left: Expr_Variable(
+                name: a
+            )
+            right: Expr_Variable(
+                name: b
+            )
+        )
+        right: Expr_Variable(
+            name: c
+        )
+    )
+)
\ No newline at end of file
diff --git a/vendor/nikic/php-parser/test/code/parser/expr/new.test b/vendor/nikic/php-parser/test/code/parser/expr/new.test
new file mode 100644
index 0000000000..b7ce7a9d40
--- /dev/null
+++ b/vendor/nikic/php-parser/test/code/parser/expr/new.test
@@ -0,0 +1,140 @@
+New
+-----
+b();
+new $a->b->c();
+new $a->b['c']();
+new $a->b{'c'}();
+
+// test regression introduces by new dereferencing syntax
+(new A);
+-----
+array(
+    0: Expr_New(
+        class: Name(
+            parts: array(
+                0: A
+            )
+        )
+        args: array(
+        )
+    )
+    1: Expr_New(
+        class: Name(
+            parts: array(
+                0: A
+            )
+        )
+        args: array(
+            0: Arg(
+                value: Expr_Variable(
+                    name: b
+                )
+                byRef: false
+                unpack: false
+            )
+        )
+    )
+    2: Expr_New(
+        class: Expr_Variable(
+            name: a
+        )
+        args: array(
+        )
+    )
+    3: Expr_New(
+        class: Expr_ArrayDimFetch(
+            var: Expr_Variable(
+                name: a
+            )
+            dim: Scalar_String(
+                value: b
+            )
+        )
+        args: array(
+        )
+    )
+    4: Expr_New(
+        class: Expr_StaticPropertyFetch(
+            class: Name(
+                parts: array(
+                    0: A
+                )
+            )
+            name: b
+        )
+        args: array(
+        )
+    )
+    5: Expr_New(
+        class: Expr_PropertyFetch(
+            var: Expr_Variable(
+                name: a
+            )
+            name: b
+        )
+        args: array(
+        )
+    )
+    6: Expr_New(
+        class: Expr_PropertyFetch(
+            var: Expr_PropertyFetch(
+                var: Expr_Variable(
+                    name: a
+                )
+                name: b
+            )
+            name: c
+        )
+        args: array(
+        )
+    )
+    7: Expr_New(
+        class: Expr_ArrayDimFetch(
+            var: Expr_PropertyFetch(
+                var: Expr_Variable(
+                    name: a
+                )
+                name: b
+            )
+            dim: Scalar_String(
+                value: c
+            )
+        )
+        args: array(
+        )
+    )
+    8: Expr_New(
+        class: Expr_ArrayDimFetch(
+            var: Expr_PropertyFetch(
+                var: Expr_Variable(
+                    name: a
+                )
+                name: b
+            )
+            dim: Scalar_String(
+                value: c
+            )
+        )
+        args: array(
+        )
+    )
+    9: Expr_New(
+        class: Name(
+            parts: array(
+                0: A
+            )
+        )
+        args: array(
+        )
+    )
+)
\ No newline at end of file
diff --git a/vendor/nikic/php-parser/test/code/parser/expr/newWithoutClass.test b/vendor/nikic/php-parser/test/code/parser/expr/newWithoutClass.test
new file mode 100644
index 0000000000..84ec7b1745
--- /dev/null
+++ b/vendor/nikic/php-parser/test/code/parser/expr/newWithoutClass.test
@@ -0,0 +1,8 @@
+New without a class
+-----
+c test
+EOS;
+
+// comment to force line break before EOF
+-----
+array(
+    0: Scalar_String(
+        value:
+    )
+    1: Scalar_String(
+        value:
+    )
+    2: Scalar_String(
+        value: Test '" $a \n
+    )
+    3: Scalar_String(
+        value: Test '" $a
+
+    )
+    4: Scalar_Encapsed(
+        parts: array(
+            0: Test
+            1: Expr_Variable(
+                name: a
+            )
+        )
+    )
+    5: Scalar_Encapsed(
+        parts: array(
+            0: Test
+            1: Expr_Variable(
+                name: a
+            )
+            2:  and
+            3: Expr_PropertyFetch(
+                var: Expr_Variable(
+                    name: b
+                )
+                name: c
+            )
+            4:  test
+        )
+    )
+)
\ No newline at end of file
diff --git a/vendor/nikic/php-parser/test/code/parser/scalar/docStringNewlines.test b/vendor/nikic/php-parser/test/code/parser/scalar/docStringNewlines.test
new file mode 100644
index 0000000000..479c9950ae
--- /dev/null
+++ b/vendor/nikic/php-parser/test/code/parser/scalar/docStringNewlines.test
@@ -0,0 +1,58 @@
+Trailing newlines in doc strings
+-----
+B";
+"$A[B]";
+"$A[0]";
+"$A[0x0]";
+"$A[$B]";
+"{$A}";
+"{$A['B']}";
+"${A}";
+"${A['B']}";
+"${$A}";
+"\{$A}";
+"\{ $A }";
+"\\{$A}";
+"\\{ $A }";
+"{$$A}[B]";
+"$$A[B]";
+"A $B C";
+b"$A";
+-----
+array(
+    0: Scalar_Encapsed(
+        parts: array(
+            0: Expr_Variable(
+                name: A
+            )
+        )
+    )
+    1: Scalar_Encapsed(
+        parts: array(
+            0: Expr_PropertyFetch(
+                var: Expr_Variable(
+                    name: A
+                )
+                name: B
+            )
+        )
+    )
+    2: Scalar_Encapsed(
+        parts: array(
+            0: Expr_ArrayDimFetch(
+                var: Expr_Variable(
+                    name: A
+                )
+                dim: Scalar_String(
+                    value: B
+                )
+            )
+        )
+    )
+    3: Scalar_Encapsed(
+        parts: array(
+            0: Expr_ArrayDimFetch(
+                var: Expr_Variable(
+                    name: A
+                )
+                dim: Scalar_String(
+                    value: 0
+                )
+            )
+        )
+    )
+    4: Scalar_Encapsed(
+        parts: array(
+            0: Expr_ArrayDimFetch(
+                var: Expr_Variable(
+                    name: A
+                )
+                dim: Scalar_String(
+                    value: 0x0
+                )
+            )
+        )
+    )
+    5: Scalar_Encapsed(
+        parts: array(
+            0: Expr_ArrayDimFetch(
+                var: Expr_Variable(
+                    name: A
+                )
+                dim: Expr_Variable(
+                    name: B
+                )
+            )
+        )
+    )
+    6: Scalar_Encapsed(
+        parts: array(
+            0: Expr_Variable(
+                name: A
+            )
+        )
+    )
+    7: Scalar_Encapsed(
+        parts: array(
+            0: Expr_ArrayDimFetch(
+                var: Expr_Variable(
+                    name: A
+                )
+                dim: Scalar_String(
+                    value: B
+                )
+            )
+        )
+    )
+    8: Scalar_Encapsed(
+        parts: array(
+            0: Expr_Variable(
+                name: A
+            )
+        )
+    )
+    9: Scalar_Encapsed(
+        parts: array(
+            0: Expr_ArrayDimFetch(
+                var: Expr_Variable(
+                    name: A
+                )
+                dim: Scalar_String(
+                    value: B
+                )
+            )
+        )
+    )
+    10: Scalar_Encapsed(
+        parts: array(
+            0: Expr_Variable(
+                name: Expr_Variable(
+                    name: A
+                )
+            )
+        )
+    )
+    11: Scalar_Encapsed(
+        parts: array(
+            0: \{
+            1: Expr_Variable(
+                name: A
+            )
+            2: }
+        )
+    )
+    12: Scalar_Encapsed(
+        parts: array(
+            0: \{
+            1: Expr_Variable(
+                name: A
+            )
+            2:  }
+        )
+    )
+    13: Scalar_Encapsed(
+        parts: array(
+            0: \
+            1: Expr_Variable(
+                name: A
+            )
+        )
+    )
+    14: Scalar_Encapsed(
+        parts: array(
+            0: \{
+            1: Expr_Variable(
+                name: A
+            )
+            2:  }
+        )
+    )
+    15: Scalar_Encapsed(
+        parts: array(
+            0: Expr_Variable(
+                name: Expr_Variable(
+                    name: A
+                )
+            )
+            1: [B]
+        )
+    )
+    16: Scalar_Encapsed(
+        parts: array(
+            0: $
+            1: Expr_ArrayDimFetch(
+                var: Expr_Variable(
+                    name: A
+                )
+                dim: Scalar_String(
+                    value: B
+                )
+            )
+        )
+    )
+    17: Scalar_Encapsed(
+        parts: array(
+            0: A
+            1: Expr_Variable(
+                name: B
+            )
+            2:  C
+        )
+    )
+    18: Scalar_Encapsed(
+        parts: array(
+            0: Expr_Variable(
+                name: A
+            )
+        )
+    )
+)
diff --git a/vendor/nikic/php-parser/test/code/parser/scalar/float.test b/vendor/nikic/php-parser/test/code/parser/scalar/float.test
new file mode 100644
index 0000000000..c91b7ac7b8
--- /dev/null
+++ b/vendor/nikic/php-parser/test/code/parser/scalar/float.test
@@ -0,0 +1,70 @@
+Different float syntaxes
+-----
+ float overflows
+// (all are actually the same number, just in different representations)
+18446744073709551615;
+0xFFFFFFFFFFFFFFFF;
+01777777777777777777777;
+0177777777777777777777787;
+0b1111111111111111111111111111111111111111111111111111111111111111;
+-----
+array(
+    0: Scalar_DNumber(
+        value: 0
+    )
+    1: Scalar_DNumber(
+        value: 0
+    )
+    2: Scalar_DNumber(
+        value: 0
+    )
+    3: Scalar_DNumber(
+        value: 0
+    )
+    4: Scalar_DNumber(
+        value: 0
+    )
+    5: Scalar_DNumber(
+        value: 0
+    )
+    6: Scalar_DNumber(
+        value: 0
+    )
+    7: Scalar_DNumber(
+        value: 302000000000
+    )
+    8: Scalar_DNumber(
+        value: 3.002E+102
+    )
+    9: Scalar_DNumber(
+        value: INF
+    )
+    10: Scalar_DNumber(
+        value: @@{ 0xFFFFFFFFFFFFFFFF }@@
+    )
+    11: Scalar_DNumber(
+        value: @@{ 0xFFFFFFFFFFFFFFFF }@@
+    )
+    12: Scalar_DNumber(
+        value: @@{ 0xFFFFFFFFFFFFFFFF }@@
+    )
+    13: Scalar_DNumber(
+        value: @@{ 0xFFFFFFFFFFFFFFFF }@@
+    )
+    14: Scalar_DNumber(
+        value: @@{ 0xFFFFFFFFFFFFFFFF }@@
+    )
+)
\ No newline at end of file
diff --git a/vendor/nikic/php-parser/test/code/parser/scalar/int.test b/vendor/nikic/php-parser/test/code/parser/scalar/int.test
new file mode 100644
index 0000000000..17a5785b62
--- /dev/null
+++ b/vendor/nikic/php-parser/test/code/parser/scalar/int.test
@@ -0,0 +1,47 @@
+Different integer syntaxes
+-----
+ 'baz']
+) {}
+-----
+array(
+    0: Stmt_Function(
+        byRef: false
+        name: a
+        params: array(
+            0: Param(
+                type: null
+                byRef: false
+                variadic: false
+                name: b
+                default: Expr_ConstFetch(
+                    name: Name(
+                        parts: array(
+                            0: null
+                        )
+                    )
+                )
+            )
+            1: Param(
+                type: null
+                byRef: false
+                variadic: false
+                name: c
+                default: Scalar_String(
+                    value: foo
+                )
+            )
+            2: Param(
+                type: null
+                byRef: false
+                variadic: false
+                name: d
+                default: Expr_ClassConstFetch(
+                    class: Name(
+                        parts: array(
+                            0: A
+                        )
+                    )
+                    name: B
+                )
+            )
+            3: Param(
+                type: null
+                byRef: false
+                variadic: false
+                name: f
+                default: Expr_UnaryPlus(
+                    expr: Scalar_LNumber(
+                        value: 1
+                    )
+                )
+            )
+            4: Param(
+                type: null
+                byRef: false
+                variadic: false
+                name: g
+                default: Expr_UnaryMinus(
+                    expr: Scalar_DNumber(
+                        value: 1
+                    )
+                )
+            )
+            5: Param(
+                type: null
+                byRef: false
+                variadic: false
+                name: h
+                default: Expr_Array(
+                    items: array(
+                    )
+                )
+            )
+            6: Param(
+                type: null
+                byRef: false
+                variadic: false
+                name: i
+                default: Expr_Array(
+                    items: array(
+                    )
+                )
+            )
+            7: Param(
+                type: null
+                byRef: false
+                variadic: false
+                name: j
+                default: Expr_Array(
+                    items: array(
+                        0: Expr_ArrayItem(
+                            key: null
+                            value: Scalar_String(
+                                value: foo
+                            )
+                            byRef: false
+                        )
+                    )
+                )
+            )
+            8: Param(
+                type: null
+                byRef: false
+                variadic: false
+                name: k
+                default: Expr_Array(
+                    items: array(
+                        0: Expr_ArrayItem(
+                            key: null
+                            value: Scalar_String(
+                                value: foo
+                            )
+                            byRef: false
+                        )
+                        1: Expr_ArrayItem(
+                            key: Scalar_String(
+                                value: bar
+                            )
+                            value: Scalar_String(
+                                value: baz
+                            )
+                            byRef: false
+                        )
+                    )
+                )
+            )
+        )
+        returnType: null
+        stmts: array(
+        )
+    )
+)
diff --git a/vendor/nikic/php-parser/test/code/parser/stmt/function/generator.test b/vendor/nikic/php-parser/test/code/parser/stmt/function/generator.test
new file mode 100644
index 0000000000..f18b4b7da4
--- /dev/null
+++ b/vendor/nikic/php-parser/test/code/parser/stmt/function/generator.test
@@ -0,0 +1,262 @@
+Generators (yield expression)
+-----
+ $value;
+
+    // expressions
+    $data = yield;
+    $data = (yield $value);
+    $data = (yield $key => $value);
+
+    // yield in language constructs with their own parentheses
+    if (yield $foo); elseif (yield $foo);
+    if (yield $foo): elseif (yield $foo): endif;
+    while (yield $foo);
+    do {} while (yield $foo);
+    switch (yield $foo) {}
+    die(yield $foo);
+
+    // yield in function calls
+    func(yield $foo);
+    $foo->func(yield $foo);
+    new Foo(yield $foo);
+
+    yield from $foo;
+    yield from $foo and yield from $bar;
+    yield from $foo + $bar;
+}
+-----
+array(
+    0: Stmt_Function(
+        byRef: false
+        name: gen
+        params: array(
+        )
+        returnType: null
+        stmts: array(
+            0: Expr_Yield(
+                key: null
+                value: null
+            )
+            1: Expr_Yield(
+                key: null
+                value: Expr_Variable(
+                    name: value
+                )
+            )
+            2: Expr_Yield(
+                key: Expr_Variable(
+                    name: key
+                )
+                value: Expr_Variable(
+                    name: value
+                )
+            )
+            3: Expr_Assign(
+                var: Expr_Variable(
+                    name: data
+                )
+                expr: Expr_Yield(
+                    key: null
+                    value: null
+                )
+            )
+            4: Expr_Assign(
+                var: Expr_Variable(
+                    name: data
+                )
+                expr: Expr_Yield(
+                    key: null
+                    value: Expr_Variable(
+                        name: value
+                    )
+                )
+            )
+            5: Expr_Assign(
+                var: Expr_Variable(
+                    name: data
+                )
+                expr: Expr_Yield(
+                    key: Expr_Variable(
+                        name: key
+                    )
+                    value: Expr_Variable(
+                        name: value
+                    )
+                )
+            )
+            6: Stmt_If(
+                cond: Expr_Yield(
+                    key: null
+                    value: Expr_Variable(
+                        name: foo
+                    )
+                )
+                stmts: array(
+                )
+                elseifs: array(
+                    0: Stmt_ElseIf(
+                        cond: Expr_Yield(
+                            key: null
+                            value: Expr_Variable(
+                                name: foo
+                            )
+                        )
+                        stmts: array(
+                        )
+                    )
+                )
+                else: null
+            )
+            7: Stmt_If(
+                cond: Expr_Yield(
+                    key: null
+                    value: Expr_Variable(
+                        name: foo
+                    )
+                )
+                stmts: array(
+                )
+                elseifs: array(
+                    0: Stmt_ElseIf(
+                        cond: Expr_Yield(
+                            key: null
+                            value: Expr_Variable(
+                                name: foo
+                            )
+                        )
+                        stmts: array(
+                        )
+                    )
+                )
+                else: null
+            )
+            8: Stmt_While(
+                cond: Expr_Yield(
+                    key: null
+                    value: Expr_Variable(
+                        name: foo
+                    )
+                )
+                stmts: array(
+                )
+            )
+            9: Stmt_Do(
+                cond: Expr_Yield(
+                    key: null
+                    value: Expr_Variable(
+                        name: foo
+                    )
+                )
+                stmts: array(
+                )
+            )
+            10: Stmt_Switch(
+                cond: Expr_Yield(
+                    key: null
+                    value: Expr_Variable(
+                        name: foo
+                    )
+                )
+                cases: array(
+                )
+            )
+            11: Expr_Exit(
+                expr: Expr_Yield(
+                    key: null
+                    value: Expr_Variable(
+                        name: foo
+                    )
+                )
+            )
+            12: Expr_FuncCall(
+                name: Name(
+                    parts: array(
+                        0: func
+                    )
+                )
+                args: array(
+                    0: Arg(
+                        value: Expr_Yield(
+                            key: null
+                            value: Expr_Variable(
+                                name: foo
+                            )
+                        )
+                        byRef: false
+                        unpack: false
+                    )
+                )
+            )
+            13: Expr_MethodCall(
+                var: Expr_Variable(
+                    name: foo
+                )
+                name: func
+                args: array(
+                    0: Arg(
+                        value: Expr_Yield(
+                            key: null
+                            value: Expr_Variable(
+                                name: foo
+                            )
+                        )
+                        byRef: false
+                        unpack: false
+                    )
+                )
+            )
+            14: Expr_New(
+                class: Name(
+                    parts: array(
+                        0: Foo
+                    )
+                )
+                args: array(
+                    0: Arg(
+                        value: Expr_Yield(
+                            key: null
+                            value: Expr_Variable(
+                                name: foo
+                            )
+                        )
+                        byRef: false
+                        unpack: false
+                    )
+                )
+            )
+            15: Expr_YieldFrom(
+                expr: Expr_Variable(
+                    name: foo
+                )
+            )
+            16: Expr_BinaryOp_LogicalAnd(
+                left: Expr_YieldFrom(
+                    expr: Expr_Variable(
+                        name: foo
+                    )
+                )
+                right: Expr_YieldFrom(
+                    expr: Expr_Variable(
+                        name: bar
+                    )
+                )
+            )
+            17: Expr_YieldFrom(
+                expr: Expr_BinaryOp_Plus(
+                    left: Expr_Variable(
+                        name: foo
+                    )
+                    right: Expr_Variable(
+                        name: bar
+                    )
+                )
+            )
+        )
+    )
+)
diff --git a/vendor/nikic/php-parser/test/code/parser/stmt/function/returnTypes.test b/vendor/nikic/php-parser/test/code/parser/stmt/function/returnTypes.test
new file mode 100644
index 0000000000..ca6c3106e4
--- /dev/null
+++ b/vendor/nikic/php-parser/test/code/parser/stmt/function/returnTypes.test
@@ -0,0 +1,52 @@
+Return type declarations
+-----
+
+Hallo World!
+-----
+array(
+    0: Expr_Variable(
+        name: a
+    )
+    1: Stmt_HaltCompiler(
+        remaining: Hallo World!
+    )
+)
+-----
+
+#!/usr/bin/env php
+-----
+array(
+    0: Stmt_InlineHTML(
+        value: #!/usr/bin/env php
+
+    )
+    1: Stmt_Echo(
+        exprs: array(
+            0: Scalar_String(
+                value: foobar
+            )
+        )
+    )
+    2: Stmt_InlineHTML(
+        value: #!/usr/bin/env php
+    )
+)
diff --git a/vendor/nikic/php-parser/test/code/parser/stmt/if.test b/vendor/nikic/php-parser/test/code/parser/stmt/if.test
new file mode 100644
index 0000000000..6ae1e1652c
--- /dev/null
+++ b/vendor/nikic/php-parser/test/code/parser/stmt/if.test
@@ -0,0 +1,95 @@
+If/Elseif/Else
+-----
+
+B
+
+ $c) {}
+foreach ($a as $b => &$c) {}
+foreach ($a as list($a, $b)) {}
+foreach ($a as $a => list($b, , $c)) {}
+
+// foreach on expression
+foreach (array() as $b) {}
+
+// alternative syntax
+foreach ($a as $b):
+endforeach;
+-----
+array(
+    0: Stmt_Foreach(
+        expr: Expr_Variable(
+            name: a
+        )
+        keyVar: null
+        byRef: false
+        valueVar: Expr_Variable(
+            name: b
+        )
+        stmts: array(
+        )
+    )
+    1: Stmt_Foreach(
+        expr: Expr_Variable(
+            name: a
+        )
+        keyVar: null
+        byRef: true
+        valueVar: Expr_Variable(
+            name: b
+        )
+        stmts: array(
+        )
+    )
+    2: Stmt_Foreach(
+        expr: Expr_Variable(
+            name: a
+        )
+        keyVar: Expr_Variable(
+            name: b
+        )
+        byRef: false
+        valueVar: Expr_Variable(
+            name: c
+        )
+        stmts: array(
+        )
+    )
+    3: Stmt_Foreach(
+        expr: Expr_Variable(
+            name: a
+        )
+        keyVar: Expr_Variable(
+            name: b
+        )
+        byRef: true
+        valueVar: Expr_Variable(
+            name: c
+        )
+        stmts: array(
+        )
+    )
+    4: Stmt_Foreach(
+        expr: Expr_Variable(
+            name: a
+        )
+        keyVar: null
+        byRef: false
+        valueVar: Expr_List(
+            vars: array(
+                0: Expr_Variable(
+                    name: a
+                )
+                1: Expr_Variable(
+                    name: b
+                )
+            )
+        )
+        stmts: array(
+        )
+    )
+    5: Stmt_Foreach(
+        expr: Expr_Variable(
+            name: a
+        )
+        keyVar: Expr_Variable(
+            name: a
+        )
+        byRef: false
+        valueVar: Expr_List(
+            vars: array(
+                0: Expr_Variable(
+                    name: b
+                )
+                1: null
+                2: Expr_Variable(
+                    name: c
+                )
+            )
+        )
+        stmts: array(
+        )
+    )
+    6: Stmt_Foreach(
+        expr: Expr_Array(
+            items: array(
+            )
+        )
+        keyVar: null
+        byRef: false
+        valueVar: Expr_Variable(
+            name: b
+        )
+        stmts: array(
+        )
+    )
+    7: Stmt_Foreach(
+        expr: Expr_Variable(
+            name: a
+        )
+        keyVar: null
+        byRef: false
+        valueVar: Expr_Variable(
+            name: b
+        )
+        stmts: array(
+        )
+    )
+)
\ No newline at end of file
diff --git a/vendor/nikic/php-parser/test/code/parser/stmt/loop/while.test b/vendor/nikic/php-parser/test/code/parser/stmt/loop/while.test
new file mode 100644
index 0000000000..65f6b2336f
--- /dev/null
+++ b/vendor/nikic/php-parser/test/code/parser/stmt/loop/while.test
@@ -0,0 +1,25 @@
+While loop
+-----
+
+Hi!
+-----
+array(
+    0: Stmt_Declare(
+        declares: array(
+            0: Stmt_DeclareDeclare(
+                key: A
+                value: Scalar_String(
+                    value: B
+                )
+            )
+        )
+        stmts: array(
+        )
+    )
+    1: Stmt_Namespace(
+        name: Name(
+            parts: array(
+                0: B
+            )
+        )
+        stmts: array(
+        )
+    )
+    2: Stmt_HaltCompiler(
+        remaining: Hi!
+    )
+)
\ No newline at end of file
diff --git a/vendor/nikic/php-parser/test/code/parser/stmt/namespace/outsideStmtInvalid.test b/vendor/nikic/php-parser/test/code/parser/stmt/namespace/outsideStmtInvalid.test
new file mode 100644
index 0000000000..52e884329d
--- /dev/null
+++ b/vendor/nikic/php-parser/test/code/parser/stmt/namespace/outsideStmtInvalid.test
@@ -0,0 +1,20 @@
+There (mostly) can't be statements outside of namespaces
+-----
+a = $a;
+    }
+};
+-----
+new class
+{
+};
+new class extends A implements B, C
+{
+};
+new class($a) extends A
+{
+    private $a;
+    public function __construct($a)
+    {
+        $this->a = $a;
+    }
+};
diff --git a/vendor/nikic/php-parser/test/code/prettyPrinter/call.test b/vendor/nikic/php-parser/test/code/prettyPrinter/call.test
new file mode 100644
index 0000000000..0ec8925cf2
--- /dev/null
+++ b/vendor/nikic/php-parser/test/code/prettyPrinter/call.test
@@ -0,0 +1,13 @@
+Calls
+-----
+a = 'bar';
+        echo 'test';
+    }
+
+    protected function baz() {}
+    public function foo() {}
+    abstract static function bar() {}
+}
+-----
+class Foo
+{
+    var $a = 'foo';
+    private $b = 'bar';
+    static $c = 'baz';
+    function test()
+    {
+        $this->a = 'bar';
+        echo 'test';
+    }
+    protected function baz()
+    {
+    }
+    public function foo()
+    {
+    }
+    static abstract function bar()
+    {
+    }
+}
\ No newline at end of file
diff --git a/vendor/nikic/php-parser/test/code/prettyPrinter/closure.test b/vendor/nikic/php-parser/test/code/prettyPrinter/closure.test
new file mode 100644
index 0000000000..7e4fcfd05d
--- /dev/null
+++ b/vendor/nikic/php-parser/test/code/prettyPrinter/closure.test
@@ -0,0 +1,18 @@
+Closures
+-----
+
+HTML
+-----
+
+HTML
+-----
+HTML
+
+HTML
+-----
+HTML
+
+HTML
+-----
+HTML
+
+HTML
+
+HTML
+-----
+HTML
+
+HTML
+
+HTML
\ No newline at end of file
diff --git a/vendor/nikic/php-parser/test/code/prettyPrinter/list.test b/vendor/nikic/php-parser/test/code/prettyPrinter/list.test
new file mode 100644
index 0000000000..608ced6a69
--- /dev/null
+++ b/vendor/nikic/php-parser/test/code/prettyPrinter/list.test
@@ -0,0 +1,19 @@
+list()
+-----
+> $b;
+$a < $b;
+$a <= $b;
+$a > $b;
+$a >= $b;
+$a == $b;
+$a != $b;
+$a <> $b;
+$a === $b;
+$a !== $b;
+$a <=> $b;
+$a & $b;
+$a ^ $b;
+$a | $b;
+$a && $b;
+$a || $b;
+$a ? $b : $c;
+$a ?: $c;
+$a ?? $c;
+
+$a = $b;
+$a **= $b;
+$a *= $b;
+$a /= $b;
+$a %= $b;
+$a += $b;
+$a -= $b;
+$a .= $b;
+$a <<= $b;
+$a >>= $b;
+$a &= $b;
+$a ^= $b;
+$a |= $b;
+$a =& $b;
+
+$a and $b;
+$a xor $b;
+$a or $b;
+
+$a instanceof Foo;
+$a instanceof $b;
+-----
+$a ** $b;
+++$a;
+--$a;
+$a++;
+$a--;
+@$a;
+~$a;
+-$a;
++$a;
+(int) $a;
+(int) $a;
+(double) $a;
+(double) $a;
+(double) $a;
+(string) $a;
+(string) $a;
+(array) $a;
+(object) $a;
+(bool) $a;
+(bool) $a;
+(unset) $a;
+$a * $b;
+$a / $b;
+$a % $b;
+$a + $b;
+$a - $b;
+$a . $b;
+$a << $b;
+$a >> $b;
+$a < $b;
+$a <= $b;
+$a > $b;
+$a >= $b;
+$a == $b;
+$a != $b;
+$a != $b;
+$a === $b;
+$a !== $b;
+$a <=> $b;
+$a & $b;
+$a ^ $b;
+$a | $b;
+$a && $b;
+$a || $b;
+$a ? $b : $c;
+$a ?: $c;
+$a ?? $c;
+$a = $b;
+$a **= $b;
+$a *= $b;
+$a /= $b;
+$a %= $b;
+$a += $b;
+$a -= $b;
+$a .= $b;
+$a <<= $b;
+$a >>= $b;
+$a &= $b;
+$a ^= $b;
+$a |= $b;
+$a =& $b;
+$a and $b;
+$a xor $b;
+$a or $b;
+$a instanceof Foo;
+$a instanceof $b;
diff --git a/vendor/nikic/php-parser/test/code/prettyPrinter/parentheses.test b/vendor/nikic/php-parser/test/code/prettyPrinter/parentheses.test
new file mode 100644
index 0000000000..1f18b65900
--- /dev/null
+++ b/vendor/nikic/php-parser/test/code/prettyPrinter/parentheses.test
@@ -0,0 +1,77 @@
+Pretty printer generates least-parentheses output
+-----
+ 0) > (1 < 0);
+++$a + $b;
+$a + $b++;
+
+$a ** $b ** $c;
+($a ** $b) ** $c;
+-1 ** 2;
+
+yield from $a and yield from $b;
+yield from ($a and yield from $b);
+
+print ($a and print $b);
+
+// The following will currently add unnecessary parentheses, because the pretty printer is not aware that assignment
+// and incdec only work on variables.
+!$a = $b;
+++$a ** $b;
+$a ** $b++;
+-----
+echo 'abc' . 'cde' . 'fgh';
+echo 'abc' . ('cde' . 'fgh');
+echo 'abc' . 1 + 2 . 'fgh';
+echo 'abc' . (1 + 2) . 'fgh';
+echo 1 * 2 + 3 / 4 % 5 . 6;
+echo 1 * (2 + 3) / (4 % (5 . 6));
+$a = $b = $c = $d = $f && true;
+($a = $b = $c = $d = $f) && true;
+$a = $b = $c = $d = $f and true;
+$a = $b = $c = $d = ($f and true);
+$a ? $b : $c ? $d : $e ? $f : $g;
+$a ? $b : ($c ? $d : ($e ? $f : $g));
+$a ? $b ? $c : $d : $f;
+$a ?? $b ?? $c;
+($a ?? $b) ?? $c;
+$a ?? ($b ? $c : $d);
+$a || ($b ?? $c);
+(1 > 0) > (1 < 0);
+++$a + $b;
+$a + $b++;
+$a ** $b ** $c;
+($a ** $b) ** $c;
+-1 ** 2;
+yield from $a and yield from $b;
+yield from ($a and yield from $b);
+print ($a and print $b);
+// The following will currently add unnecessary parentheses, because the pretty printer is not aware that assignment
+// and incdec only work on variables.
+!($a = $b);
+(++$a) ** $b;
+$a ** ($b++);
diff --git a/vendor/nikic/php-parser/test/code/prettyPrinter/switch.test b/vendor/nikic/php-parser/test/code/prettyPrinter/switch.test
new file mode 100644
index 0000000000..0733a48bfc
--- /dev/null
+++ b/vendor/nikic/php-parser/test/code/prettyPrinter/switch.test
@@ -0,0 +1,35 @@
+switch/case/default
+-----
+b;
+$a->b();
+$a->b($c);
+$a->$b();
+$a->{$b}();
+$a->$b[$c]();
+$$a->b;
+$a[$b];
+$a[$b]();
+$$a[$b];
+$a::B;
+$a::$b;
+$a::b();
+$a::b($c);
+$a::$b();
+$a::$b[$c];
+$a::$b[$c]($d);
+$a::{$b[$c]}($d);
+$a::{$b->c}();
+a();
+$a();
+$a()[$b];
+$a->b()[$c];
+$a::$b()[$c];
+(new A)->b;
+(new A())->b();
+(new $$a)[$b];
+(new $a->b)->c;
+
+global $a, $$a, $$a[$b], $$a->b;
+-----
+$a;
+${$a};
+${$a};
+$a->b;
+$a->b();
+$a->b($c);
+$a->{$b}();
+$a->{$b}();
+$a->{$b[$c]}();
+${$a}->b;
+$a[$b];
+$a[$b]();
+${$a[$b]};
+$a::B;
+$a::$b;
+$a::b();
+$a::b($c);
+$a::$b();
+$a::$b[$c];
+$a::$b[$c]($d);
+$a::$b[$c]($d);
+$a::{$b->c}();
+a();
+$a();
+$a()[$b];
+$a->b()[$c];
+$a::$b()[$c];
+(new A())->b;
+(new A())->b();
+(new ${$a}())[$b];
+(new $a->b())->c;
+global $a, ${$a}, ${$a[$b]}, ${$a->b};
diff --git a/vendor/nikic/php-parser/test_old/run.php b/vendor/nikic/php-parser/test_old/run.php
new file mode 100644
index 0000000000..9a781412ec
--- /dev/null
+++ b/vendor/nikic/php-parser/test_old/run.php
@@ -0,0 +1,189 @@
+ 0) {
+    if (count($options) === 1 && $options[0] === '--no-progress') {
+        $SHOW_PROGRESS = false;
+    } else {
+        showHelp('Invalid option passed!');
+    }
+}
+
+$TEST_TYPE = $arguments[0];
+$DIR       = $arguments[1];
+
+if ('Symfony' === $TEST_TYPE) {
+    function filter_func($path) {
+        return preg_match('~\.php(?:\.cache)?$~', $path) && false === strpos($path, 'skeleton');
+    };
+} elseif ('PHP' === $TEST_TYPE) {
+    function filter_func($path) {
+        return preg_match('~\.phpt$~', $path);
+    };
+} else {
+    showHelp('Test type must be either "Symfony" or "PHP"!');
+}
+
+require_once dirname(__FILE__) . '/../lib/PhpParser/Autoloader.php';
+PhpParser\Autoloader::register();
+
+$parser        = new PhpParser\Parser(new PhpParser\Lexer\Emulative);
+$prettyPrinter = new PhpParser\PrettyPrinter\Standard;
+$nodeDumper    = new PhpParser\NodeDumper;
+
+$parseFail = $ppFail = $compareFail = $count = 0;
+
+$readTime = $parseTime = $ppTime = $reparseTime = $compareTime = 0;
+$totalStartTime = microtime(true);
+
+foreach (new RecursiveIteratorIterator(
+             new RecursiveDirectoryIterator($DIR),
+             RecursiveIteratorIterator::LEAVES_ONLY)
+         as $file) {
+    if (!filter_func($file)) {
+        continue;
+    }
+
+    $startTime = microtime(true);
+    $code = file_get_contents($file);
+    $readTime += microtime(true) - $startTime;
+
+    if ('PHP' === $TEST_TYPE) {
+        if (preg_match('~(?:
+# skeleton files
+  ext.gmp.tests.001
+| ext.skeleton.tests.001
+# multibyte encoded files
+| ext.mbstring.tests.zend_multibyte-01
+| Zend.tests.multibyte.multibyte_encoding_001
+| Zend.tests.multibyte.multibyte_encoding_004
+| Zend.tests.multibyte.multibyte_encoding_005
+# token_get_all bug (https://bugs.php.net/bug.php?id=60097)
+| Zend.tests.bug47516
+# pretty print difference due to INF vs 1e1000
+| ext.standard.tests.general_functions.bug27678
+| tests.lang.bug24640
+)\.phpt$~x', $file)) {
+            continue;
+        }
+
+        if (!preg_match('~--FILE--\s*(.*?)--[A-Z]+--~s', $code, $matches)) {
+            continue;
+        }
+        if (preg_match('~--EXPECT(?:F|REGEX)?--\s*(?:Parse|Fatal) error~', $code)) {
+            continue;
+        }
+
+        $code = $matches[1];
+    }
+
+    set_time_limit(10);
+
+    ++$count;
+
+    if ($SHOW_PROGRESS) {
+        echo substr(str_pad('Testing file ' . $count . ': ' . substr($file, strlen($DIR)), 79), 0, 79), "\r";
+    }
+
+    try {
+        $startTime = microtime(true);
+        $stmts = $parser->parse($code);
+        $parseTime += microtime(true) - $startTime;
+
+        $startTime = microtime(true);
+        $code = 'prettyPrint($stmts);
+        $ppTime += microtime(true) - $startTime;
+
+        try {
+            $startTime = microtime(true);
+            $ppStmts = $parser->parse($code);
+            $reparseTime += microtime(true) - $startTime;
+
+            $startTime = microtime(true);
+            $same = $nodeDumper->dump($stmts) == $nodeDumper->dump($ppStmts);
+            $compareTime += microtime(true) - $startTime;
+
+            if (!$same) {
+                echo $file, ":\n    Result of initial parse and parse after pretty print differ\n";
+
+                ++$compareFail;
+            }
+        } catch (PhpParser\Error $e) {
+            echo $file, ":\n    Parse of pretty print failed with message: {$e->getMessage()}\n";
+
+            ++$ppFail;
+        }
+    } catch (PhpParser\Error $e) {
+        echo $file, ":\n    Parse failed with message: {$e->getMessage()}\n";
+
+        ++$parseFail;
+    }
+}
+
+if (0 === $parseFail && 0 === $ppFail && 0 === $compareFail) {
+    echo "\n\n", 'All tests passed.', "\n";
+} else {
+    echo "\n\n", '==========', "\n\n", 'There were: ', "\n";
+    if (0 !== $parseFail) {
+        echo '    ', $parseFail,   ' parse failures.',        "\n";
+    }
+    if (0 !== $ppFail) {
+        echo '    ', $ppFail,      ' pretty print failures.', "\n";
+    }
+    if (0 !== $compareFail) {
+        echo '    ', $compareFail, ' compare failures.',      "\n";
+    }
+}
+
+echo "\n",
+     'Tested files:         ', $count,        "\n",
+     "\n",
+     'Reading files took:   ', $readTime,    "\n",
+     'Parsing took:         ', $parseTime,   "\n",
+     'Pretty printing took: ', $ppTime,      "\n",
+     'Reparsing took:       ', $reparseTime, "\n",
+     'Comparing took:       ', $compareTime, "\n",
+     "\n",
+     'Total time:           ', microtime(true) - $totalStartTime, "\n",
+     'Maximum memory usage: ', memory_get_peak_usage(true), "\n";
\ No newline at end of file
diff --git a/vendor/padraic/humbug_get_contents/.gitignore b/vendor/padraic/humbug_get_contents/.gitignore
new file mode 100644
index 0000000000..17b9a74735
--- /dev/null
+++ b/vendor/padraic/humbug_get_contents/.gitignore
@@ -0,0 +1,6 @@
+/composer.phar
+/composer.lock
+/vendor/
+/vendor-bin/*/vendor/
+/vendor-bin/*/composer.lock
+/.php_cs.cache
diff --git a/vendor/padraic/humbug_get_contents/.php_cs.dist b/vendor/padraic/humbug_get_contents/.php_cs.dist
new file mode 100644
index 0000000000..55722717e4
--- /dev/null
+++ b/vendor/padraic/humbug_get_contents/.php_cs.dist
@@ -0,0 +1,81 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+use PhpCsFixer\Config;
+use PhpCsFixer\Finder;
+
+$finder = Finder::create()
+    ->in([
+        __DIR__.'/src',
+        __DIR__.'/tests',
+    ])
+    ->append([
+        __DIR__.'/.php_cs.dist',
+    ])
+    ->exclude([
+        __DIR__.'/fixtures/Parser/files/php',
+    ])
+;
+
+return Config::create()
+    ->setRiskyAllowed(true)
+    ->setRules([
+        '@PSR2' => true,
+        'blank_line_after_opening_tag' => true,
+        'blank_line_before_return' => true,
+        'cast_spaces' => true,
+        'combine_consecutive_unsets' => true,
+        'declare_equal_normalize' => true,
+        'declare_strict_types' => false,
+        'heredoc_to_nowdoc' => true,
+        'include' => true,
+        'header_comment' => [
+            'location' => 'after_open',
+            'header' => <<<'LICENSE'
+This file is part of the Humbug package.
+
+(c) 2015 Pádraic Brady 
+
+For the full copyright and license information, please view the LICENSE
+file that was distributed with this source code.
+LICENSE
+        ],
+        'lowercase_cast' => true,
+        'method_separation' => true,
+        'modernize_types_casting' => true,
+        'native_function_casing' => true,
+        'new_with_braces' => true,
+        'no_blank_lines_after_class_opening' => true,
+        'no_blank_lines_after_phpdoc' => true,
+        'no_empty_comment' => true,
+        'no_empty_phpdoc' => true,
+        'no_empty_statement' => true,
+        'no_leading_import_slash' => true,
+        'no_leading_namespace_whitespace' => true,
+        'no_multiline_whitespace_around_double_arrow' => true,
+        'no_short_bool_cast' => true,
+        'no_spaces_around_offset' => true,
+        'no_unused_imports' => true,
+        'ordered_imports' => true,
+        'phpdoc_order' => true,
+        'phpdoc_scalar' => true,
+        'phpdoc_separation' => true,
+        'phpdoc_trim' => true,
+        'php_unit_fqcn_annotation' => true,
+        'php_unit_test_class_requires_covers' => true,
+        'single_quote' => true,
+        'space_after_semicolon' => true,
+        'standardize_not_equals' => true,
+        'trim_array_spaces' => true,
+        'whitespace_after_comma_in_array' => true,
+    ])
+    ->setFinder($finder)
+    ;
diff --git a/vendor/padraic/humbug_get_contents/.travis.yml b/vendor/padraic/humbug_get_contents/.travis.yml
new file mode 100644
index 0000000000..7c42278f0c
--- /dev/null
+++ b/vendor/padraic/humbug_get_contents/.travis.yml
@@ -0,0 +1,31 @@
+language: php
+
+php:
+  - '5.4'
+  - '5.5'
+  - '5.6'
+  - '7.0'
+  - '7.1'
+  - '7.2'
+  - nightly
+
+matrix:
+  include:
+    - php: 5.3
+      dist: precise
+  fast_finish: true
+  allow_failures:
+    - php: nightly
+
+cache:
+  directories:
+    - $HOME/.composer/cache/files
+
+before_script:
+    - composer install --no-interaction --prefer-dist
+
+script:
+    - php -d zend.enable_gc=0 vendor/bin/phpunit --coverage-text
+
+notifications:
+  email: false
diff --git a/vendor/padraic/humbug_get_contents/CONTRIBUTING.md b/vendor/padraic/humbug_get_contents/CONTRIBUTING.md
new file mode 100644
index 0000000000..facd3790da
--- /dev/null
+++ b/vendor/padraic/humbug_get_contents/CONTRIBUTING.md
@@ -0,0 +1,16 @@
+## Contributing
+
+Set up:
+
+* Clone the project
+* `composer install && composer bin all install`
+
+The project provides a `Makefile` in which the most common commands have been
+registered such as fixing the coding style or running the test.
+
+```bash
+make
+# or
+make help
+=> will print the list of available commands
+```
diff --git a/vendor/padraic/humbug_get_contents/LICENSE b/vendor/padraic/humbug_get_contents/LICENSE
new file mode 100644
index 0000000000..4599dd5fbf
--- /dev/null
+++ b/vendor/padraic/humbug_get_contents/LICENSE
@@ -0,0 +1,28 @@
+Copyright (c) 2015, Pádraic Brady
+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 Pádraic Brady, Humbug, 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 HOLDER 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/padraic/humbug_get_contents/Makefile b/vendor/padraic/humbug_get_contents/Makefile
new file mode 100644
index 0000000000..4b7ee3e326
--- /dev/null
+++ b/vendor/padraic/humbug_get_contents/Makefile
@@ -0,0 +1,41 @@
+PHP_CS_FIXER=php -d zend.enable_gc=0 vendor-bin/php-cs-fixer/vendor/bin/php-cs-fixer
+PHPUNIT=php -d zend.enable_gc=0 vendor/bin/phpunit
+
+.DEFAULT_GOAL := help
+.PHONY: test tu cs
+
+
+help:
+	@fgrep -h "##" $(MAKEFILE_LIST) | fgrep -v fgrep | sed -e 's/\\$$//' | sed -e 's/##//'
+
+
+##
+## Tests
+##---------------------------------------------------------------------------
+
+test:           ## Run all the tests
+test: tu
+
+tu:             ## Run the tests for the core library
+tu: vendor
+	$(PHPUNIT)
+
+
+##
+## Code Style
+##---------------------------------------------------------------------------
+
+cs:             ## Run the CS Fixer
+cs:	vendor
+	$(PHP_CS_FIXER) fix
+
+
+##
+## Rules from files
+##---------------------------------------------------------------------------
+
+vendor: composer.lock
+	composer install
+
+composer.lock: composer.json
+	@echo compose.lock is not up to date.
diff --git a/vendor/padraic/humbug_get_contents/README.md b/vendor/padraic/humbug_get_contents/README.md
new file mode 100644
index 0000000000..2729e83cf0
--- /dev/null
+++ b/vendor/padraic/humbug_get_contents/README.md
@@ -0,0 +1,83 @@
+# humbug_get_contents
+
+[![Package version](https://img.shields.io/packagist/v/padraic/humbug_get_contents.svg?style=flat-square)](https://packagist.org/packages/padraic/humbug_get_contents)
+[![Build Status](https://img.shields.io/travis/humbug/file_get_contents.svg?branch=master&style=flat-square)](https://travis-ci.org/humbug/file_get_contents?branch=master)
+[![Slack](https://img.shields.io/badge/slack-%23humbug-red.svg?style=flat-square)](https://symfony.com/slack-invite)
+[![License](https://img.shields.io/badge/license-MIT-red.svg?style=flat-square)](LICENSE)
+
+Defines a `Humbug\get_contents()` function that will transparently call `file_get_contents()`,
+except for HTTPS URIs where it will inject a context configured to enable secure
+SSL/TLS requests on all versions of PHP 5.3+.
+
+All versions of PHP below 5.6 not only disable SSL/TLS protections by default, but
+have most other default options set insecurely. This has led to
+the spread of insecure uses of `file_get_contents()` to retrieve HTTPS resources. For example,
+PHAR files or API requests. Without SSL/TLS protections, all such requests are vulnerable
+to Man-In-The-Middle attacks where a hacker can inject a fake response, e.g. a tailored php
+file or json response.
+
+## Installation
+
+```bash
+composer require padraic/humbug_get_contents
+```
+
+
+## Usage
+
+```php
+$content = Humbug\get_contents('https://www.howsmyssl.com/a/check');
+```
+
+You can use this function as an immediate alternative to `file_get_contents()` in any code
+location where HTTP requests are probable.
+
+This solution was originally implemented within the Composer Installer, so this is a
+straightforward extraction of that code into a standalone package with just the one function.
+It borrows functions from both Composer and Sslurp.
+
+In rare cases, this function will complain when attempting to retrieve HTTPS URIs. This is
+actually the point ;). An error should have two causes:
+
+* A valid cafile could not be located, i.e. your server is misconfigured or missing a package
+* The URI requested could not be verified, i.e. in a browser this would be a red page warning.
+
+Neither is, in any way, a justification for disabling SSL/TLS and leaving end users vulnerable
+to getting hacked. Resolve such errors; don't ignore or workaround them.
+
+
+## Headers
+
+You can set request headers, and get response headers, using the following functions.
+This support is based around stream contexts, but is offered in some limited form
+here as a convenience. If your needs are going to extend this, you should use a
+more complete solution and double check that it fully enables and supports TLS.
+
+```php
+// Don't end headers with \r\n when setting via array
+Humbug\set_headers([
+    'Accept-Language: da',
+    'User-Agent: Humbug',
+]);
+
+$response = Humbug\get_contents('http://www.example.com');
+```
+
+Request headers are emptied when used, so you would need to reset on each
+`Humbug\get_contents()` call.
+
+To retrieve an array of the last response headers:
+
+```php
+$response = Humbug\get_contents('http://www.example.com');
+$headers = Humbug\get_headers();
+```
+
+## Upgrade
+
+[Upgrade Guide](UPGRADE.md)
+
+
+## Contributing
+
+[Contribution Guide](CONTRIBUTING.md)
diff --git a/vendor/padraic/humbug_get_contents/UPGRADE.md b/vendor/padraic/humbug_get_contents/UPGRADE.md
new file mode 100644
index 0000000000..eaf52b22b0
--- /dev/null
+++ b/vendor/padraic/humbug_get_contents/UPGRADE.md
@@ -0,0 +1,8 @@
+## Upgrade from 1.x to 2.x
+
+The functions previously registered in the global namespace have been
+moved to the `Humbug` namespace:
+
+* `humbug_get_contents()` => `Humbug\get_contents()`
+* `humbug_set_headers()` => `Humbug\set_headers()`
+* `humbug_get_headers()` => `Humbug\get_headers()`
diff --git a/vendor/padraic/humbug_get_contents/composer.json b/vendor/padraic/humbug_get_contents/composer.json
new file mode 100644
index 0000000000..42a8c548ec
--- /dev/null
+++ b/vendor/padraic/humbug_get_contents/composer.json
@@ -0,0 +1,57 @@
+{
+    "name": "padraic/humbug_get_contents",
+    "description": "Secure wrapper for accessing HTTPS resources with file_get_contents for PHP 5.3+",
+    "keywords": ["file_get_contents", "download", "ssl", "tls", "https", "http"],
+    "homepage": "https://github.com/padraic/file_get_contents",
+    "type": "library",
+    "license": "BSD-3-Clause",
+    "authors": [
+        {
+            "name": "Pádraic Brady",
+            "email": "padraic.brady@gmail.com",
+            "homepage": "http://blog.astrumfutura.com"
+        },
+        {
+            "name": "Théo Fidry",
+            "email": "theo.fidry@gmail.com"
+        }
+    ],
+
+    "require": {
+        "php": "^5.3 || ^7.0 || ^7.1 || ^7.2",
+        "ext-openssl": "*",
+        "composer/ca-bundle": "^1.0"
+    },
+    "require-dev": {
+        "bamarni/composer-bin-plugin": "^1.1",
+        "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5",
+        "mikey179/vfsStream": "^1.6"
+    },
+
+    "autoload": {
+        "psr-4": {
+            "Humbug\\": "src/"
+        },
+        "files": [
+            "src/function.php",
+            "src/functions.php"
+        ]
+    },
+    "autoload-dev": {
+        "psr-4": {
+            "Humbug\\Test\\": "tests/Humbug/Test/"
+        }
+    },
+
+    "config": {
+        "sort-packages": true
+    },
+    "extra": {
+        "bamarni-bin": {
+            "bin-links": false
+        },
+        "branch-alias": {
+            "dev-master": "2.0-dev"
+        }
+    }
+}
diff --git a/vendor/padraic/humbug_get_contents/phpunit.xml.dist b/vendor/padraic/humbug_get_contents/phpunit.xml.dist
new file mode 100644
index 0000000000..a44449b82d
--- /dev/null
+++ b/vendor/padraic/humbug_get_contents/phpunit.xml.dist
@@ -0,0 +1,28 @@
+
+
+
+
+    
+        
+            tests/Humbug/
+        
+    
+
+    
+        
+            ./src/
+        
+    
+    
+
\ No newline at end of file
diff --git a/vendor/padraic/humbug_get_contents/src/FileGetContents.php b/vendor/padraic/humbug_get_contents/src/FileGetContents.php
new file mode 100644
index 0000000000..3cbc6819f7
--- /dev/null
+++ b/vendor/padraic/humbug_get_contents/src/FileGetContents.php
@@ -0,0 +1,367 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Humbug;
+
+use Composer\CaBundle\CaBundle;
+use RuntimeException;
+
+/**
+ * This is largely extracted from the Composer Installer where originally implemented.
+ */
+class FileGetContents
+{
+    /**
+     * @var array|null
+     *
+     * @private
+     */
+    protected static $lastResponseHeaders;
+
+    /**
+     * @var array|null
+     *
+     * @private
+     */
+    protected static $nextRequestHeaders;
+
+    protected $options = array('http' => array());
+
+    public function __construct()
+    {
+        $options = $this->getTlsStreamContextDefaults(null);
+        $this->options = array_replace_recursive($this->options, $options);
+    }
+
+    /**
+     * @param string              $filename Name of the file to read.
+     * @param resource|array|null $context A valid context resource created with `stream_context_create()`. If you don't
+     *                                     need to use a custom context, you can skip this parameter.
+     *
+     * @return bool|string The read data or `false` on failure.
+     */
+    public function get($filename, $context = null)
+    {
+        $context = $this->getStreamContext($filename);
+        $context = self::setHttpHeaders($context);
+
+        $result = file_get_contents($filename, null, $context);
+
+        self::setLastResponseHeaders($http_response_header);
+
+        return $result;
+    }
+
+    /**
+     * @param array $headers HTTP response headers.
+     *
+     * @final Since 1.1.0
+     */
+    public static function setLastResponseHeaders($headers)
+    {
+        self::$lastResponseHeaders = $headers;
+    }
+
+    /**
+     * @return array|null HTTP response headers for the last response recorded or `null` if none has been recorded.
+     *
+     * @final Since 1.1.0
+     */
+    public static function getLastResponseHeaders()
+    {
+        return self::$lastResponseHeaders;
+    }
+
+    /**
+     * @param array $headers An indexed or associative array.
+     *
+     * @final since 1.1.0
+     */
+    public static function setNextRequestHeaders(array $headers)
+    {
+        self::$nextRequestHeaders = $headers;
+    }
+
+    /**
+     * @return bool
+     *
+     * @final since 1.1.0
+     */
+    public static function hasNextRequestHeaders()
+    {
+        return null !== self::$nextRequestHeaders;
+    }
+
+    /**
+     * @return array|null An indexed or associative array whence there is any headers, `null` otherwise.
+     */
+    public static function getNextRequestHeaders()
+    {
+        $return = self::$nextRequestHeaders;
+        self::$nextRequestHeaders = null;
+
+        return $return;
+    }
+
+    /**
+     * @param resource|array|null $context A valid context resource created with `stream_context_create()`. If you don't
+     *                                     need to use a custom context, you can skip this parameter.
+     *
+     * @return resource|array|null Context to which the headers has been set.
+     *
+     * @private since 1.1.0
+     *
+     * TODO (2.0.0): change the name to reflect on the immutable side.
+     */
+    public static function setHttpHeaders($context)
+    {
+        $headers = self::getNextRequestHeaders();
+
+        if (empty($headers)) {
+            return $context;
+        }
+
+        $options = stream_context_get_options($context);
+        if (!isset($options['http'])) {
+            $options['http'] = array('header' => array());
+        } elseif (!isset($options['http']['header'])) {
+            $options['http']['header'] = array();
+        } elseif (is_string($options['http']['header'])) {
+            $options['http']['header'] = explode("\r\n", $options['http']['header']);
+        }
+
+        $headers = empty($options['http']['headers']) ? $headers : array_merge($options['http']['headers'], $headers);
+
+        stream_context_set_option(
+            $context,
+            'http',
+            'header',
+            $headers
+        );
+
+        return $context;
+    }
+
+    /**
+     * @param string $url URL path to access to the file to read.
+     *
+     * @return resource
+     *
+     * @final since 1.1.0
+     */
+    protected function getStreamContext($url)
+    {
+        $host = parse_url($url, PHP_URL_HOST);
+
+        if (PHP_VERSION_ID < 50600) {
+            $this->options['ssl']['CN_match'] = $host;
+            $this->options['ssl']['SNI_server_name'] = $host;
+        }
+
+        return $this->getMergedStreamContext($url);
+    }
+
+    /**
+     * @param string $cafile
+     *
+     * @return array
+     *
+     * @private since 1.1.0
+     *
+     * TODO (2.0.0): remove argument (unnused in the codebase) and rename this method as an `init*` as is used in the
+     *               constructor anymore
+     */
+    protected function getTlsStreamContextDefaults($cafile)
+    {
+        $ciphers = implode(':', array(
+            'ECDHE-RSA-AES128-GCM-SHA256',
+            'ECDHE-ECDSA-AES128-GCM-SHA256',
+            'ECDHE-RSA-AES256-GCM-SHA384',
+            'ECDHE-ECDSA-AES256-GCM-SHA384',
+            'DHE-RSA-AES128-GCM-SHA256',
+            'DHE-DSS-AES128-GCM-SHA256',
+            'kEDH+AESGCM',
+            'ECDHE-RSA-AES128-SHA256',
+            'ECDHE-ECDSA-AES128-SHA256',
+            'ECDHE-RSA-AES128-SHA',
+            'ECDHE-ECDSA-AES128-SHA',
+            'ECDHE-RSA-AES256-SHA384',
+            'ECDHE-ECDSA-AES256-SHA384',
+            'ECDHE-RSA-AES256-SHA',
+            'ECDHE-ECDSA-AES256-SHA',
+            'DHE-RSA-AES128-SHA256',
+            'DHE-RSA-AES128-SHA',
+            'DHE-DSS-AES128-SHA256',
+            'DHE-RSA-AES256-SHA256',
+            'DHE-DSS-AES256-SHA',
+            'DHE-RSA-AES256-SHA',
+            'AES128-GCM-SHA256',
+            'AES256-GCM-SHA384',
+            'AES128-SHA256',
+            'AES256-SHA256',
+            'AES128-SHA',
+            'AES256-SHA',
+            'AES',
+            'CAMELLIA',
+            'DES-CBC3-SHA',
+            '!aNULL',
+            '!eNULL',
+            '!EXPORT',
+            '!DES',
+            '!RC4',
+            '!MD5',
+            '!PSK',
+            '!aECDH',
+            '!EDH-DSS-DES-CBC3-SHA',
+            '!EDH-RSA-DES-CBC3-SHA',
+            '!KRB5-DES-CBC3-SHA',
+            '!ADH'
+        ));
+
+        $options = array(
+            'ssl' => array(
+                'ciphers' => $ciphers,
+                'verify_peer' => true,
+                'verify_depth' => 7,
+                'SNI_enabled' => true,
+            )
+        );
+
+        if (!$cafile) {
+            $cafile = CaBundle::getSystemCaRootBundlePath();
+        }
+        if (is_dir($cafile)) {
+            $options['ssl']['capath'] = $cafile;
+        } elseif ($cafile) {
+            $options['ssl']['cafile'] = $cafile;
+        } else {
+            throw new RuntimeException('A valid cafile could not be located locally.');
+        }
+
+        if (version_compare(PHP_VERSION, '5.4.13') >= 0) {
+            $options['ssl']['disable_compression'] = true;
+        }
+
+        return $options;
+    }
+
+    /**
+     * Function copied from Composer\Util\StreamContextFactory::getContext
+     *
+     * This function is part of Composer.
+     *
+     * (c) Nils Adermann 
+     *     Jordi Boggiano 
+     *
+     * @param string $url URL the context is to be used for
+     *
+     * @throws \RuntimeException If https proxy required and OpenSSL uninstalled
+     *
+     * @return resource Default context
+     *
+     * @final since 1.1.0
+     */
+    protected function getMergedStreamContext($url)
+    {
+        $options = $this->options;
+
+        // See CVE-2016-5385, due to (emulation of) header copying with PHP web SAPIs into HTTP_* variables,
+        // HTTP_PROXY can be set by an user to any value he wants by setting the Proxy header.
+        // Mitigate the vulnerability by only allowing CLI SAPIs to use HTTP(S)_PROXY environment variables.
+        if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
+            // Handle system proxy
+            if (!empty($_SERVER['HTTP_PROXY']) || !empty($_SERVER['http_proxy'])) {
+                // Some systems seem to rely on a lowercased version instead...
+                $proxy = parse_url(!empty($_SERVER['http_proxy']) ? $_SERVER['http_proxy'] : $_SERVER['HTTP_PROXY']);
+            }
+        }
+
+        if (!empty($proxy)) {
+            $proxyURL = isset($proxy['scheme']) ? $proxy['scheme'].'://' : '';
+            $proxyURL .= isset($proxy['host']) ? $proxy['host'] : '';
+
+            if (isset($proxy['port'])) {
+                $proxyURL .= ':'.$proxy['port'];
+            } elseif ('http://' == substr($proxyURL, 0, 7)) {
+                $proxyURL .= ':80';
+            } elseif ('https://' == substr($proxyURL, 0, 8)) {
+                $proxyURL .= ':443';
+            }
+
+            // http(s):// is not supported in proxy
+            $proxyURL = str_replace(array('http://', 'https://'), array('tcp://', 'ssl://'), $proxyURL);
+
+            if (0 === strpos($proxyURL, 'ssl:') && !extension_loaded('openssl')) {
+                throw new RuntimeException('You must enable the openssl extension to use a proxy over https');
+            }
+
+            $options['http'] = array(
+                'proxy' => $proxyURL,
+            );
+
+            // enabled request_fulluri unless it is explicitly disabled
+            switch (parse_url($url, PHP_URL_SCHEME)) {
+                case 'http': // default request_fulluri to true
+                    $reqFullUriEnv = getenv('HTTP_PROXY_REQUEST_FULLURI');
+                    if ($reqFullUriEnv === false || $reqFullUriEnv === '' || (strtolower($reqFullUriEnv) !== 'false' && (bool) $reqFullUriEnv)) {
+                        $options['http']['request_fulluri'] = true;
+                    }
+                    break;
+                case 'https': // default request_fulluri to true
+                    $reqFullUriEnv = getenv('HTTPS_PROXY_REQUEST_FULLURI');
+                    if ($reqFullUriEnv === false || $reqFullUriEnv === '' || (strtolower($reqFullUriEnv) !== 'false' && (bool) $reqFullUriEnv)) {
+                        $options['http']['request_fulluri'] = true;
+                    }
+                    break;
+            }
+
+
+            if (isset($proxy['user'])) {
+                $auth = urldecode($proxy['user']);
+                if (isset($proxy['pass'])) {
+                    $auth .= ':'.urldecode($proxy['pass']);
+                }
+                $auth = base64_encode($auth);
+
+                $options['http']['header'] = "Proxy-Authorization: Basic {$auth}\r\n";
+            }
+        }
+
+        return stream_context_create($options);
+    }
+
+    /**
+     * @deprecated since 1.1.0 and will be removed in 2.0.0.
+     */
+    public static function getSystemCaRootBundlePath()
+    {
+        @trigger_error(
+            'Deprecated since 1.1.0. Use `Composer\CaBundle\CaBundle::getSystemCaRootBundlePath()` instead.',
+            E_USER_DEPRECATED
+        );
+
+        return CaBundle::getSystemCaRootBundlePath();
+    }
+
+    /**
+     * @deprecated since 1.1.0 and will be removed in 2.0.0.
+     */
+    protected static function validateCaFile($contents)
+    {
+        // Assumes the CA is valid if PHP is vulnerable to
+        // https://www.sektioneins.de/advisories/advisory-012013-php-openssl_x509_parse-memory-corruption-vulnerability.html
+        if (!CaBundle::isOpensslParseSafe()) {
+            return !empty($contents);
+        }
+
+        return (bool) openssl_x509_parse($contents);
+    }
+}
diff --git a/vendor/padraic/humbug_get_contents/src/function.php b/vendor/padraic/humbug_get_contents/src/function.php
new file mode 100644
index 0000000000..4b582a7689
--- /dev/null
+++ b/vendor/padraic/humbug_get_contents/src/function.php
@@ -0,0 +1,49 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+if (!function_exists('humbug_get_contents')) {
+    function humbug_get_contents($filename, $use_include_path = false, $context = null)
+    {
+        @trigger_error(
+            'humbug_get_contents() is deprecated since 1.1.0 and will be removed in 2.0.0. Use '
+            .'Humbug/get_contents() instead.',
+            E_USER_DEPRECATED
+        );
+
+        return Humbug\get_contents($filename, $use_include_path, $context);
+    }
+}
+
+if (!function_exists('humbug_get_headers')) {
+    function humbug_get_headers()
+    {
+        @trigger_error(
+            'humbug_get_headers() is deprecated since 1.1.0 and will be removed in 2.0.0. Use '
+            .'Humbug/get_headers() instead.',
+            E_USER_DEPRECATED
+        );
+
+        return Humbug\get_headers();
+    }
+}
+
+if (!function_exists('humbug_set_headers')) {
+    function humbug_set_headers(array $headers)
+    {
+        @trigger_error(
+            'humbug_set_headers() is deprecated since 1.1.0 and will be removed in 2.0.0. Use '
+            .'Humbug/get_headers() instead.',
+            E_USER_DEPRECATED
+        );
+
+        Humbug\set_headers($headers);
+    }
+}
diff --git a/vendor/padraic/humbug_get_contents/src/functions.php b/vendor/padraic/humbug_get_contents/src/functions.php
new file mode 100644
index 0000000000..897e57a844
--- /dev/null
+++ b/vendor/padraic/humbug_get_contents/src/functions.php
@@ -0,0 +1,68 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Humbug;
+
+/**
+ * Reads entire file into a string.
+ *
+ * @param string              $filename Name of the file to read.
+ * @param bool                $use_include_path
+ * @param resource|array|null $context A valid context resource created with `stream_context_create()`. If you don't
+ *                                     need to use a custom context, you can skip this parameter.
+ *
+ * @return string|bool The read data or `false` on failure.
+ */
+function get_contents($filename, $use_include_path = false, $context = null)
+{
+    static $fileGetContents = null;
+
+    if ('https' == parse_url($filename, PHP_URL_SCHEME) && PHP_VERSION_ID < 50600) {
+        if (!isset($fileGetContents)) {
+            $fileGetContents = new FileGetContents();
+        }
+
+        return $fileGetContents->get($filename, $context);
+    } elseif (FileGetContents::hasNextRequestHeaders()) {
+        if ($context === null) {
+            $context = stream_context_create();
+        }
+
+        $context = FileGetContents::setHttpHeaders($context);
+    }
+
+    $return = file_get_contents($filename, $use_include_path, $context);
+
+    if (isset($http_response_header)) {
+        FileGetContents::setLastResponseHeaders($http_response_header);
+    }
+
+    return $return;
+}
+
+/**
+ * Fetches all the headers sent by the server in response to a HTTPS request triggered by `get_contents()`.
+ *
+ * @return array|null Returns an indexed or associative array with the headers, or `null` on failure or if no request
+ *                    has been made yet.
+ */
+function get_headers()
+{
+    return FileGetContents::getLastResponseHeaders();
+}
+
+/**
+ * @param array $headers An indexed or associative array.
+ */
+function set_headers(array $headers)
+{
+    FileGetContents::setNextRequestHeaders($headers);
+}
diff --git a/vendor/padraic/humbug_get_contents/tests/Humbug/Test/FunctionTest.php b/vendor/padraic/humbug_get_contents/tests/Humbug/Test/FunctionTest.php
new file mode 100644
index 0000000000..58ac26a79a
--- /dev/null
+++ b/vendor/padraic/humbug_get_contents/tests/Humbug/Test/FunctionTest.php
@@ -0,0 +1,88 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Humbug\Test;
+
+use PHPUnit\Framework\TestCase;
+use org\bovigo\vfs\vfsStream;
+
+class FunctionTest extends TestCase
+{
+    private static $result;
+
+    public function setup()
+    {
+        vfsStream::setup('home_root_path');
+        if (null === self::$result) {
+            $result = humbug_get_contents('https://www.howsmyssl.com/a/check');
+            self::$result = json_decode($result, true);
+        }
+    }
+
+    public function teardown()
+    {
+        self::$result = null;
+    }
+
+    public function testRating()
+    {
+        $this->assertEquals('Probably Okay', self::$result['rating']);
+    }
+
+    public function testTlsCompression()
+    {
+        $this->assertFalse(self::$result['tls_compression_supported']);
+    }
+
+    public function testSslNotUsed()
+    {
+        $this->assertEquals(stripos(self::$result['tls_version'], 'tls 1.'), 0);
+    }
+
+    public function testBeastVulnerability()
+    {
+        $this->assertFalse(self::$result['beast_vuln']);
+    }
+
+    public function testInsecureCipherSuites()
+    {
+        $this->assertEmpty(self::$result['insecure_cipher_suites']);
+    }
+
+    public function testUnknownCipherSuites()
+    {
+        $this->assertFalse(self::$result['unknown_cipher_suite_supported']);
+    }
+
+    public function testFileGetContentsWillPassThrough()
+    {
+        file_put_contents(vfsStream::url('home_root_path/humbug.tmp'), ($expected = uniqid()));
+        $this->assertEquals(file_get_contents(vfsStream::url('home_root_path/humbug.tmp')), $expected);
+    }
+
+    public function testCanGetResponseHeaders()
+    {
+        humbug_set_headers(array('Accept-Language: da\r\n'));
+        humbug_get_contents('http://padraic.github.io');
+        $this->assertTrue(count(humbug_get_headers()) > 0);
+    }
+
+    public function testCanSetRequestHeaders()
+    {
+        humbug_set_headers(array(
+            'Accept-Language: da',
+            'User-Agent: Humbug'
+        ));
+        $out = humbug_get_contents('http://www.procato.com/my+headers/');
+        $this->assertEquals(1, preg_match('%'.preg_quote('Accept-Languageda').'%', $out));
+        $this->assertEquals(1, preg_match('%'.preg_quote('User-AgentHumbug').'%', $out));
+    }
+}
diff --git a/vendor/padraic/humbug_get_contents/tests/bootstrap.php b/vendor/padraic/humbug_get_contents/tests/bootstrap.php
new file mode 100644
index 0000000000..86a0596d24
--- /dev/null
+++ b/vendor/padraic/humbug_get_contents/tests/bootstrap.php
@@ -0,0 +1,19 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+error_reporting(E_ALL);
+
+if (function_exists('date_default_timezone_set')
+&& function_exists('date_default_timezone_get')) {
+    date_default_timezone_set(@date_default_timezone_get());
+}
+
+require __DIR__ . '/../vendor/autoload.php';
diff --git a/vendor/padraic/humbug_get_contents/vendor-bin/php-cs-fixer/composer.json b/vendor/padraic/humbug_get_contents/vendor-bin/php-cs-fixer/composer.json
new file mode 100644
index 0000000000..0abe60e9ab
--- /dev/null
+++ b/vendor/padraic/humbug_get_contents/vendor-bin/php-cs-fixer/composer.json
@@ -0,0 +1,8 @@
+{
+    "require-dev": {
+        "friendsofphp/php-cs-fixer": "^2.3"
+    },
+    "config": {
+        "sort-packages": true
+    }
+}
diff --git a/vendor/padraic/phar-updater/.gitignore b/vendor/padraic/phar-updater/.gitignore
new file mode 100644
index 0000000000..dfdf5d9d06
--- /dev/null
+++ b/vendor/padraic/phar-updater/.gitignore
@@ -0,0 +1,4 @@
+composer.lock
+vendor
+humbuglog.txt
+humbuglog.json
diff --git a/vendor/padraic/phar-updater/.php_cs b/vendor/padraic/phar-updater/.php_cs
new file mode 100644
index 0000000000..5780903ba7
--- /dev/null
+++ b/vendor/padraic/phar-updater/.php_cs
@@ -0,0 +1,10 @@
+exclude('vendor')
+    ->exclude('tests/Humbug/Test/SelfUpdate/_files')
+    ->in(__DIR__);
+
+return Symfony\CS\Config\Config::create()
+    ->level('psr2')
+    ->finder($finder);
\ No newline at end of file
diff --git a/vendor/padraic/phar-updater/.travis.yml b/vendor/padraic/phar-updater/.travis.yml
new file mode 100644
index 0000000000..6211cde1d2
--- /dev/null
+++ b/vendor/padraic/phar-updater/.travis.yml
@@ -0,0 +1,25 @@
+language: php
+
+php:
+    - 7.0
+    - 5.6
+    - 5.5
+    - 5.4
+    - 5.3
+    - 5.3.3
+    - hhvm
+    - hhvm-nightly
+
+matrix:
+    allow_failures:
+        - php: hhvm
+        - php: hhvm-nightly
+
+before_install:
+    - composer self-update
+
+before_script:
+    - travis_retry composer install --no-interaction --prefer-source
+
+script:
+    - vendor/bin/phpunit --coverage-text
diff --git a/vendor/padraic/phar-updater/LICENSE b/vendor/padraic/phar-updater/LICENSE
new file mode 100644
index 0000000000..b00aea335d
--- /dev/null
+++ b/vendor/padraic/phar-updater/LICENSE
@@ -0,0 +1,27 @@
+Copyright (c) 2015, Pádraic Brady
+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 Pádraic Brady, Humbug, 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 HOLDER 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.
\ No newline at end of file
diff --git a/vendor/padraic/phar-updater/README.md b/vendor/padraic/phar-updater/README.md
new file mode 100644
index 0000000000..95b0634a8e
--- /dev/null
+++ b/vendor/padraic/phar-updater/README.md
@@ -0,0 +1,378 @@
+PHAR Updater
+============
+
+[![Build Status](https://travis-ci.org/padraic/phar-updater.svg?branch=master)](https://travis-ci.org/padraic/phar-updater)
+
+You have a phar file to distribute, and it's all the rage to include a self-update
+command. Do you really need to write that? Here at Humbug Central, our army of
+minions (all ten of them) have written one for you.
+
+**Table of Contents**
+
+- [Introduction](#introduction)
+- [Installation](#installation)
+- [Usage](#usage)
+    - [Basic SHA-1 Strategy](#basic-sha-1-strategy)
+    - [Github Release Strategy](#github-release-strategy)
+    - [Rollback Support](#rollback-support)
+    - [Constructor Parameters](#constructor-parameters)
+    - [Check For Updates](#check-for-updates)
+    - [Avoid Post Update File Includes](#avoid-post-update-file-includes)
+    - [Custom Update Strategies](#custom-update-strategies)
+- [Update Strategies](#update-strategies)
+    - [SHA-1 Hash Synchronisation](sha-1-hash-synchronisation)
+    - [Github Releases](#github-releases)
+
+Introduction
+============
+
+The `humbug\phar-updater` package has the following features:
+
+* Full support for SSL/TLS verification.
+* Support for OpenSSL phar signatures.
+* Simple API where it either updates or Exceptions will go wild.
+* Support for SHA-1 version synchronisation and Github Releases as update strategies.
+
+Apart from the detailed documentation below, you can find the package being used
+in almost every possible way within [Humbug's self-update command](https://github.com/padraic/humbug/blob/master/src/Command/SelfUpdate.php) as part of a `Symfony Console`
+based PHAR which you may freely reuse.
+
+Installation
+============
+
+```
+composer require padraic/phar-updater
+```
+
+The package utilises PHP Streams for remote requests so it will require the openssl
+extension and the `allow_url_open` setting to both be enabled. Support for curl
+will follow in time.
+
+Usage
+=====
+
+The default update strategy uses an SHA-1 hash of the current remote phar in a
+version file, and will update the local phar when this version is changed. There
+is also a Github strategy which tracks Github Releases where you can upload a
+new phar file for a release.
+
+### Basic SHA-1 Strategy
+
+Create your self-update command, or even an update command for some other phar
+other than the current one, and include this.
+
+```php
+/**
+ * The simplest usage assumes the currently running phar is to be updated and
+ * that it has been signed with a private key (using OpenSSL).
+ *
+ * The first constructor parameter is the path to a phar if you are not updating
+ * the currently running phar.
+ */
+
+use Humbug\SelfUpdate\Updater;
+
+$updater = new Updater();
+$updater->getStrategy()->setPharUrl('https://example.com/current.phar');
+$updater->getStrategy()->setVersionUrl('https://example.com/current.version');
+try {
+    $result = $updater->update();
+    $result ? exit('Updated!') : exit('No update needed!');
+} catch (\Exception $e) {
+    exit('Well, something happened! Either an oopsie or something involving hackers.');
+}
+```
+
+If you are not signing the phar using OpenSSL:
+
+```php
+/**
+ * The second parameter to the constructor must be false if your phars are
+ * not signed using OpenSSL.
+ */
+
+use Humbug\SelfUpdate\Updater;
+
+$updater = new Updater(null, false);
+$updater->getStrategy()->setPharUrl('https://example.com/current.phar');
+$updater->getStrategy()->setVersionUrl('https://example.com/current.version');
+try {
+    $result = $updater->update();
+    $result ? exit('Updated!') : exit('No update needed!');
+} catch (\Exception $e) {
+    exit('Well, something happened! Either an oopsie or something involving hackers.');
+}
+```
+
+If you need version information:
+
+```php
+use Humbug\SelfUpdate\Updater;
+
+$updater = new Updater();
+$updater->getStrategy()->setPharUrl('https://example.com/current.phar');
+$updater->getStrategy()->setVersionUrl('https://example.com/current.version');
+try {
+    $result = $updater->update();
+    if ($result) {
+        $new = $updater->getNewVersion();
+        $old = $updater->getOldVersion();
+        exit(sprintf(
+            'Updated from SHA-1 %s to SHA-1 %s', $old, $new
+        ));
+    } else {
+        exit('No update needed!')
+    }
+} catch (\Exception $e) {
+    exit('Well, something happened! Either an oopsie or something involving hackers.');
+}
+```
+
+See the Update Strategies section for an overview of how to setup the SHA-1
+strategy. It's a simple to maintain choice for development or nightly versions of
+phars which are released to a specific numbered version.
+
+### Github Release Strategy
+
+Beyond development or nightly phars, if you are released numbered versions on
+Github (i.e. tags), you can upload additional files (such as phars) to include in
+the Github Release.
+
+```php
+/**
+ * Other than somewhat different setters for the strategy, all other operations
+ * are identical.
+ */
+
+use Humbug\SelfUpdate\Updater;
+
+$updater = new Updater();
+$updater->setStrategy(Updater::STRATEGY_GITHUB);
+$updater->getStrategy()->setPackageName('myvendor/myapp');
+$updater->getStrategy()->setPharName('myapp.phar');
+$updater->getStrategy()->setCurrentLocalVersion('v1.0.1');
+try {
+    $result = $updater->update();
+    $result ? exit('Updated!') : exit('No update needed!');
+} catch (\Exception $e) {
+    exit('Well, something happened! Either an oopsie or something involving hackers.');
+}
+```
+
+Package name refers to the name used by Packagist, and phar name is the phar's
+file name assumed to be constant across versions.
+
+It's left to the implementation to supply the current release version associated
+with the local phar. This needs to be stored within the phar and should match
+the version string used by Github. This can follow any standard practice with
+recognisable pre- and postfixes, e.g.
+`v1.0.3`, `1.0.3`, `1.1`, `1.3rc`, `1.3.2pl2`.
+
+If you wish to update to a non-stable version, for example where users want to
+update according to a development track, you can set the stability flag for the
+Github strategy. By default this is set to `stable` or, in constant form,
+`\Humbug\SelfUpdate\Strategy\GithubStrategy::STABLE`:
+
+```php
+$updater->getStrategy()->setStability('unstable');
+```
+
+If you want to ignore stability and just update to the most recent version regardless:
+
+```php
+$updater->getStrategy()->setStability('any');
+```
+
+### Rollback Support
+
+The Updater automatically copies a backup of the original phar to myname-old.phar.
+You can trigger a rollback quite easily using this convention:
+
+```php
+use Humbug\SelfUpdate\Updater;
+
+/**
+ * Same constructor parameters as you would use for updating. Here, just defaults.
+ */
+$updater = new Updater();
+try {
+    $result = $updater->rollback();
+    $result ? exit('Success!') : exit('Failure!');
+} catch (\Exception $e) {
+    exit('Well, something happened! Either an oopsie or something involving hackers.');
+}
+```
+
+As users may have diverse requirements in naming and locating backups, you can
+explicitly manage the precise path to where a backup should be written, or read
+from using the `setBackupPath()` function when updating a current phar or the
+`setRestorePath()` prior to triggering a rollback. These will be used instead
+of the simple built in convention.
+
+### Constructor Parameters
+
+The Updater constructor is fairly simple. The three basic variations are:
+
+```php
+/**
+ * Default: Update currently running phar which has been signed.
+ */
+$updater = new Updater;
+```
+
+```php
+/**
+ * Update currently running phar which has NOT been signed.
+ */
+$updater = new Updater(null, false);
+```
+
+```php
+/**
+ * Use a strategy other than the default SHA Hash.
+ */
+$updater = new Updater(null, false, Updater::STRATEGY_GITHUB);
+```
+
+```php
+/**
+ * Update a different phar which has NOT been signed.
+ */
+$updater = new Updater('/path/to/impersonatephil.phar', false);
+```
+
+### Check For Updates
+
+You can tell users what updates are available, across any stability track, by making
+use of the `hasUpdate` method. This gets the most recent remote version for a
+stability level, compares it to the current version, and returns a simple true/false
+result, i.e. it will only be false where the local version is identical or where
+there was no remote version for that stability level at all. You can easily
+differentiate between the two false states as the new version will be a string
+where a version did exist, but `false` if not.
+
+```php
+use Humbug\SelfUpdate\Updater;
+
+/**
+ * Configuration is identical in every way for actual updates. You can run this
+ * across multiple configuration variants to get recent stable, unstable, and dev
+ * versions available.
+ */
+$updater = new Updater();
+$updater->setStrategy(Updater::STRATEGY_GITHUB);
+$updater->getStrategy()->setPackageName('myvendor/myapp');
+$updater->getStrategy()->setPharName('myapp.phar');
+$updater->getStrategy()->setCurrentLocalVersion('v1.0.1');
+
+try {
+    $result = $updater->hasUpdate();
+    if ($result) {
+        echo(sprintf(
+            'The current stable build available remotely is: %s',
+            $updater->getNewVersion()
+        ));
+    } elseif (false === $updater->getNewVersion()) {
+        echo('There are no stable builds available.');
+    } else {
+        echo('You have the current stable build installed.');
+    }
+} catch (\Exception $e) {
+    exit('Well, something happened! Either an oopsie or something involving hackers.');
+}
+```
+
+### Avoid Post Update File Includes
+
+Updating a currently running phar is made trickier since, once replaced, attempts
+to load files from it within a process originating from an older phar is likely
+to create an `internal corruption of phar` error. For example, if you're using
+Symfony Console and have created an event dispatcher for your commands, the lazy
+loading of some event classes will have this impact.
+
+The solution is to disable or remove the dispatcher for your self-update command.
+
+In general, when writing your self-update CLI commands, either pre-load any classes
+likely needed prior to updating, or disable their loading if not essential.
+
+### Custom Update Strategies
+
+All update strategies revolve around checking for updates, and downloading updates.
+The actual work behind replacing local files and backups is handled separate.
+To create a custom strategy, you can implement `Humbug\SelfUpdate\Strategy\StrategyInterface`
+and pass a new instance of your implementation post-construction.
+
+```php
+$updater = new Updater(null, false);
+$updater->setStrategyObject(new MyStrategy);
+```
+
+The similar `setStrategy()` method is solely used to pass flags matching internal
+strategies.
+
+Update Strategies
+=================
+
+SHA-1 Hash Synchronisation
+--------------------------
+
+The phar-updater package only (that will change!) supports an update strategy
+where phars are updated according to the SHA-1 hash of the current phar file
+available remotely. This assumes the existence of only two to three remote files:
+
+* myname.phar
+* myname.version
+* myname.phar.pubkey (optional)
+
+The `myname.phar` is the most recently built phar.
+
+The `myname.version` contains the SHA-1 hash of the most recently built phar where
+the hash is the very first string (if not the only string). You can generate this
+quite easily from bash using:
+
+```sh
+sha1sum myname.phar > myname.version
+```
+
+Remember to regenerate the version file for each new phar build you want to distribute.
+Using `sha1sum` adds additional data after the hash, but it's fine since the hash is
+the first string in the file which is the only requirement.
+
+If using OpenSSL signing, which is very much recommended, you can also put the
+public key online as `myname.phar.pubkey`, for the initial installation of your
+phar. However, please note that phar-updater itself will never download this key, will
+never replace this key on your filesystem, and will never install a phar whose
+signature cannot be verified by the locally cached public key.
+
+If you need to switch keys for any reason whatsoever, users will need to manually
+download a new phar along with the new key. While that sounds extreme, it's generally
+not a good idea to allow for arbitrary key changes that occur without user knowledge.
+The openssl signing has no mechanism such as a central authority or a browser's trusted
+certificate stash with which to automate such key changes in a safe manner.
+
+
+Github Releases
+---------------
+
+When tagging new versions on Github, these are created and hosted as `Github Releases`
+which allow you to attach a changelog and additional file downloads. Using this
+Github feature allows you to attach new phars to releases, associating them with
+a version string that is published on Packagist.
+
+Taking advantage of this architecture, the Github Strategy for updating phars can
+compare the existing local phar's version against remote release versions and
+update to the most recent stable (or unstable) version from Github.
+
+At present, it's assume that phar files all bear the same name across releases,
+i.e. just a plain name like `myapp.phar` without versioning information in the
+file name. You can also upload your phar's public key in the same way. Using
+the established convention of being the phar name with `.pubkey` appended, e.g.
+`myapp.phar` would be matched with `myapp.phar.pubkey`.
+
+You can read more about Github releases [here](https://help.github.com/articles/creating-releases/).
+
+While you can draft a release, Github releases are created automatically whenever
+you create a new git tag. If you use git tagging, you can go to the matching
+release on Github, click the `Edit` button and attach files. It's recommended to
+do this as soon as possible after tagging to limit the window whereby a new
+release exists without an updated phar attached.
diff --git a/vendor/padraic/phar-updater/composer.json b/vendor/padraic/phar-updater/composer.json
new file mode 100644
index 0000000000..898f573951
--- /dev/null
+++ b/vendor/padraic/phar-updater/composer.json
@@ -0,0 +1,29 @@
+{
+    "name": "padraic/phar-updater",
+    "description": "A thing to make PHAR self-updating easy and secure.",
+    "type": "library",
+    "keywords": ["phar", "self-update", "update", "humbug"],
+    "license": "BSD-3-Clause",
+    "authors": [
+        {
+            "name": "Padraic Brady",
+            "email": "padraic.brady@gmail.com",
+            "homepage": "http://blog.astrumfutura.com"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.3",
+        "padraic/humbug_get_contents": "^1.0"
+    },
+    "require-dev": {
+        "phpunit/phpunit": "~4.0"
+    },
+    "autoload": {
+        "psr-4": { "Humbug\\SelfUpdate\\": "src/" }
+    },
+    "extra": {
+        "branch-alias": {
+            "dev-master": "1.0-dev"
+        }
+    }
+}
diff --git a/vendor/padraic/phar-updater/humbug.json.dist b/vendor/padraic/phar-updater/humbug.json.dist
new file mode 100644
index 0000000000..412f220a75
--- /dev/null
+++ b/vendor/padraic/phar-updater/humbug.json.dist
@@ -0,0 +1,11 @@
+{
+    "source": {
+        "directories": [
+            "src"
+        ]
+    },
+    "timeout": 10,
+    "logs": {
+        "text": "humbuglog.txt"
+    }
+}
\ No newline at end of file
diff --git a/vendor/padraic/phar-updater/phpunit.xml.dist b/vendor/padraic/phar-updater/phpunit.xml.dist
new file mode 100644
index 0000000000..7996279763
--- /dev/null
+++ b/vendor/padraic/phar-updater/phpunit.xml.dist
@@ -0,0 +1,27 @@
+
+
+
+
+    
+        
+            tests
+        
+    
+
+    
+        
+            src
+        
+    
+
\ No newline at end of file
diff --git a/vendor/padraic/phar-updater/src/Exception/ExceptionInterface.php b/vendor/padraic/phar-updater/src/Exception/ExceptionInterface.php
new file mode 100644
index 0000000000..3081ba1da8
--- /dev/null
+++ b/vendor/padraic/phar-updater/src/Exception/ExceptionInterface.php
@@ -0,0 +1,15 @@
+remoteUrl);
+        restore_error_handler();
+        if (false === $result) {
+            throw new HttpRequestException(sprintf(
+                'Request to URL failed: %s', $this->remoteUrl
+            ));
+        }
+
+        file_put_contents($updater->getTempPharFile(), $result);
+    }
+
+    /**
+     * Retrieve the current version available remotely.
+     *
+     * @param Updater $updater
+     * @return string|bool
+     */
+    public function getCurrentRemoteVersion(Updater $updater)
+    {
+        /** Switch remote request errors to HttpRequestExceptions */
+        set_error_handler(array($updater, 'throwHttpRequestException'));
+        $packageUrl = $this->getApiUrl();
+        $package = json_decode(humbug_get_contents($packageUrl), true);
+        restore_error_handler();
+
+        if (null === $package || json_last_error() !== JSON_ERROR_NONE) {
+            throw new JsonParsingException(
+                'Error parsing JSON package data'
+                . (function_exists('json_last_error_msg') ? ': ' . json_last_error_msg() : '')
+            );
+        }
+
+        $versions = array_keys($package['packages'][$this->getPackageName()]);
+        $versionParser = new VersionParser($versions);
+        if ($this->getStability() === self::STABLE) {
+            $this->remoteVersion = $versionParser->getMostRecentStable();
+        } elseif ($this->getStability() === self::UNSTABLE) {
+            $this->remoteVersion = $versionParser->getMostRecentUnstable();
+        } else {
+            $this->remoteVersion = $versionParser->getMostRecentAll();
+        }
+
+        /**
+         * Setup remote URL if there's an actual version to download
+         */
+        if (!empty($this->remoteVersion)) {
+            $this->remoteUrl = $this->getDownloadUrl($package);
+        }
+
+        return $this->remoteVersion;
+    }
+
+    /**
+     * Retrieve the current version of the local phar file.
+     *
+     * @param Updater $updater
+     * @return string
+     */
+    public function getCurrentLocalVersion(Updater $updater)
+    {
+        return $this->localVersion;
+    }
+
+    /**
+     * Set version string of the local phar
+     *
+     * @param string $version
+     */
+    public function setCurrentLocalVersion($version)
+    {
+        $this->localVersion = $version;
+    }
+
+    /**
+     * Set Package name
+     *
+     * @param string $name
+     */
+    public function setPackageName($name)
+    {
+        $this->packageName = $name;
+    }
+
+    /**
+     * Get Package name
+     *
+     * @return string
+     */
+    public function getPackageName()
+    {
+        return $this->packageName;
+    }
+
+    /**
+     * Set phar file's name
+     *
+     * @param string $name
+     */
+    public function setPharName($name)
+    {
+        $this->pharName = $name;
+    }
+
+    /**
+     * Get phar file's name
+     *
+     * @return string
+     */
+    public function getPharName()
+    {
+        return $this->pharName;
+    }
+
+    /**
+     * Set target stability
+     *
+     * @param string $stability
+     */
+    public function setStability($stability)
+    {
+        if ($stability !== self::STABLE && $stability !== self::UNSTABLE && $stability !== self::ANY) {
+            throw new InvalidArgumentException(
+                'Invalid stability value. Must be one of "stable", "unstable" or "any".'
+            );
+        }
+        $this->stability = $stability;
+    }
+
+    /**
+     * Get target stability
+     *
+     * @return string
+     */
+    public function getStability()
+    {
+        return $this->stability;
+    }
+
+    protected function getApiUrl()
+    {
+        return sprintf(self::API_URL, $this->getPackageName());
+    }
+
+    protected function getDownloadUrl(array $package)
+    {
+        $baseUrl = preg_replace(
+            '{\.git$}',
+            '',
+            $package['packages'][$this->getPackageName()][$this->remoteVersion]['source']['url']
+        );
+        $downloadUrl = sprintf(
+            '%s/releases/download/%s/%s',
+            $baseUrl,
+            $this->remoteVersion,
+            $this->getPharName()
+        );
+        return $downloadUrl;
+    }
+}
diff --git a/vendor/padraic/phar-updater/src/Strategy/ShaStrategy.php b/vendor/padraic/phar-updater/src/Strategy/ShaStrategy.php
new file mode 100644
index 0000000000..1999a57e04
--- /dev/null
+++ b/vendor/padraic/phar-updater/src/Strategy/ShaStrategy.php
@@ -0,0 +1,153 @@
+getPharUrl());
+        restore_error_handler();
+        if (false === $result) {
+            throw new HttpRequestException(sprintf(
+                'Request to URL failed: %s', $this->getPharUrl()
+            ));
+        }
+
+        file_put_contents($updater->getTempPharFile(), $result);
+    }
+
+    /**
+     * Retrieve the current version available remotely.
+     *
+     * @param Updater $updater
+     * @return string|bool
+     */
+    public function getCurrentRemoteVersion(Updater $updater)
+    {
+        /** Switch remote request errors to HttpRequestExceptions */
+        set_error_handler(array($updater, 'throwHttpRequestException'));
+        $version = humbug_get_contents($this->getVersionUrl());
+        restore_error_handler();
+        if (false === $version) {
+            throw new HttpRequestException(sprintf(
+                'Request to URL failed: %s', $this->getVersionUrl()
+            ));
+        }
+        if (empty($version)) {
+            throw new HttpRequestException(
+                'Version request returned empty response.'
+            );
+        }
+        if (!preg_match('%^[a-z0-9]{40}%', $version, $matches)) {
+            throw new HttpRequestException(
+                'Version request returned incorrectly formatted response.'
+            );
+        }
+
+        return $matches[0];
+    }
+
+    /**
+     * Retrieve the current version of the local phar file.
+     *
+     * @param Updater $updater
+     * @return string
+     */
+    public function getCurrentLocalVersion(Updater $updater)
+    {
+        return sha1_file($updater->getLocalPharFile());
+    }
+
+    /**
+     * Set URL to phar file
+     *
+     * @param string $url
+     */
+    public function setPharUrl($url)
+    {
+        if (!$this->validateAllowedUrl($url)) {
+            throw new InvalidArgumentException(
+                sprintf('Invalid url passed as argument: %s.', $url)
+            );
+        }
+        $this->pharUrl = $url;
+    }
+
+    /**
+     * Get URL for phar file
+     *
+     * @return string
+     */
+    public function getPharUrl()
+    {
+        return $this->pharUrl;
+    }
+
+    /**
+     * Set URL to version file
+     *
+     * @param string $url
+     */
+    public function setVersionUrl($url)
+    {
+        if (!$this->validateAllowedUrl($url)) {
+            throw new InvalidArgumentException(
+                sprintf('Invalid url passed as argument: %s.', $url)
+            );
+        }
+        $this->versionUrl = $url;
+    }
+
+    /**
+     * Get URL for version file
+     *
+     * @return string
+     */
+    public function getVersionUrl()
+    {
+        return $this->versionUrl;
+    }
+
+    protected function validateAllowedUrl($url)
+    {
+        if (filter_var($url, FILTER_VALIDATE_URL)
+        && in_array(parse_url($url, PHP_URL_SCHEME), array('http', 'https', 'file'))) {
+            return true;
+        }
+        return false;
+    }
+}
diff --git a/vendor/padraic/phar-updater/src/Strategy/StrategyInterface.php b/vendor/padraic/phar-updater/src/Strategy/StrategyInterface.php
new file mode 100644
index 0000000000..f0927e9873
--- /dev/null
+++ b/vendor/padraic/phar-updater/src/Strategy/StrategyInterface.php
@@ -0,0 +1,43 @@
+setLocalPharFile($localPharFile);
+        if (!is_bool($hasPubKey)) {
+            throw new InvalidArgumentException(
+                'Constructor parameter $hasPubKey must be boolean or null.'
+            );
+        } else {
+            $this->hasPubKey = $hasPubKey;
+        }
+        if ($this->hasPubKey) {
+            $this->setLocalPubKeyFile();
+        }
+        $this->setTempDirectory();
+        $this->setStrategy($strategy);
+    }
+
+    /**
+     * Check for update
+     *
+     * @return bool
+     */
+    public function hasUpdate()
+    {
+        $this->newVersionAvailable = $this->newVersionAvailable();
+        return $this->newVersionAvailable;
+    }
+
+    /**
+     * Perform an update
+     *
+     * @return bool
+     */
+    public function update()
+    {
+        if ($this->newVersionAvailable === false
+        || (!is_bool($this->newVersionAvailable) && !$this->hasUpdate())) {
+            return false;
+        }
+        $this->backupPhar();
+        $this->downloadPhar();
+        $this->replacePhar();
+        return true;
+    }
+
+    /**
+     * Perform an rollback to previous version
+     *
+     * @return bool
+     */
+    public function rollback()
+    {
+        if (!$this->restorePhar()) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * @param string $strategy
+     */
+    public function setStrategy($strategy)
+    {
+        switch ($strategy) {
+            case self::STRATEGY_GITHUB:
+                $this->strategy = new GithubStrategy;
+                break;
+
+            default:
+                $this->strategy = new ShaStrategy;
+                break;
+        }
+    }
+
+    public function setStrategyObject(StrategyInterface $strategy)
+    {
+        $this->strategy = $strategy;
+    }
+
+    public function getStrategy()
+    {
+        return $this->strategy;
+    }
+
+    /**
+     * Set backup extension for old phar versions
+     *
+     * @param string $extension
+     */
+    public function setBackupExtension($extension)
+    {
+        $this->backupExtension = $extension;
+    }
+
+    /**
+     * Get backup extension for old phar versions
+     *
+     * @return string
+     */
+    public function getBackupExtension()
+    {
+        return $this->backupExtension;
+    }
+
+    public function getLocalPharFile()
+    {
+        return $this->localPharFile;
+    }
+
+    public function getLocalPharFileBasename()
+    {
+        return $this->localPharFileBasename;
+    }
+
+    public function getLocalPubKeyFile()
+    {
+        return $this->localPubKeyFile;
+    }
+
+    public function getTempDirectory()
+    {
+        return $this->tempDirectory;
+    }
+
+    public function getTempPharFile()
+    {
+        return $this->getTempDirectory()
+            . '/'
+            . sprintf('%s.phar.temp', $this->getLocalPharFileBasename());
+    }
+
+    public function getNewVersion()
+    {
+        return $this->newVersion;
+    }
+
+    public function getOldVersion()
+    {
+        return $this->oldVersion;
+    }
+
+    /**
+     * Set backup path for old phar versions
+     *
+     * @param string $filePath
+     */
+    public function setBackupPath($filePath)
+    {
+        $path = realpath(dirname($filePath));
+        if (!is_dir($path)) {
+            throw new FilesystemException(sprintf(
+                'The backup directory does not exist: %s.', $path
+            ));
+        }
+        if (!is_writable($path)) {
+            throw new FilesystemException(sprintf(
+                'The backup directory is not writeable: %s.', $path
+            ));
+        }
+        $this->backupPath = $filePath;
+    }
+
+    /**
+     * Get backup path for old phar versions
+     *
+     * @return string
+     */
+    public function getBackupPath()
+    {
+        return $this->backupPath;
+    }
+
+    /**
+     * Set path for the backup phar to rollback/restore from
+     *
+     * @param string $filePath
+     */
+    public function setRestorePath($filePath)
+    {
+        $path = realpath(dirname($filePath));
+        if (!file_exists($path)) {
+            throw new FilesystemException(sprintf(
+                'The restore phar does not exist: %s.', $path
+            ));
+        }
+        if (!is_readable($path)) {
+            throw new FilesystemException(sprintf(
+                'The restore file is not readable: %s.', $path
+            ));
+        }
+        $this->restorePath = $filePath;
+    }
+
+    /**
+     * Get path for the backup phar to rollback/restore from
+     *
+     * @return string
+     */
+    public function getRestorePath()
+    {
+        return $this->restorePath;
+    }
+
+    public function throwRuntimeException($errno, $errstr)
+    {
+        if (E_USER_DEPRECATED === $errno) {
+            return;
+        }
+
+        throw new RuntimeException($errstr);
+    }
+
+    public function throwHttpRequestException($errno, $errstr)
+    {
+        if (E_USER_DEPRECATED === $errno) {
+            return;
+        }
+
+        throw new HttpRequestException($errstr);
+    }
+
+    protected function hasPubKey()
+    {
+        return $this->hasPubKey;
+    }
+
+    protected function newVersionAvailable()
+    {
+        $this->newVersion = $this->strategy->getCurrentRemoteVersion($this);
+        $this->oldVersion = $this->strategy->getCurrentLocalVersion($this);
+
+        if (!empty($this->newVersion) && ($this->newVersion !== $this->oldVersion)) {
+            return true;
+        }
+        return false;
+    }
+
+    protected function backupPhar()
+    {
+        $result = copy($this->getLocalPharFile(), $this->getBackupPharFile());
+        if ($result === false) {
+            $this->cleanupAfterError();
+            throw new FilesystemException(sprintf(
+                'Unable to backup %s to %s.',
+                $this->getLocalPharFile(),
+                $this->getBackupPharFile()
+            ));
+        }
+    }
+
+    protected function downloadPhar()
+    {
+        $this->strategy->download($this);
+
+        if (!file_exists($this->getTempPharFile())) {
+            throw new FilesystemException(
+                'Creation of download file failed.'
+            );
+        }
+
+        if ($this->getStrategy() instanceof ShaStrategy) {
+            $tmpVersion = sha1_file($this->getTempPharFile());
+            if ($tmpVersion !== $this->getNewVersion()) {
+                $this->cleanupAfterError();
+                throw new HttpRequestException(sprintf(
+                    'Download file appears to be corrupted or outdated. The file '
+                        . 'received does not have the expected SHA-1 hash: %s.',
+                    $this->getNewVersion()
+                ));
+            }
+        }
+
+        try {
+            $this->validatePhar($this->getTempPharFile());
+        } catch (\Exception $e) {
+            restore_error_handler();
+            $this->cleanupAfterError();
+            throw $e;
+        }
+    }
+
+    protected function replacePhar()
+    {
+        rename($this->getTempPharFile(), $this->getLocalPharFile());
+    }
+
+    protected function restorePhar()
+    {
+        $backup = $this->getRestorePharFile();
+        if (!file_exists($backup)) {
+            throw new RuntimeException(sprintf(
+                'The backup file does not exist: %s.', $backup
+            ));
+        }
+        $this->validatePhar($backup);
+        return rename($backup, $this->getLocalPharFile());
+    }
+
+    protected function getBackupPharFile()
+    {
+        if (null !== $this->getBackupPath()) {
+            return $this->getBackupPath();
+        }
+        return $this->getTempDirectory()
+            . '/'
+            . sprintf('%s%s', $this->getLocalPharFileBasename(), $this->getBackupExtension());
+    }
+
+    protected function getRestorePharFile()
+    {
+        if (null !== $this->getRestorePath()) {
+            return $this->getRestorePath();
+        }
+        return $this->getTempDirectory()
+            . '/'
+            . sprintf('%s%s', $this->getLocalPharFileBasename(), $this->getBackupExtension()
+        );
+    }
+
+    protected function getTempPubKeyFile()
+    {
+        return $this->getTempDirectory()
+            . '/'
+            . sprintf('%s.phar.temp.pubkey', $this->getLocalPharFileBasename());
+    }
+
+    protected function setLocalPharFile($localPharFile)
+    {
+        if (!is_null($localPharFile)) {
+            $localPharFile = realpath($localPharFile);
+        } else {
+            $localPharFile = realpath($_SERVER['argv'][0]) ?: $_SERVER['argv'][0];
+        }
+        if (!file_exists($localPharFile)) {
+            throw new RuntimeException(sprintf(
+                'The set phar file does not exist: %s.', $localPharFile
+            ));
+        }
+        if (!is_writable($localPharFile)) {
+            throw new FilesystemException(sprintf(
+                'The current phar file is not writeable and cannot be replaced: %s.',
+                $localPharFile
+            ));
+        }
+        $this->localPharFile = $localPharFile;
+        $this->localPharFileBasename = basename($localPharFile, '.phar');
+    }
+
+    protected function setLocalPubKeyFile()
+    {
+        $localPubKeyFile = $this->getLocalPharFile() . '.pubkey';
+        if (!file_exists($localPubKeyFile)) {
+            throw new RuntimeException(sprintf(
+                'The phar pubkey file does not exist: %s.', $localPubKeyFile
+            ));
+        }
+        $this->localPubKeyFile = $localPubKeyFile;
+    }
+
+    protected function setTempDirectory()
+    {
+        $tempDirectory = dirname($this->getLocalPharFile());
+        if (!is_writable($tempDirectory)) {
+            throw new FilesystemException(sprintf(
+                'The directory is not writeable: %s.', $tempDirectory
+            ));
+        }
+        $this->tempDirectory = $tempDirectory;
+    }
+
+    protected function validatePhar($phar)
+    {
+        $phar = realpath($phar);
+        if ($this->hasPubKey()) {
+            copy($this->getLocalPubKeyFile(), $phar . '.pubkey');
+        }
+        chmod($phar, fileperms($this->getLocalPharFile()));
+        /** Switch invalid key errors to RuntimeExceptions */
+        set_error_handler(array($this, 'throwRuntimeException'));
+        $phar = new \Phar($phar);
+        $signature = $phar->getSignature();
+        if ($this->hasPubKey() && strtolower($signature['hash_type']) !== 'openssl') {
+            throw new NoSignatureException(
+                'The downloaded phar file has no OpenSSL signature.'
+            );
+        }
+        restore_error_handler();
+        if ($this->hasPubKey()) {
+            @unlink($phar . '.pubkey');
+        }
+        unset($phar);
+    }
+
+    protected function cleanupAfterError()
+    {
+        //@unlink($this->getBackupPharFile());
+        @unlink($this->getTempPharFile());
+        @unlink($this->getTempPubKeyFile());
+    }
+}
diff --git a/vendor/padraic/phar-updater/src/VersionParser.php b/vendor/padraic/phar-updater/src/VersionParser.php
new file mode 100644
index 0000000000..87b1626455
--- /dev/null
+++ b/vendor/padraic/phar-updater/src/VersionParser.php
@@ -0,0 +1,202 @@
+versions = $versions;
+    }
+
+    /**
+     * Get the most recent stable numbered version from versions passed to
+     * constructor (if any)
+     *
+     * @return string
+     */
+    public function getMostRecentStable()
+    {
+        return $this->selectRecentStable();
+    }
+
+    /**
+     * Get the most recent unstable numbered version from versions passed to
+     * constructor (if any)
+     *
+     * @return string
+     */
+    public function getMostRecentUnStable()
+    {
+        return $this->selectRecentUnstable();
+    }
+
+    /**
+     * Get the most recent stable or unstable numbered version from versions passed to
+     * constructor (if any)
+     *
+     * @return string
+     */
+    public function getMostRecentAll()
+    {
+        return $this->selectRecentAll();
+    }
+
+    /**
+     * Checks if given version string represents a stable numbered version
+     *
+     * @param string $version
+     * @return bool
+     */
+    public function isStable($version)
+    {
+        return $this->stable($version);
+    }
+
+    /**
+     * Checks if given version string represents a 'pre-release' version, i.e.
+     * it's unstable but not development level.
+     *
+     * @param string $version
+     * @return bool
+     */
+    public function isPreRelease($version)
+    {
+        return !$this->stable($version) && !$this->development($version);
+    }
+
+    /**
+     * Checks if given version string represents an unstable or dev-level
+     * numbered version
+     *
+     * @param string $version
+     * @return bool
+     */
+    public function isUnstable($version)
+    {
+        return !$this->stable($version);
+    }
+
+    /**
+     * Checks if given version string represents a dev-level numbered version
+     *
+     * @param string $version
+     * @return bool
+     */
+    public function isDevelopment($version)
+    {
+        return $this->development($version);
+    }
+
+    private function selectRecentStable()
+    {
+        $candidates = array();
+        foreach ($this->versions as $version) {
+            if (!$this->stable($version)) {
+                continue;
+            }
+            $candidates[] = $version;
+        }
+        if (empty($candidates)) {
+            return false;
+        }
+        return $this->findMostRecent($candidates);
+    }
+
+    private function selectRecentUnstable()
+    {
+        $candidates = array();
+        foreach ($this->versions as $version) {
+            if ($this->stable($version) || $this->development($version)) {
+                continue;
+            }
+            $candidates[] = $version;
+        }
+        if (empty($candidates)) {
+            return false;
+        }
+        return $this->findMostRecent($candidates);
+    }
+
+    private function selectRecentAll()
+    {
+        $candidates = array();
+        foreach ($this->versions as $version) {
+            if ($this->development($version)) {
+                continue;
+            }
+            $candidates[] = $version;
+        }
+        if (empty($candidates)) {
+            return false;
+        }
+        return $this->findMostRecent($candidates);
+    }
+
+    private function findMostRecent(array $candidates)
+    {
+        $candidate = null;
+        $tracker = null;
+        foreach ($candidates as $version) {
+            if (version_compare($candidate, $version, '<')) {
+                $candidate = $version;
+            }
+        }
+        return $candidate;
+    }
+
+    private function stable($version)
+    {
+        $version = preg_replace('{#.+$}i', '', $version);
+        if ($this->development($version)) {
+            return false;
+        }
+        preg_match('{'.$this->modifier.'$}i', strtolower($version), $match);
+        if (!empty($match[3])) {
+            return false;
+        }
+        if (!empty($match[1])) {
+            if ('beta' === $match[1] || 'b' === $match[1]
+            || 'alpha' === $match[1] || 'a' === $match[1]
+            || 'rc' === $match[1]) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private function development($version)
+    {
+        if ('dev-' === substr($version, 0, 4) || '-dev' === substr($version, -4)) {
+            return true;
+        }
+        if (1 == preg_match("/-\d+-[a-z0-9]{8,}$/", $version)) {
+            return true;
+        }
+        return false;
+    }
+}
diff --git a/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/UpdaterGithubStrategyTest.php b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/UpdaterGithubStrategyTest.php
new file mode 100644
index 0000000000..cbc2c022f5
--- /dev/null
+++ b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/UpdaterGithubStrategyTest.php
@@ -0,0 +1,170 @@
+tmp = sys_get_temp_dir();
+        $this->files = __DIR__ . '/_files';
+        $this->updater = new Updater($this->files . '/test.phar', false, Updater::STRATEGY_GITHUB);
+    }
+
+    public function teardown()
+    {
+        $this->deleteTempPhars();
+    }
+
+    public function testConstruction()
+    {
+        $updater = new Updater(null, false, Updater::STRATEGY_GITHUB);
+        $this->assertTrue(
+            $updater->getStrategy() instanceof GithubStrategy
+        );
+    }
+
+    public function testSetCurrentLocalVersion()
+    {
+        $this->updater->getStrategy()->setCurrentLocalVersion('1.0');
+        $this->assertEquals(
+            '1.0',
+            $this->updater->getStrategy()->getCurrentLocalVersion($this->updater)
+        );
+    }
+
+    public function testSetPharName()
+    {
+        $this->updater->getStrategy()->setPharName('foo.phar');
+        $this->assertEquals(
+            'foo.phar',
+            $this->updater->getStrategy()->getPharName()
+        );
+    }
+
+    public function testSetPackageName()
+    {
+        $this->updater->getStrategy()->setPackageName('foo/bar');
+        $this->assertEquals(
+            'foo/bar',
+            $this->updater->getStrategy()->getPackageName()
+        );
+    }
+
+    public function testSetStability()
+    {
+        $this->assertEquals(
+            'stable',
+            $this->updater->getStrategy()->getStability()
+        );
+        $this->updater->getStrategy()->setStability('unstable');
+        $this->assertEquals(
+            'unstable',
+            $this->updater->getStrategy()->getStability()
+        );
+    }
+
+    public function testSetStabilityThrowsExceptionOnInvalidStabilityValue()
+    {
+        $this->setExpectedException(
+            'Humbug\\SelfUpdate\\Exception\\InvalidArgumentException'
+        );
+        $this->updater->getStrategy()->setStability('foo');
+    }
+
+    /**
+     * @runInSeparateProcess
+     */
+    public function testUpdatePhar()
+    {
+        if (!extension_loaded('openssl')) {
+            $this->markTestSkipped('This test requires the openssl extension to run.');
+        }
+
+        $this->createTestPharAndKey();
+        $this->assertEquals('old', $this->getPharOutput($this->tmp . '/old.phar'));
+
+        $updater = new Updater($this->tmp . '/old.phar');
+        $updater->setStrategyObject(new GithubTestStrategy);
+        $updater->getStrategy()->setPharName('new.phar');
+        $updater->getStrategy()->setPackageName('humbug/test-phar');
+        $updater->getStrategy()->setCurrentLocalVersion('1.0.0');
+
+        $this->assertTrue($updater->update());
+        $this->assertEquals('new', $this->getPharOutput($this->tmp . '/old.phar'));
+    }
+
+    /**
+     * Helpers
+     */
+
+    private function getPharOutput($path)
+    {
+        return exec('php ' . escapeshellarg($path));
+    }
+
+    private function deleteTempPhars()
+    {
+        @unlink($this->tmp . '/old.phar');
+        @unlink($this->tmp . '/old.phar.pubkey');
+        @unlink($this->tmp . '/releases/download/1.0.1/new.phar');
+        @unlink($this->tmp . '/releases/download/1.0.1/new.phar.pubkey');
+        @unlink($this->tmp . '/old.1c7049180abee67826d35ce308c38272242b64b8.phar');
+        @unlink($this->tmp . '/packages.json');
+    }
+
+    private function createTestPharAndKey()
+    {
+        copy($this->files.'/build/old.phar', $this->tmp.'/old.phar');
+        chmod($this->tmp.'/old.phar', 0755);
+        copy(
+            $this->files.'/build/old.phar.pubkey',
+            $this->tmp.'/old.phar.pubkey'
+        );
+        @mkdir($this->tmp.'/releases/download/1.0.1', 0755, true);
+        copy($this->files.'/build/new.phar', $this->tmp.'/releases/download/1.0.1/new.phar');
+        file_put_contents($this->tmp . '/packages.json', json_encode(array(
+            'packages' => array(
+                'humbug/test-phar' => array(
+                    '1.0.1' => array(
+                        'source' => array(
+                            'url' => 'file://' . $this->tmp . '.git'
+                        )
+                    ),
+                    '1.0.0' => array(
+                    )
+                )
+            )
+        )));
+    }
+}
+
+class GithubTestStrategy extends GithubStrategy
+{
+    protected function getApiUrl()
+    {
+        return 'file://' . sys_get_temp_dir() . '/packages.json';
+    }
+}
diff --git a/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/UpdaterTest.php b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/UpdaterTest.php
new file mode 100644
index 0000000000..9befebd8ab
--- /dev/null
+++ b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/UpdaterTest.php
@@ -0,0 +1,279 @@
+tmp = sys_get_temp_dir();
+        $this->files = __DIR__ . '/_files';
+
+        $this->updater = new Updater($this->files . '/test.phar');
+    }
+
+    public function teardown()
+    {
+        $this->deleteTempPhars();
+    }
+
+    public function testConstruction()
+    {
+        // with key
+        $updater = new Updater($this->files . '/test.phar');
+        $this->assertEquals($updater->getLocalPharFile(), $this->files . '/test.phar');
+        $this->assertEquals($updater->getLocalPubKeyFile(), $this->files . '/test.phar.pubkey');
+
+        // without key
+        $updater = new Updater($this->files . '/test.phar', false);
+        $this->assertEquals($updater->getLocalPharFile(), $this->files . '/test.phar');
+        $this->assertNull($updater->getLocalPubKeyFile());
+
+        // no name - detect running console app
+        $updater = new Updater(null, false);
+        $this->assertStringEndsWith(
+            'phpunit.phar',
+            basename($updater->getLocalPharFile(), '.phar') . '.phar'
+        );
+    }
+
+    public function testConstructorThrowsExceptionIfPubKeyNotExistsButFlagTrue()
+    {
+        $this->setExpectedException('Humbug\\SelfUpdate\\Exception\\RuntimeException');
+        $updater = new Updater($this->files . '/test-nopubkey.phar');
+    }
+
+    public function testConstructorAncilliaryValues()
+    {
+        $this->assertEquals($this->updater->getLocalPharFileBasename(), 'test');
+        $this->assertEquals($this->updater->getTempDirectory(), $this->files);
+    }
+
+    public function testSetPharUrlWithUrl()
+    {
+        $this->updater->getStrategy()->setPharUrl('http://www.example.com');
+        $this->assertEquals($this->updater->getStrategy()->getPharUrl(), 'http://www.example.com');
+
+        $this->updater->getStrategy()->setPharUrl('https://www.example.com');
+        $this->assertEquals($this->updater->getStrategy()->getPharUrl(), 'https://www.example.com');
+    }
+
+    public function testSetPharUrlThrowsExceptionOnInvalidUrl()
+    {
+        $this->setExpectedException('Humbug\\SelfUpdate\\Exception\\InvalidArgumentException');
+        $this->updater->getStrategy()->setPharUrl('silly:///home/padraic');
+    }
+
+    public function testSetVersionUrlWithUrl()
+    {
+        $this->updater->getStrategy()->setVersionUrl('http://www.example.com');
+        $this->assertEquals($this->updater->getStrategy()->getVersionUrl(), 'http://www.example.com');
+
+        $this->updater->getStrategy()->setVersionUrl('https://www.example.com');
+        $this->assertEquals($this->updater->getStrategy()->getVersionUrl(), 'https://www.example.com');
+    }
+
+    public function testSetVersionUrlThrowsExceptionOnInvalidUrl()
+    {
+        $this->setExpectedException('Humbug\\SelfUpdate\\Exception\\InvalidArgumentException');
+        $this->updater->getStrategy()->setVersionUrl('silly:///home/padraic');
+    }
+
+    public function testCanDetectNewRemoteVersionAndStoreVersions()
+    {
+        $this->updater->getStrategy()->setVersionUrl('file://' . $this->files . '/good.version');
+        $this->assertTrue($this->updater->hasUpdate());
+        $this->assertEquals('da39a3ee5e6b4b0d3255bfef95601890afd80709', $this->updater->getOldVersion());
+        $this->assertEquals('1af1b9c94dea1ff337587bfa9109f1dad1ec7b9b', $this->updater->getNewVersion());
+    }
+
+    public function testThrowsExceptionOnEmptyRemoteVersion()
+    {
+        $this->setExpectedException(
+            'Humbug\\SelfUpdate\\Exception\\HttpRequestException',
+            'Version request returned empty response'
+        );
+        $this->updater->getStrategy()->setVersionUrl('file://' . $this->files . '/empty.version');
+        $this->assertTrue($this->updater->hasUpdate());
+    }
+
+    public function testThrowsExceptionOnInvalidRemoteVersion()
+    {
+        $this->setExpectedException(
+            'Humbug\\SelfUpdate\\Exception\\HttpRequestException',
+            'Version request returned incorrectly formatted response'
+        );
+        $this->updater->getStrategy()->setVersionUrl('file://' . $this->files . '/bad.version');
+        $this->assertTrue($this->updater->hasUpdate());
+    }
+
+    /**
+     * @runInSeparateProcess
+     */
+    public function testUpdatePhar()
+    {
+        if (!extension_loaded('openssl')) {
+            $this->markTestSkipped('This test requires the openssl extension to run.');
+        }
+
+        $this->createTestPharAndKey();
+        $this->assertEquals('old', $this->getPharOutput($this->tmp . '/old.phar'));
+
+        $updater = new Updater($this->tmp . '/old.phar');
+        $updater->getStrategy()->setPharUrl('file://' . $this->files . '/build/new.phar');
+        $updater->getStrategy()->setVersionUrl('file://' . $this->files . '/build/new.version');
+        $this->assertTrue($updater->update());
+        $this->assertEquals('new', $this->getPharOutput($this->tmp . '/old.phar'));
+    }
+
+    /**
+     * @runInSeparateProcess
+     */
+    public function testUpdatePharFailsIfCurrentPublicKeyEmpty()
+    {
+        //$this->markTestSkipped('Segmentation fault at present under PHP');
+        copy($this->files . '/build/badkey.phar', $this->tmp . '/old.phar');
+        chmod($this->tmp . '/old.phar', 0755);
+        copy($this->files . '/build/badkey.phar.pubkey', $this->tmp . '/old.phar.pubkey');
+
+        $updater = new Updater($this->tmp . '/old.phar');
+        $updater->getStrategy()->setPharUrl('file://' . $this->files . '/build/new.phar');
+        $updater->getStrategy()->setVersionUrl('file://' . $this->files . '/build/new.version');
+
+        $this->setExpectedException('UnexpectedValueException');
+        $updater->update();
+    }
+
+    /**
+     * @runInSeparateProcess
+     */
+    public function testUpdatePharFailsIfCurrentPublicKeyInvalid()
+    {
+        $this->markTestIncomplete('Segmentation fault at present under PHP');
+        /** Should be similar to testUpdatePharFailsIfCurrentPublicKeyEmpty with
+            corrupt or truncated public key */
+    }
+
+    /**
+     * @runInSeparateProcess
+     */
+    public function testUpdatePharFailsOnExpectedSignatureMismatch()
+    {
+        if (!extension_loaded('openssl')) {
+            $this->markTestSkipped('This test requires the openssl extension to run.');
+        }
+
+        $this->createTestPharAndKey();
+        $this->assertEquals('old', $this->getPharOutput($this->tmp . '/old.phar'));
+
+        /** Signature check should fail with invalid signature by a different privkey */
+        $this->setExpectedException('UnexpectedValueException');
+
+        $updater = new Updater($this->tmp . '/old.phar');
+        $updater->getStrategy()->setPharUrl('file://' . $this->files . '/build/badsig.phar');
+        $updater->getStrategy()->setVersionUrl('file://' . $this->files . '/build/badsig.version');
+        $updater->update();
+    }
+
+    /**
+     * @runInSeparateProcess
+     */
+    public function testUpdatePharFailsIfDownloadPharIsUnsignedWhenExpected()
+    {
+        $this->createTestPharAndKey();
+        $updater = new Updater($this->tmp . '/old.phar');
+        $updater->getStrategy()->setPharUrl('file://' . $this->files . '/build/nosig.phar');
+        $updater->getStrategy()->setVersionUrl('file://' . $this->files . '/build/nosig.version');
+
+        /** If newly download phar lacks an expected signature, an exception should be thrown */
+        $this->setExpectedException('Humbug\\SelfUpdate\\Exception\\RuntimeException');
+        $updater->update();
+    }
+
+    public function testSetBackupPathSetsThePathWhenTheDirectoryExistsAndIsWriteable()
+    {
+        $this->createTestPharAndKey();
+        $updater = new Updater($this->tmp . '/old.phar');
+        $updater->setBackupPath($this->tmp . '/backup.phar');
+        $res = $updater->getBackupPath();
+        $this->assertEquals($this->tmp . '/backup.phar', $res);
+    }
+
+    public function testSetRestorePathSetsThePathWhenTheDirectoryExistsAndIsWriteable()
+    {
+        $this->createTestPharAndKey();
+        $updater = new Updater($this->tmp . '/old.phar');
+        $updater->setRestorePath($this->tmp . '/backup.phar');
+        $res = $updater->getRestorePath();
+        $this->assertEquals($this->tmp . '/backup.phar', $res);
+    }
+
+    /**
+     * Custom Strategies
+     */
+
+    public function testCanSetCustomStrategyObjects()
+    {
+        $this->updater->setStrategyObject(new FooStrategy);
+        $this->assertTrue($this->updater->getStrategy() instanceof FooStrategy);
+    }
+
+    /**
+     * Helpers
+     */
+
+    private function getPharOutput($path)
+    {
+        return exec('php ' . escapeshellarg($path));
+    }
+
+    private function deleteTempPhars()
+    {
+        @unlink($this->tmp . '/old.phar');
+        @unlink($this->tmp . '/old.phar.pubkey');
+        @unlink($this->tmp . '/old.1c7049180abee67826d35ce308c38272242b64b8.phar');
+    }
+
+    private function createTestPharAndKey()
+    {
+        copy($this->files.'/build/old.phar', $this->tmp.'/old.phar');
+        chmod($this->tmp.'/old.phar', 0755);
+        copy(
+            $this->files.'/build/old.phar.pubkey',
+            $this->tmp.'/old.phar.pubkey'
+        );
+    }
+}
+
+class FooStrategy implements StrategyInterface
+{
+    public function download(Updater $updater)
+    {
+    }
+    public function getCurrentRemoteVersion(Updater $updater)
+    {
+    }
+    public function getCurrentLocalVersion(Updater $updater)
+    {
+    }
+}
diff --git a/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/VersionParserTest.php b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/VersionParserTest.php
new file mode 100644
index 0000000000..189713a9ef
--- /dev/null
+++ b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/VersionParserTest.php
@@ -0,0 +1,169 @@
+assertSame(false, $parser->getMostRecentStable());
+    }
+
+    public function testShouldSelectMostRecentVersionFromStandardSelection()
+    {
+        $versions = array('1.0.0', '1.0.1', '1.1.0');
+        $parser = new VersionParser($versions);
+        $this->assertSame('1.1.0', $parser->getMostRecentStable());
+    }
+
+    public function testShouldSelectMostRecentVersionFromMixedSelection()
+    {
+        $versions = array('1.0.0', '1.0.1', '1.1.0', '1.2.0a', '1.2.0b', '1.1.0rc');
+        $parser = new VersionParser($versions);
+        $this->assertSame('1.1.0', $parser->getMostRecentStable());
+    }
+
+    public function testShouldSelectMostRecentVersionFromPrefixedSelection()
+    {
+        $versions = array('v1.0.0', 'v1.0.1', 'v1.1.0');
+        $parser = new VersionParser($versions);
+        $this->assertSame('v1.1.0', $parser->getMostRecentStable());
+    }
+
+    public function testShouldSelectMostRecentVersionFromPartlyPrefixedSelection()
+    {
+        $versions = array('v1.0.0', 'v1.0.1', '1.1.0');
+        $parser = new VersionParser($versions);
+        $this->assertSame('1.1.0', $parser->getMostRecentStable());
+    }
+
+    public function testShouldSelectMostRecentVersionFromPatchLevels()
+    {
+        $versions = array('1.0.0', '1.0.0-pl2', '1.0.0-pl3', '1.0.0-pl1');
+        $parser = new VersionParser($versions);
+        $this->assertSame('1.0.0-pl3', $parser->getMostRecentStable());
+    }
+
+    public function testShouldSelectMostRecentVersionFromPatchLevels2()
+    {
+        $versions = array('1.0.0', '1.0.0pl2', '1.0.0pl3', '1.0.0pl1');
+        $parser = new VersionParser($versions);
+        $this->assertSame('1.0.0pl3', $parser->getMostRecentStable());
+    }
+
+    // Unstable
+
+    public function testShouldSelectNothingFromUnstablesIfUnstableRequested()
+    {
+        $versions = array('1.0.0', '1.0.1', '1.1.0');
+        $parser = new VersionParser($versions);
+        $this->assertSame(false, $parser->getMostRecentUnstable());
+    }
+
+    public function testShouldSelectNothingFromStablesOrDevsIfUnstableRequested()
+    {
+        $versions = array('1.0.0', '1.0.1', '1.1.0-dev', 'dev-1.1.1');
+        $parser = new VersionParser($versions);
+        $this->assertSame(false, $parser->getMostRecentUnstable());
+    }
+
+    public function testShouldSelectMostRecentUnstableVersionFromStandardSelection()
+    {
+        $versions = array('1.0.0a', '1.0.0alpha', '1.0.0-dev', 'dev-1.0.0', '1.0.0b',
+        '1.0.0beta', '1.0.0rc', '1.0.0RC');
+        $parser = new VersionParser($versions);
+        $this->assertSame('1.0.0rc', $parser->getMostRecentUnstable());
+    }
+
+    public function testShouldSelectMostRecentUnstableVersionFromMixedSelection()
+    {
+        $versions = array('1.0.0', '1.0.1', '1.1.0', '1.2.0a', '1.2.0b', '1.1.0rc');
+        $parser = new VersionParser($versions);
+        $this->assertSame('1.2.0b', $parser->getMostRecentUnstable());
+    }
+
+    public function testShouldSelectMostRecentUnstableVersionFromPrefixedSelection()
+    {
+        $versions = array('v1.0.0b', 'v1.0.1', 'v1.1.0');
+        $parser = new VersionParser($versions);
+        $this->assertSame('v1.0.0b', $parser->getMostRecentUnstable());
+    }
+
+    public function testShouldSelectMostRecentUnstableVersionFromPartlyPrefixedSelection()
+    {
+        $versions = array('v1.0.0b', 'v1.0.0a', '1.1.0a');
+        $parser = new VersionParser($versions);
+        $this->assertSame('1.1.0a', $parser->getMostRecentUnstable());
+    }
+
+    public function testShouldSelectMostRecentUnstableFromVaryingNumeralCounts()
+    {
+        $versions = array('1.0-dev', '1.0.0-alpha1');
+        $parser = new VersionParser($versions);
+        $this->assertSame('1.0.0-alpha1', $parser->getMostRecentUnstable());
+    }
+
+    // All versions (ignoring stability)
+
+    public function testShouldSelectMostRecentIgnoringStabilityExceptDevFromPrefixedSelection()
+    {
+        $versions = array('v1.0.0b', 'v1.0.1', 'v1.1.0a', 'v1.2.0-dev');
+        $parser = new VersionParser($versions);
+        $this->assertSame('v1.1.0a', $parser->getMostRecentAll());
+    }
+
+    // Basic Version Category Checks
+
+    public function testIsStable()
+    {
+        $parser = new VersionParser;
+        $this->assertTrue($parser->isStable('1.0.0'));
+        $this->assertFalse($parser->isStable('1.0.0b'));
+        $this->assertFalse($parser->isStable('1.0.0-dev'));
+        $this->assertFalse($parser->isStable('1.0.0-alpha1-5-g5b46ad8'));
+    }
+
+    public function testIsPreRelease()
+    {
+        $parser = new VersionParser;
+        $this->assertFalse($parser->isPreRelease('1.0.0'));
+        $this->assertTrue($parser->isPreRelease('1.0.0b'));
+        $this->assertFalse($parser->isPreRelease('1.0.0-dev'));
+        $this->assertFalse($parser->isPreRelease('1.0.0-alpha1-5-g5b46ad8'));
+    }
+
+    public function testIsUnstable()
+    {
+        $parser = new VersionParser;
+        $this->assertFalse($parser->isUnstable('1.0.0'));
+        $this->assertTrue($parser->isUnstable('1.0.0b'));
+        $this->assertTrue($parser->isUnstable('1.0.0-dev'));
+        $this->assertTrue($parser->isUnstable('1.0.0-alpha1-5-g5b46ad8'));
+    }
+
+    public function testIsDevelopment()
+    {
+        $parser = new VersionParser;
+        $this->assertFalse($parser->isDevelopment('1.0.0'));
+        $this->assertFalse($parser->isDevelopment('1.0.0b'));
+        $this->assertTrue($parser->isDevelopment('1.0.0-dev'));
+        $this->assertTrue($parser->isDevelopment('1.0.0-alpha1-5-g5b46ad8'));
+    }
+}
diff --git a/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/bad.version b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/bad.version
new file mode 100644
index 0000000000..a43dbc1d02
--- /dev/null
+++ b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/bad.version
@@ -0,0 +1 @@
+bad_version_id
\ No newline at end of file
diff --git a/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/README b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/README
new file mode 100644
index 0000000000..836d92a215
--- /dev/null
+++ b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/README
@@ -0,0 +1,3 @@
+This directory contains phars generated from ./src used during testing.
+These are generated using the box json configuration files.
+Retained here should any changes be needed.
\ No newline at end of file
diff --git a/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/badkey.phar b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/badkey.phar
new file mode 100644
index 0000000000..64e87c076a
Binary files /dev/null and b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/badkey.phar differ
diff --git a/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/badkey.phar.pubkey b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/badkey.phar.pubkey
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/badsig.phar b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/badsig.phar
new file mode 100644
index 0000000000..8e8e43f49a
Binary files /dev/null and b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/badsig.phar differ
diff --git a/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/badsig.phar.pubkey b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/badsig.phar.pubkey
new file mode 100644
index 0000000000..b83d494243
--- /dev/null
+++ b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/badsig.phar.pubkey
@@ -0,0 +1,9 @@
+-----BEGIN PUBLIC KEY-----
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAq4BEjfSt8orkVL943CDp
+XZimLXKl2gOi3IeX1flN2uLQMQ5+ta7oq3Brh+DnuYNDmo/fTKk9eBc7CR3DswqQ
+ImdBvzsqz2yNiAcw0bn1kZ3gJ/y9mcjeDMG29urXY2sH7+z3DlOu+xJjJ8eYZkIw
+AkPgaiiKkb6bNef6+dRm5lfldEbqoScHhERvmGNjrX8LmwksmefHPTFCQyaUTnKd
+Y5Vg57DvJMfp+evNN4jsAaJ5L2YTGZ5FjWXwTqKXYGrcubNXohVh3VbYoh3pVRsq
+wT8T8uPjVMs2IDCzbNTvowylS/nRzT2MR17Oq/3T21XKivEl3hXvHvhBlDE7Vaeh
+PQIDAQAB
+-----END PUBLIC KEY-----
diff --git a/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/badsig.version b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/badsig.version
new file mode 100644
index 0000000000..02149988d0
--- /dev/null
+++ b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/badsig.version
@@ -0,0 +1 @@
+85bbdc329b67485f7b6b4aadba84ff842861c0ae  badsig.phar
diff --git a/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/box.badsig.json b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/box.badsig.json
new file mode 100644
index 0000000000..dd09e88afa
--- /dev/null
+++ b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/box.badsig.json
@@ -0,0 +1,10 @@
+{
+    "chmod": "0755",
+    "directories": [
+        "src/new"
+    ],
+    "main": "src/new/run.php",
+    "output": "badsig.phar",
+    "stub": true,
+    "key": "../privkey2.pem"
+}
\ No newline at end of file
diff --git a/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/box.new.json b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/box.new.json
new file mode 100644
index 0000000000..579db3ad50
--- /dev/null
+++ b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/box.new.json
@@ -0,0 +1,10 @@
+{
+    "chmod": "0755",
+    "directories": [
+        "src/new"
+    ],
+    "main": "src/new/run.php",
+    "output": "new.phar",
+    "stub": true,
+    "key": "../privkey.pem"
+}
\ No newline at end of file
diff --git a/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/box.nosig.json b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/box.nosig.json
new file mode 100644
index 0000000000..df2683be61
--- /dev/null
+++ b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/box.nosig.json
@@ -0,0 +1,9 @@
+{
+    "chmod": "0755",
+    "directories": [
+        "src/new"
+    ],
+    "main": "src/new/run.php",
+    "output": "nosig.phar",
+    "stub": true
+}
\ No newline at end of file
diff --git a/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/box.old.json b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/box.old.json
new file mode 100644
index 0000000000..2d48dc5b4e
--- /dev/null
+++ b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/box.old.json
@@ -0,0 +1,10 @@
+{
+    "chmod": "0755",
+    "directories": [
+        "src/old"
+    ],
+    "main": "src/old/run.php",
+    "output": "old.phar",
+    "stub": true,
+    "key": "../privkey.pem"
+}
\ No newline at end of file
diff --git a/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/new.phar b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/new.phar
new file mode 100644
index 0000000000..005d9d8e15
Binary files /dev/null and b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/new.phar differ
diff --git a/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/new.phar.pubkey b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/new.phar.pubkey
new file mode 100644
index 0000000000..5b19d9cb09
--- /dev/null
+++ b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/new.phar.pubkey
@@ -0,0 +1,9 @@
+-----BEGIN PUBLIC KEY-----
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs4VC/apZVE03otFLep/p
+K3ocNkoztx2JE3V6DVxSClfvCf2fc6yNp31lxioFPg5WUes3NjJo7eMgTf/VA2Fz
+BmJjzESGAj3kJp+z/cWDl88vvagSs0U/68OKc9XcnxFDTz0Uhd7pF/Ip7Q+ljHUU
+kHdPNuJrhOmsa7i0IjWs4ftNmN3svVwnaEqLNY1DuCzBR9KvpFuEwBrKDTKGfnca
+uK/KS+sjbEuPlOVHARmF47ipwd5v+nddSqTYo+N9s/BlVFsAHRzwOQwYCwQlY/IR
+/zkKUN59KCzgUrDLYIOTocGv17prs9O7K9tJV90wx03nRLwCSgCS3fdOEBHe0X3S
+5QIDAQAB
+-----END PUBLIC KEY-----
diff --git a/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/new.version b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/new.version
new file mode 100644
index 0000000000..463a9708f4
--- /dev/null
+++ b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/new.version
@@ -0,0 +1 @@
+3c1b6b7dad9e6331a7e2917d8e116e075ed1967f  new.phar
diff --git a/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/nosig.phar b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/nosig.phar
new file mode 100644
index 0000000000..55561f4bef
Binary files /dev/null and b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/nosig.phar differ
diff --git a/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/nosig.version b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/nosig.version
new file mode 100644
index 0000000000..1140318f12
--- /dev/null
+++ b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/nosig.version
@@ -0,0 +1 @@
+0bc24f886bc0c7563187167b334e56cfb8e1151a  nosig.phar
diff --git a/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/old.phar b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/old.phar
new file mode 100644
index 0000000000..64e87c076a
Binary files /dev/null and b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/old.phar differ
diff --git a/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/old.phar.pubkey b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/old.phar.pubkey
new file mode 100644
index 0000000000..5b19d9cb09
--- /dev/null
+++ b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/old.phar.pubkey
@@ -0,0 +1,9 @@
+-----BEGIN PUBLIC KEY-----
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs4VC/apZVE03otFLep/p
+K3ocNkoztx2JE3V6DVxSClfvCf2fc6yNp31lxioFPg5WUes3NjJo7eMgTf/VA2Fz
+BmJjzESGAj3kJp+z/cWDl88vvagSs0U/68OKc9XcnxFDTz0Uhd7pF/Ip7Q+ljHUU
+kHdPNuJrhOmsa7i0IjWs4ftNmN3svVwnaEqLNY1DuCzBR9KvpFuEwBrKDTKGfnca
+uK/KS+sjbEuPlOVHARmF47ipwd5v+nddSqTYo+N9s/BlVFsAHRzwOQwYCwQlY/IR
+/zkKUN59KCzgUrDLYIOTocGv17prs9O7K9tJV90wx03nRLwCSgCS3fdOEBHe0X3S
+5QIDAQAB
+-----END PUBLIC KEY-----
diff --git a/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/src/new/run.php b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/src/new/run.php
new file mode 100644
index 0000000000..803f8c2cc1
--- /dev/null
+++ b/vendor/padraic/phar-updater/tests/Humbug/Test/SelfUpdate/_files/build/src/new/run.php
@@ -0,0 +1,2 @@
+files()
+    ->in('src')
+    ->in('tests')
+    ->name('*.php');
+
+return Symfony\CS\Config\Config::create()
+    ->setUsingCache(true)
+    ->level(\Symfony\CS\FixerInterface::NONE_LEVEL)
+    ->fixers(
+        array(
+            'align_double_arrow',
+            'align_equals',
+            'concat_with_spaces',
+            'duplicate_semicolon',
+            'elseif',
+            'empty_return',
+            'encoding',
+            'eof_ending',
+            'extra_empty_lines',
+            'function_call_space',
+            'function_declaration',
+            'indentation',
+            'join_function',
+            'line_after_namespace',
+            'linefeed',
+            'list_commas',
+            'lowercase_constants',
+            'lowercase_keywords',
+            'method_argument_space',
+            'multiple_use',
+            'namespace_no_leading_whitespace',
+            'no_blank_lines_after_class_opening',
+            'no_empty_lines_after_phpdocs',
+            'parenthesis',
+            'php_closing_tag',
+            'phpdoc_indent',
+            'phpdoc_no_access',
+            'phpdoc_no_empty_return',
+            'phpdoc_no_package',
+            'phpdoc_params',
+            'phpdoc_scalar',
+            'phpdoc_separation',
+            'phpdoc_to_comment',
+            'phpdoc_trim',
+            'phpdoc_types',
+            'phpdoc_var_without_name',
+            'remove_lines_between_uses',
+            'return',
+            'self_accessor',
+            'short_array_syntax',
+            'short_tag',
+            'single_line_after_imports',
+            'single_quote',
+            'spaces_before_semicolon',
+            'spaces_cast',
+            'ternary_spaces',
+            'trailing_spaces',
+            'trim_array_spaces',
+            'unused_use',
+            'visibility',
+            'whitespacy_lines'
+        )
+    )
+    ->finder($finder);
+
diff --git a/vendor/phar-io/manifest/.travis.yml b/vendor/phar-io/manifest/.travis.yml
new file mode 100644
index 0000000000..b4be10f9c3
--- /dev/null
+++ b/vendor/phar-io/manifest/.travis.yml
@@ -0,0 +1,33 @@
+os:
+- linux
+
+language: php
+
+before_install:
+  - wget https://phar.io/releases/phive.phar
+  - wget https://phar.io/releases/phive.phar.asc
+  - gpg --keyserver hkps.pool.sks-keyservers.net --recv-keys 0x9B2D5D79
+  - gpg --verify phive.phar.asc phive.phar
+  - chmod +x phive.phar
+  - sudo mv phive.phar /usr/bin/phive
+
+install:
+  - ant setup
+
+script: ./tools/phpunit
+
+php:
+  - 5.6
+  - 7.0
+  - 7.1
+  - 7.0snapshot
+  - 7.1snapshot
+  - master
+
+matrix:
+  allow_failures:
+    - php: master
+  fast_finish: true
+
+notifications:
+  email: false
diff --git a/vendor/phar-io/manifest/LICENSE b/vendor/phar-io/manifest/LICENSE
new file mode 100644
index 0000000000..96051b14ed
--- /dev/null
+++ b/vendor/phar-io/manifest/LICENSE
@@ -0,0 +1,31 @@
+manifest
+
+Copyright (c) 2016 Arne Blankerts , Sebastian Heuer , Sebastian Bergmann , and contributors
+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 Arne Blankerts nor the names of 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 HOLDER 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/phar-io/manifest/README.md b/vendor/phar-io/manifest/README.md
new file mode 100644
index 0000000000..e6d0b055d1
--- /dev/null
+++ b/vendor/phar-io/manifest/README.md
@@ -0,0 +1,30 @@
+# Manifest
+
+Component for reading [phar.io](https://phar.io/) manifest information from a [PHP Archive (PHAR)](http://php.net/phar).
+
+[![Build Status](https://travis-ci.org/phar-io/manifest.svg?branch=master)](https://travis-ci.org/phar-io/manifest)
+[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/phar-io/manifest/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/phar-io/manifest/?branch=master)
+[![SensioLabsInsight](https://insight.sensiolabs.com/projects/d8cc6035-69ad-477d-bd1a-ccc605480fd7/mini.png)](https://insight.sensiolabs.com/projects/d8cc6035-69ad-477d-bd1a-ccc605480fd7)
+
+## Installation
+
+You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/):
+
+    composer require phar-io/manifest
+
+If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency:
+
+    composer require --dev phar-io/manifest
+
+## Usage
+
+```php
+use PharIo\Manifest\ManifestLoader;
+use PharIo\Manifest\ManifestSerializer;
+
+$manifest = ManifestLoader::fromFile('manifest.xml');
+
+var_dump($manifest);
+
+echo (new ManifestSerializer)->serializeToString($manifest);
+```
diff --git a/vendor/phar-io/manifest/build.xml b/vendor/phar-io/manifest/build.xml
new file mode 100644
index 0000000000..fc6eb1a8e0
--- /dev/null
+++ b/vendor/phar-io/manifest/build.xml
@@ -0,0 +1,50 @@
+
+
+    
+
+    
+        
+        
+        
+
+        
+    
+
+    
+        
+    
+
+    
+        
+            
+            
+            
+            
+            
+            
+            
+            
+        
+    
+
+    
+        
+            
+            
+            
+        
+    
+
+    
+        
+    
+
+    
+        
+    
+
+    
+        
+    
+
+
diff --git a/vendor/phar-io/manifest/composer.json b/vendor/phar-io/manifest/composer.json
new file mode 100644
index 0000000000..cfaa7fa8a8
--- /dev/null
+++ b/vendor/phar-io/manifest/composer.json
@@ -0,0 +1,42 @@
+{
+  "name": "phar-io/manifest",
+  "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
+  "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"
+    }
+  ],
+  "support": {
+    "issues": "https://github.com/phar-io/manifest/issues"
+  },
+  "require": {
+    "php": "^5.6 || ^7.0",
+    "ext-dom": "*",
+    "ext-phar": "*",
+    "phar-io/version": "^2.0"
+  },
+  "autoload": {
+    "classmap": [
+      "src/"
+    ]
+  },
+  "extra": {
+    "branch-alias": {
+        "dev-master": "1.0.x-dev"
+    }
+  }
+}
+
diff --git a/vendor/phar-io/manifest/composer.lock b/vendor/phar-io/manifest/composer.lock
new file mode 100644
index 0000000000..d876819c92
--- /dev/null
+++ b/vendor/phar-io/manifest/composer.lock
@@ -0,0 +1,69 @@
+{
+    "_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#composer-lock-the-lock-file",
+        "This file is @generated automatically"
+    ],
+    "content-hash": "f00846dde236d314a19d00d268d737dd",
+    "packages": [
+        {
+            "name": "phar-io/version",
+            "version": "2.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phar-io/version.git",
+                "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6",
+                "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6",
+                "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": "2018-07-08T19:19:57+00:00"
+        }
+    ],
+    "packages-dev": [],
+    "aliases": [],
+    "minimum-stability": "stable",
+    "stability-flags": [],
+    "prefer-stable": false,
+    "prefer-lowest": false,
+    "platform": {
+        "php": "^5.6 || ^7.0",
+        "ext-dom": "*",
+        "ext-phar": "*"
+    },
+    "platform-dev": []
+}
diff --git a/vendor/phar-io/manifest/examples/example-01.php b/vendor/phar-io/manifest/examples/example-01.php
new file mode 100644
index 0000000000..345c407ad8
--- /dev/null
+++ b/vendor/phar-io/manifest/examples/example-01.php
@@ -0,0 +1,23 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+use PharIo\Manifest\ManifestLoader;
+use PharIo\Manifest\ManifestSerializer;
+
+require __DIR__ . '/../vendor/autoload.php';
+
+$manifest = ManifestLoader::fromFile(__DIR__ . '/../tests/_fixture/phpunit-5.6.5.xml');
+
+echo sprintf(
+    "Manifest for %s (%s):\n\n",
+    $manifest->getName(),
+    $manifest->getVersion()->getVersionString()
+);
+echo (new ManifestSerializer)->serializeToString($manifest);
diff --git a/vendor/phar-io/manifest/phive.xml b/vendor/phar-io/manifest/phive.xml
new file mode 100644
index 0000000000..69f2f91b7f
--- /dev/null
+++ b/vendor/phar-io/manifest/phive.xml
@@ -0,0 +1,4 @@
+
+
+  
+
diff --git a/vendor/phar-io/manifest/phpunit.xml b/vendor/phar-io/manifest/phpunit.xml
new file mode 100644
index 0000000000..2d7708eec8
--- /dev/null
+++ b/vendor/phar-io/manifest/phpunit.xml
@@ -0,0 +1,20 @@
+
+
+    
+        tests
+    
+
+    
+        
+            src
+        
+    
+
diff --git a/vendor/phar-io/manifest/src/ManifestDocumentMapper.php b/vendor/phar-io/manifest/src/ManifestDocumentMapper.php
new file mode 100644
index 0000000000..d41e4f93f7
--- /dev/null
+++ b/vendor/phar-io/manifest/src/ManifestDocumentMapper.php
@@ -0,0 +1,193 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+use PharIo\Version\Version;
+use PharIo\Version\Exception as VersionException;
+use PharIo\Version\VersionConstraintParser;
+
+class ManifestDocumentMapper {
+    /**
+     * @param ManifestDocument $document
+     *
+     * @returns Manifest
+     *
+     * @throws ManifestDocumentMapperException
+     */
+    public function map(ManifestDocument $document) {
+        try {
+            $contains          = $document->getContainsElement();
+            $type              = $this->mapType($contains);
+            $copyright         = $this->mapCopyright($document->getCopyrightElement());
+            $requirements      = $this->mapRequirements($document->getRequiresElement());
+            $bundledComponents = $this->mapBundledComponents($document);
+
+            return new Manifest(
+                new ApplicationName($contains->getName()),
+                new Version($contains->getVersion()),
+                $type,
+                $copyright,
+                $requirements,
+                $bundledComponents
+            );
+        } catch (VersionException $e) {
+            throw new ManifestDocumentMapperException($e->getMessage(), $e->getCode(), $e);
+        } catch (Exception $e) {
+            throw new ManifestDocumentMapperException($e->getMessage(), $e->getCode(), $e);
+        }
+    }
+
+    /**
+     * @param ContainsElement $contains
+     *
+     * @return Type
+     *
+     * @throws ManifestDocumentMapperException
+     */
+    private function mapType(ContainsElement $contains) {
+        switch ($contains->getType()) {
+            case 'application':
+                return Type::application();
+            case 'library':
+                return Type::library();
+            case 'extension':
+                return $this->mapExtension($contains->getExtensionElement());
+        }
+
+        throw new ManifestDocumentMapperException(
+            sprintf('Unsupported type %s', $contains->getType())
+        );
+    }
+
+    /**
+     * @param CopyrightElement $copyright
+     *
+     * @return CopyrightInformation
+     *
+     * @throws InvalidUrlException
+     * @throws InvalidEmailException
+     */
+    private function mapCopyright(CopyrightElement $copyright) {
+        $authors = new AuthorCollection();
+
+        foreach($copyright->getAuthorElements() as $authorElement) {
+            $authors->add(
+                new Author(
+                    $authorElement->getName(),
+                    new Email($authorElement->getEmail())
+                )
+            );
+        }
+
+        $licenseElement = $copyright->getLicenseElement();
+        $license        = new License(
+            $licenseElement->getType(),
+            new Url($licenseElement->getUrl())
+        );
+
+        return new CopyrightInformation(
+            $authors,
+            $license
+        );
+    }
+
+    /**
+     * @param RequiresElement $requires
+     *
+     * @return RequirementCollection
+     *
+     * @throws ManifestDocumentMapperException
+     */
+    private function mapRequirements(RequiresElement $requires) {
+        $collection = new RequirementCollection();
+        $phpElement = $requires->getPHPElement();
+        $parser     = new VersionConstraintParser;
+
+        try {
+            $versionConstraint = $parser->parse($phpElement->getVersion());
+        } catch (VersionException $e) {
+            throw new ManifestDocumentMapperException(
+                sprintf('Unsupported version constraint - %s', $e->getMessage()),
+                $e->getCode(),
+                $e
+            );
+        }
+
+        $collection->add(
+            new PhpVersionRequirement(
+                $versionConstraint
+            )
+        );
+
+        if (!$phpElement->hasExtElements()) {
+            return $collection;
+        }
+
+        foreach($phpElement->getExtElements() as $extElement) {
+            $collection->add(
+                new PhpExtensionRequirement($extElement->getName())
+            );
+        }
+
+        return $collection;
+    }
+
+    /**
+     * @param ManifestDocument $document
+     *
+     * @return BundledComponentCollection
+     */
+    private function mapBundledComponents(ManifestDocument $document) {
+        $collection = new BundledComponentCollection();
+
+        if (!$document->hasBundlesElement()) {
+            return $collection;
+        }
+
+        foreach($document->getBundlesElement()->getComponentElements() as $componentElement) {
+            $collection->add(
+                new BundledComponent(
+                    $componentElement->getName(),
+                    new Version(
+                        $componentElement->getVersion()
+                    )
+                )
+            );
+        }
+
+        return $collection;
+    }
+
+    /**
+     * @param ExtensionElement $extension
+     *
+     * @return Extension
+     *
+     * @throws ManifestDocumentMapperException
+     */
+    private function mapExtension(ExtensionElement $extension) {
+        try {
+            $parser            = new VersionConstraintParser;
+            $versionConstraint = $parser->parse($extension->getCompatible());
+
+            return Type::extension(
+                new ApplicationName($extension->getFor()),
+                $versionConstraint
+            );
+        } catch (VersionException $e) {
+            throw new ManifestDocumentMapperException(
+                sprintf('Unsupported version constraint - %s', $e->getMessage()),
+                $e->getCode(),
+                $e
+            );
+        }
+    }
+}
diff --git a/vendor/phar-io/manifest/src/ManifestLoader.php b/vendor/phar-io/manifest/src/ManifestLoader.php
new file mode 100644
index 0000000000..81c5c90e47
--- /dev/null
+++ b/vendor/phar-io/manifest/src/ManifestLoader.php
@@ -0,0 +1,66 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+class ManifestLoader {
+    /**
+     * @param string $filename
+     *
+     * @return Manifest
+     *
+     * @throws ManifestLoaderException
+     */
+    public static function fromFile($filename) {
+        try {
+            return (new ManifestDocumentMapper())->map(
+                ManifestDocument::fromFile($filename)
+            );
+        } catch (Exception $e) {
+            throw new ManifestLoaderException(
+                sprintf('Loading %s failed.', $filename),
+                $e->getCode(),
+                $e
+            );
+        }
+    }
+
+    /**
+     * @param string $filename
+     *
+     * @return Manifest
+     *
+     * @throws ManifestLoaderException
+     */
+    public static function fromPhar($filename) {
+        return self::fromFile('phar://' . $filename . '/manifest.xml');
+    }
+
+    /**
+     * @param string $manifest
+     *
+     * @return Manifest
+     *
+     * @throws ManifestLoaderException
+     */
+    public static function fromString($manifest) {
+        try {
+            return (new ManifestDocumentMapper())->map(
+                ManifestDocument::fromString($manifest)
+            );
+        } catch (Exception $e) {
+            throw new ManifestLoaderException(
+                'Processing string failed',
+                $e->getCode(),
+                $e
+            );
+        }
+    }
+}
diff --git a/vendor/phar-io/manifest/src/ManifestSerializer.php b/vendor/phar-io/manifest/src/ManifestSerializer.php
new file mode 100644
index 0000000000..4c18ddd81f
--- /dev/null
+++ b/vendor/phar-io/manifest/src/ManifestSerializer.php
@@ -0,0 +1,163 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+use PharIo\Version\AnyVersionConstraint;
+use PharIo\Version\Version;
+use PharIo\Version\VersionConstraint;
+use XMLWriter;
+
+class ManifestSerializer {
+    /**
+     * @var XMLWriter
+     */
+    private $xmlWriter;
+
+    public function serializeToFile(Manifest $manifest, $filename) {
+        file_put_contents(
+            $filename,
+            $this->serializeToString($manifest)
+        );
+    }
+
+    public function serializeToString(Manifest $manifest) {
+        $this->startDocument();
+
+        $this->addContains($manifest->getName(), $manifest->getVersion(), $manifest->getType());
+        $this->addCopyright($manifest->getCopyrightInformation());
+        $this->addRequirements($manifest->getRequirements());
+        $this->addBundles($manifest->getBundledComponents());
+
+        return $this->finishDocument();
+    }
+
+    private function startDocument() {
+        $xmlWriter = new XMLWriter();
+        $xmlWriter->openMemory();
+        $xmlWriter->setIndent(true);
+        $xmlWriter->setIndentString(str_repeat(' ', 4));
+        $xmlWriter->startDocument('1.0', 'UTF-8');
+        $xmlWriter->startElement('phar');
+        $xmlWriter->writeAttribute('xmlns', 'https://phar.io/xml/manifest/1.0');
+
+        $this->xmlWriter = $xmlWriter;
+    }
+
+    private function finishDocument() {
+        $this->xmlWriter->endElement();
+        $this->xmlWriter->endDocument();
+
+        return $this->xmlWriter->outputMemory();
+    }
+
+    private function addContains($name, Version $version, Type $type) {
+        $this->xmlWriter->startElement('contains');
+        $this->xmlWriter->writeAttribute('name', $name);
+        $this->xmlWriter->writeAttribute('version', $version->getVersionString());
+
+        switch (true) {
+            case $type->isApplication(): {
+                $this->xmlWriter->writeAttribute('type', 'application');
+                break;
+            }
+
+            case $type->isLibrary(): {
+                $this->xmlWriter->writeAttribute('type', 'library');
+                break;
+            }
+
+            case $type->isExtension(): {
+                /* @var $type Extension */
+                $this->xmlWriter->writeAttribute('type', 'extension');
+                $this->addExtension($type->getApplicationName(), $type->getVersionConstraint());
+                break;
+            }
+
+            default: {
+                $this->xmlWriter->writeAttribute('type', 'custom');
+            }
+        }
+
+        $this->xmlWriter->endElement();
+    }
+
+    private function addCopyright(CopyrightInformation $copyrightInformation) {
+        $this->xmlWriter->startElement('copyright');
+
+        foreach($copyrightInformation->getAuthors() as $author) {
+            $this->xmlWriter->startElement('author');
+            $this->xmlWriter->writeAttribute('name', $author->getName());
+            $this->xmlWriter->writeAttribute('email', (string) $author->getEmail());
+            $this->xmlWriter->endElement();
+        }
+
+        $license = $copyrightInformation->getLicense();
+
+        $this->xmlWriter->startElement('license');
+        $this->xmlWriter->writeAttribute('type', $license->getName());
+        $this->xmlWriter->writeAttribute('url', $license->getUrl());
+        $this->xmlWriter->endElement();
+
+        $this->xmlWriter->endElement();
+    }
+
+    private function addRequirements(RequirementCollection $requirementCollection) {
+        $phpRequirement = new AnyVersionConstraint();
+        $extensions     = [];
+
+        foreach($requirementCollection as $requirement) {
+            if ($requirement instanceof PhpVersionRequirement) {
+                $phpRequirement = $requirement->getVersionConstraint();
+                continue;
+            }
+
+            if ($requirement instanceof PhpExtensionRequirement) {
+                $extensions[] = (string) $requirement;
+            }
+        }
+
+        $this->xmlWriter->startElement('requires');
+        $this->xmlWriter->startElement('php');
+        $this->xmlWriter->writeAttribute('version', $phpRequirement->asString());
+
+        foreach($extensions as $extension) {
+            $this->xmlWriter->startElement('ext');
+            $this->xmlWriter->writeAttribute('name', $extension);
+            $this->xmlWriter->endElement();
+        }
+
+        $this->xmlWriter->endElement();
+        $this->xmlWriter->endElement();
+    }
+
+    private function addBundles(BundledComponentCollection $bundledComponentCollection) {
+        if (count($bundledComponentCollection) === 0) {
+            return;
+        }
+        $this->xmlWriter->startElement('bundles');
+
+        foreach($bundledComponentCollection as $bundledComponent) {
+            $this->xmlWriter->startElement('component');
+            $this->xmlWriter->writeAttribute('name', $bundledComponent->getName());
+            $this->xmlWriter->writeAttribute('version', $bundledComponent->getVersion()->getVersionString());
+            $this->xmlWriter->endElement();
+        }
+
+        $this->xmlWriter->endElement();
+    }
+
+    private function addExtension($application, VersionConstraint $versionConstraint) {
+        $this->xmlWriter->startElement('extension');
+        $this->xmlWriter->writeAttribute('for', $application);
+        $this->xmlWriter->writeAttribute('compatible', $versionConstraint->asString());
+        $this->xmlWriter->endElement();
+    }
+}
diff --git a/vendor/phar-io/manifest/src/exceptions/Exception.php b/vendor/phar-io/manifest/src/exceptions/Exception.php
new file mode 100644
index 0000000000..3ce46f24c3
--- /dev/null
+++ b/vendor/phar-io/manifest/src/exceptions/Exception.php
@@ -0,0 +1,14 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+interface Exception {
+}
diff --git a/vendor/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php b/vendor/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php
new file mode 100644
index 0000000000..a53735a4b7
--- /dev/null
+++ b/vendor/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php
@@ -0,0 +1,16 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+class InvalidApplicationNameException extends \InvalidArgumentException implements Exception {
+    const NotAString    = 1;
+    const InvalidFormat = 2;
+}
diff --git a/vendor/phar-io/manifest/src/exceptions/InvalidEmailException.php b/vendor/phar-io/manifest/src/exceptions/InvalidEmailException.php
new file mode 100644
index 0000000000..854399b292
--- /dev/null
+++ b/vendor/phar-io/manifest/src/exceptions/InvalidEmailException.php
@@ -0,0 +1,14 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+class InvalidEmailException extends \InvalidArgumentException implements Exception {
+}
diff --git a/vendor/phar-io/manifest/src/exceptions/InvalidUrlException.php b/vendor/phar-io/manifest/src/exceptions/InvalidUrlException.php
new file mode 100644
index 0000000000..cdd832340e
--- /dev/null
+++ b/vendor/phar-io/manifest/src/exceptions/InvalidUrlException.php
@@ -0,0 +1,14 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+class InvalidUrlException extends \InvalidArgumentException implements Exception {
+}
diff --git a/vendor/phar-io/manifest/src/exceptions/ManifestDocumentException.php b/vendor/phar-io/manifest/src/exceptions/ManifestDocumentException.php
new file mode 100644
index 0000000000..8b40195ef0
--- /dev/null
+++ b/vendor/phar-io/manifest/src/exceptions/ManifestDocumentException.php
@@ -0,0 +1,6 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+class Application extends Type {
+    /**
+     * @return bool
+     */
+    public function isApplication() {
+        return true;
+    }
+}
diff --git a/vendor/phar-io/manifest/src/values/ApplicationName.php b/vendor/phar-io/manifest/src/values/ApplicationName.php
new file mode 100644
index 0000000000..1e71af48eb
--- /dev/null
+++ b/vendor/phar-io/manifest/src/values/ApplicationName.php
@@ -0,0 +1,65 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+class ApplicationName {
+    /**
+     * @var string
+     */
+    private $name;
+
+    /**
+     * ApplicationName constructor.
+     *
+     * @param string $name
+     *
+     * @throws InvalidApplicationNameException
+     */
+    public function __construct($name) {
+        $this->ensureIsString($name);
+        $this->ensureValidFormat($name);
+        $this->name = $name;
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString() {
+        return $this->name;
+    }
+
+    public function isEqual(ApplicationName $name) {
+        return $this->name === $name->name;
+    }
+
+    /**
+     * @param string $name
+     *
+     * @throws InvalidApplicationNameException
+     */
+    private function ensureValidFormat($name) {
+        if (!preg_match('#\w/\w#', $name)) {
+            throw new InvalidApplicationNameException(
+                sprintf('Format of name "%s" is not valid - expected: vendor/packagename', $name),
+                InvalidApplicationNameException::InvalidFormat
+            );
+        }
+    }
+
+    private function ensureIsString($name) {
+        if (!is_string($name)) {
+            throw new InvalidApplicationNameException(
+                'Name must be a string',
+                InvalidApplicationNameException::NotAString
+            );
+        }
+    }
+}
diff --git a/vendor/phar-io/manifest/src/values/Author.php b/vendor/phar-io/manifest/src/values/Author.php
new file mode 100644
index 0000000000..8295f513ea
--- /dev/null
+++ b/vendor/phar-io/manifest/src/values/Author.php
@@ -0,0 +1,57 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+class Author {
+    /**
+     * @var string
+     */
+    private $name;
+
+    /**
+     * @var Email
+     */
+    private $email;
+
+    /**
+     * @param string $name
+     * @param Email  $email
+     */
+    public function __construct($name, Email $email) {
+        $this->name  = $name;
+        $this->email = $email;
+    }
+
+    /**
+     * @return string
+     */
+    public function getName() {
+        return $this->name;
+    }
+
+    /**
+     * @return Email
+     */
+    public function getEmail() {
+        return $this->email;
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString() {
+        return sprintf(
+            '%s <%s>',
+            $this->name,
+            $this->email
+        );
+    }
+}
diff --git a/vendor/phar-io/manifest/src/values/AuthorCollection.php b/vendor/phar-io/manifest/src/values/AuthorCollection.php
new file mode 100644
index 0000000000..d9158793ad
--- /dev/null
+++ b/vendor/phar-io/manifest/src/values/AuthorCollection.php
@@ -0,0 +1,43 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+class AuthorCollection implements \Countable, \IteratorAggregate {
+    /**
+     * @var Author[]
+     */
+    private $authors = [];
+
+    public function add(Author $author) {
+        $this->authors[] = $author;
+    }
+
+    /**
+     * @return Author[]
+     */
+    public function getAuthors() {
+        return $this->authors;
+    }
+
+    /**
+     * @return int
+     */
+    public function count() {
+        return count($this->authors);
+    }
+
+    /**
+     * @return AuthorCollectionIterator
+     */
+    public function getIterator() {
+        return new AuthorCollectionIterator($this);
+    }
+}
diff --git a/vendor/phar-io/manifest/src/values/AuthorCollectionIterator.php b/vendor/phar-io/manifest/src/values/AuthorCollectionIterator.php
new file mode 100644
index 0000000000..792a05029f
--- /dev/null
+++ b/vendor/phar-io/manifest/src/values/AuthorCollectionIterator.php
@@ -0,0 +1,56 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+class AuthorCollectionIterator implements \Iterator {
+    /**
+     * @var Author[]
+     */
+    private $authors = [];
+
+    /**
+     * @var int
+     */
+    private $position;
+
+    public function __construct(AuthorCollection $authors) {
+        $this->authors = $authors->getAuthors();
+    }
+
+    public function rewind() {
+        $this->position = 0;
+    }
+
+    /**
+     * @return bool
+     */
+    public function valid() {
+        return $this->position < count($this->authors);
+    }
+
+    /**
+     * @return int
+     */
+    public function key() {
+        return $this->position;
+    }
+
+    /**
+     * @return Author
+     */
+    public function current() {
+        return $this->authors[$this->position];
+    }
+
+    public function next() {
+        $this->position++;
+    }
+}
diff --git a/vendor/phar-io/manifest/src/values/BundledComponent.php b/vendor/phar-io/manifest/src/values/BundledComponent.php
new file mode 100644
index 0000000000..846d15a396
--- /dev/null
+++ b/vendor/phar-io/manifest/src/values/BundledComponent.php
@@ -0,0 +1,48 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+use PharIo\Version\Version;
+
+class BundledComponent {
+    /**
+     * @var string
+     */
+    private $name;
+
+    /**
+     * @var Version
+     */
+    private $version;
+
+    /**
+     * @param string  $name
+     * @param Version $version
+     */
+    public function __construct($name, Version $version) {
+        $this->name    = $name;
+        $this->version = $version;
+    }
+
+    /**
+     * @return string
+     */
+    public function getName() {
+        return $this->name;
+    }
+
+    /**
+     * @return Version
+     */
+    public function getVersion() {
+        return $this->version;
+    }
+}
diff --git a/vendor/phar-io/manifest/src/values/BundledComponentCollection.php b/vendor/phar-io/manifest/src/values/BundledComponentCollection.php
new file mode 100644
index 0000000000..2dbb918c00
--- /dev/null
+++ b/vendor/phar-io/manifest/src/values/BundledComponentCollection.php
@@ -0,0 +1,43 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+class BundledComponentCollection implements \Countable, \IteratorAggregate {
+    /**
+     * @var BundledComponent[]
+     */
+    private $bundledComponents = [];
+
+    public function add(BundledComponent $bundledComponent) {
+        $this->bundledComponents[] = $bundledComponent;
+    }
+
+    /**
+     * @return BundledComponent[]
+     */
+    public function getBundledComponents() {
+        return $this->bundledComponents;
+    }
+
+    /**
+     * @return int
+     */
+    public function count() {
+        return count($this->bundledComponents);
+    }
+
+    /**
+     * @return BundledComponentCollectionIterator
+     */
+    public function getIterator() {
+        return new BundledComponentCollectionIterator($this);
+    }
+}
diff --git a/vendor/phar-io/manifest/src/values/BundledComponentCollectionIterator.php b/vendor/phar-io/manifest/src/values/BundledComponentCollectionIterator.php
new file mode 100644
index 0000000000..13b8f050c7
--- /dev/null
+++ b/vendor/phar-io/manifest/src/values/BundledComponentCollectionIterator.php
@@ -0,0 +1,56 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+class BundledComponentCollectionIterator implements \Iterator {
+    /**
+     * @var BundledComponent[]
+     */
+    private $bundledComponents = [];
+
+    /**
+     * @var int
+     */
+    private $position;
+
+    public function __construct(BundledComponentCollection $bundledComponents) {
+        $this->bundledComponents = $bundledComponents->getBundledComponents();
+    }
+
+    public function rewind() {
+        $this->position = 0;
+    }
+
+    /**
+     * @return bool
+     */
+    public function valid() {
+        return $this->position < count($this->bundledComponents);
+    }
+
+    /**
+     * @return int
+     */
+    public function key() {
+        return $this->position;
+    }
+
+    /**
+     * @return BundledComponent
+     */
+    public function current() {
+        return $this->bundledComponents[$this->position];
+    }
+
+    public function next() {
+        $this->position++;
+    }
+}
diff --git a/vendor/phar-io/manifest/src/values/CopyrightInformation.php b/vendor/phar-io/manifest/src/values/CopyrightInformation.php
new file mode 100644
index 0000000000..ece60b1941
--- /dev/null
+++ b/vendor/phar-io/manifest/src/values/CopyrightInformation.php
@@ -0,0 +1,42 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+class CopyrightInformation {
+    /**
+     * @var AuthorCollection
+     */
+    private $authors;
+
+    /**
+     * @var License
+     */
+    private $license;
+
+    public function __construct(AuthorCollection $authors, License $license) {
+        $this->authors = $authors;
+        $this->license = $license;
+    }
+
+    /**
+     * @return AuthorCollection
+     */
+    public function getAuthors() {
+        return $this->authors;
+    }
+
+    /**
+     * @return License
+     */
+    public function getLicense() {
+        return $this->license;
+    }
+}
diff --git a/vendor/phar-io/manifest/src/values/Email.php b/vendor/phar-io/manifest/src/values/Email.php
new file mode 100644
index 0000000000..57cce042d3
--- /dev/null
+++ b/vendor/phar-io/manifest/src/values/Email.php
@@ -0,0 +1,47 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+class Email {
+    /**
+     * @var string
+     */
+    private $email;
+
+    /**
+     * @param string $email
+     *
+     * @throws InvalidEmailException
+     */
+    public function __construct($email) {
+        $this->ensureEmailIsValid($email);
+
+        $this->email = $email;
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString() {
+        return $this->email;
+    }
+
+    /**
+     * @param string $url
+     *
+     * @throws InvalidEmailException
+     */
+    private function ensureEmailIsValid($url) {
+        if (filter_var($url, \FILTER_VALIDATE_EMAIL) === false) {
+            throw new InvalidEmailException;
+        }
+    }
+}
diff --git a/vendor/phar-io/manifest/src/values/Extension.php b/vendor/phar-io/manifest/src/values/Extension.php
new file mode 100644
index 0000000000..90d6a6fd77
--- /dev/null
+++ b/vendor/phar-io/manifest/src/values/Extension.php
@@ -0,0 +1,75 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+use PharIo\Version\Version;
+use PharIo\Version\VersionConstraint;
+
+class Extension extends Type {
+    /**
+     * @var ApplicationName
+     */
+    private $application;
+
+    /**
+     * @var VersionConstraint
+     */
+    private $versionConstraint;
+
+    /**
+     * @param ApplicationName   $application
+     * @param VersionConstraint $versionConstraint
+     */
+    public function __construct(ApplicationName $application, VersionConstraint $versionConstraint) {
+        $this->application       = $application;
+        $this->versionConstraint = $versionConstraint;
+    }
+
+    /**
+     * @return ApplicationName
+     */
+    public function getApplicationName() {
+        return $this->application;
+    }
+
+    /**
+     * @return VersionConstraint
+     */
+    public function getVersionConstraint() {
+        return $this->versionConstraint;
+    }
+
+    /**
+     * @return bool
+     */
+    public function isExtension() {
+        return true;
+    }
+
+    /**
+     * @param ApplicationName $name
+     *
+     * @return bool
+     */
+    public function isExtensionFor(ApplicationName $name) {
+        return $this->application->isEqual($name);
+    }
+
+    /**
+     * @param ApplicationName $name
+     * @param Version         $version
+     *
+     * @return bool
+     */
+    public function isCompatibleWith(ApplicationName $name, Version $version) {
+        return $this->isExtensionFor($name) && $this->versionConstraint->complies($version);
+    }
+}
diff --git a/vendor/phar-io/manifest/src/values/Library.php b/vendor/phar-io/manifest/src/values/Library.php
new file mode 100644
index 0000000000..a6ff94438b
--- /dev/null
+++ b/vendor/phar-io/manifest/src/values/Library.php
@@ -0,0 +1,20 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+class Library extends Type {
+    /**
+     * @return bool
+     */
+    public function isLibrary() {
+        return true;
+    }
+}
diff --git a/vendor/phar-io/manifest/src/values/License.php b/vendor/phar-io/manifest/src/values/License.php
new file mode 100644
index 0000000000..e278670a98
--- /dev/null
+++ b/vendor/phar-io/manifest/src/values/License.php
@@ -0,0 +1,42 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+class License {
+    /**
+     * @var string
+     */
+    private $name;
+
+    /**
+     * @var Url
+     */
+    private $url;
+
+    public function __construct($name, Url $url) {
+        $this->name = $name;
+        $this->url  = $url;
+    }
+
+    /**
+     * @return string
+     */
+    public function getName() {
+        return $this->name;
+    }
+
+    /**
+     * @return Url
+     */
+    public function getUrl() {
+        return $this->url;
+    }
+}
diff --git a/vendor/phar-io/manifest/src/values/Manifest.php b/vendor/phar-io/manifest/src/values/Manifest.php
new file mode 100644
index 0000000000..217acefc6a
--- /dev/null
+++ b/vendor/phar-io/manifest/src/values/Manifest.php
@@ -0,0 +1,138 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+use PharIo\Version\Version;
+
+class Manifest {
+    /**
+     * @var ApplicationName
+     */
+    private $name;
+
+    /**
+     * @var Version
+     */
+    private $version;
+
+    /**
+     * @var Type
+     */
+    private $type;
+
+    /**
+     * @var CopyrightInformation
+     */
+    private $copyrightInformation;
+
+    /**
+     * @var RequirementCollection
+     */
+    private $requirements;
+
+    /**
+     * @var BundledComponentCollection
+     */
+    private $bundledComponents;
+
+    public function __construct(ApplicationName $name, Version $version, Type $type, CopyrightInformation $copyrightInformation, RequirementCollection $requirements, BundledComponentCollection $bundledComponents) {
+        $this->name                 = $name;
+        $this->version              = $version;
+        $this->type                 = $type;
+        $this->copyrightInformation = $copyrightInformation;
+        $this->requirements         = $requirements;
+        $this->bundledComponents    = $bundledComponents;
+    }
+
+    /**
+     * @return ApplicationName
+     */
+    public function getName() {
+        return $this->name;
+    }
+
+    /**
+     * @return Version
+     */
+    public function getVersion() {
+        return $this->version;
+    }
+
+    /**
+     * @return Type
+     */
+    public function getType() {
+        return $this->type;
+    }
+
+    /**
+     * @return CopyrightInformation
+     */
+    public function getCopyrightInformation() {
+        return $this->copyrightInformation;
+    }
+
+    /**
+     * @return RequirementCollection
+     */
+    public function getRequirements() {
+        return $this->requirements;
+    }
+
+    /**
+     * @return BundledComponentCollection
+     */
+    public function getBundledComponents() {
+        return $this->bundledComponents;
+    }
+
+    /**
+     * @return bool
+     */
+    public function isApplication() {
+        return $this->type->isApplication();
+    }
+
+    /**
+     * @return bool
+     */
+    public function isLibrary() {
+        return $this->type->isLibrary();
+    }
+
+    /**
+     * @return bool
+     */
+    public function isExtension() {
+        return $this->type->isExtension();
+    }
+
+    /**
+     * @param ApplicationName $application
+     * @param Version|null    $version
+     *
+     * @return bool
+     */
+    public function isExtensionFor(ApplicationName $application, Version $version = null) {
+        if (!$this->isExtension()) {
+            return false;
+        }
+
+        /** @var Extension $type */
+        $type = $this->type;
+
+        if ($version !== null) {
+            return $type->isCompatibleWith($application, $version);
+        }
+
+        return $type->isExtensionFor($application);
+    }
+}
diff --git a/vendor/phar-io/manifest/src/values/PhpExtensionRequirement.php b/vendor/phar-io/manifest/src/values/PhpExtensionRequirement.php
new file mode 100644
index 0000000000..6dd9296885
--- /dev/null
+++ b/vendor/phar-io/manifest/src/values/PhpExtensionRequirement.php
@@ -0,0 +1,32 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+class PhpExtensionRequirement implements Requirement {
+    /**
+     * @var string
+     */
+    private $extension;
+
+    /**
+     * @param string $extension
+     */
+    public function __construct($extension) {
+        $this->extension = $extension;
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString() {
+        return $this->extension;
+    }
+}
diff --git a/vendor/phar-io/manifest/src/values/PhpVersionRequirement.php b/vendor/phar-io/manifest/src/values/PhpVersionRequirement.php
new file mode 100644
index 0000000000..8ad3e76916
--- /dev/null
+++ b/vendor/phar-io/manifest/src/values/PhpVersionRequirement.php
@@ -0,0 +1,31 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+use PharIo\Version\VersionConstraint;
+
+class PhpVersionRequirement implements Requirement {
+    /**
+     * @var VersionConstraint
+     */
+    private $versionConstraint;
+
+    public function __construct(VersionConstraint $versionConstraint) {
+        $this->versionConstraint = $versionConstraint;
+    }
+
+    /**
+     * @return VersionConstraint
+     */
+    public function getVersionConstraint() {
+        return $this->versionConstraint;
+    }
+}
diff --git a/vendor/phar-io/manifest/src/values/Requirement.php b/vendor/phar-io/manifest/src/values/Requirement.php
new file mode 100644
index 0000000000..03bb56d118
--- /dev/null
+++ b/vendor/phar-io/manifest/src/values/Requirement.php
@@ -0,0 +1,14 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+interface Requirement {
+}
diff --git a/vendor/phar-io/manifest/src/values/RequirementCollection.php b/vendor/phar-io/manifest/src/values/RequirementCollection.php
new file mode 100644
index 0000000000..af0e09b867
--- /dev/null
+++ b/vendor/phar-io/manifest/src/values/RequirementCollection.php
@@ -0,0 +1,43 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+class RequirementCollection implements \Countable, \IteratorAggregate {
+    /**
+     * @var Requirement[]
+     */
+    private $requirements = [];
+
+    public function add(Requirement $requirement) {
+        $this->requirements[] = $requirement;
+    }
+
+    /**
+     * @return Requirement[]
+     */
+    public function getRequirements() {
+        return $this->requirements;
+    }
+
+    /**
+     * @return int
+     */
+    public function count() {
+        return count($this->requirements);
+    }
+
+    /**
+     * @return RequirementCollectionIterator
+     */
+    public function getIterator() {
+        return new RequirementCollectionIterator($this);
+    }
+}
diff --git a/vendor/phar-io/manifest/src/values/RequirementCollectionIterator.php b/vendor/phar-io/manifest/src/values/RequirementCollectionIterator.php
new file mode 100644
index 0000000000..9bb7003dbc
--- /dev/null
+++ b/vendor/phar-io/manifest/src/values/RequirementCollectionIterator.php
@@ -0,0 +1,56 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+class RequirementCollectionIterator implements \Iterator {
+    /**
+     * @var Requirement[]
+     */
+    private $requirements = [];
+
+    /**
+     * @var int
+     */
+    private $position;
+
+    public function __construct(RequirementCollection $requirements) {
+        $this->requirements = $requirements->getRequirements();
+    }
+
+    public function rewind() {
+        $this->position = 0;
+    }
+
+    /**
+     * @return bool
+     */
+    public function valid() {
+        return $this->position < count($this->requirements);
+    }
+
+    /**
+     * @return int
+     */
+    public function key() {
+        return $this->position;
+    }
+
+    /**
+     * @return Requirement
+     */
+    public function current() {
+        return $this->requirements[$this->position];
+    }
+
+    public function next() {
+        $this->position++;
+    }
+}
diff --git a/vendor/phar-io/manifest/src/values/Type.php b/vendor/phar-io/manifest/src/values/Type.php
new file mode 100644
index 0000000000..31fbd440e9
--- /dev/null
+++ b/vendor/phar-io/manifest/src/values/Type.php
@@ -0,0 +1,60 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+use PharIo\Version\VersionConstraint;
+
+abstract class Type {
+    /**
+     * @return Application
+     */
+    public static function application() {
+        return new Application;
+    }
+
+    /**
+     * @return Library
+     */
+    public static function library() {
+        return new Library;
+    }
+
+    /**
+     * @param ApplicationName   $application
+     * @param VersionConstraint $versionConstraint
+     *
+     * @return Extension
+     */
+    public static function extension(ApplicationName $application, VersionConstraint $versionConstraint) {
+        return new Extension($application, $versionConstraint);
+    }
+
+    /**
+     * @return bool
+     */
+    public function isApplication() {
+        return false;
+    }
+
+    /**
+     * @return bool
+     */
+    public function isLibrary() {
+        return false;
+    }
+
+    /**
+     * @return bool
+     */
+    public function isExtension() {
+        return false;
+    }
+}
diff --git a/vendor/phar-io/manifest/src/values/Url.php b/vendor/phar-io/manifest/src/values/Url.php
new file mode 100644
index 0000000000..37917c8c61
--- /dev/null
+++ b/vendor/phar-io/manifest/src/values/Url.php
@@ -0,0 +1,47 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+class Url {
+    /**
+     * @var string
+     */
+    private $url;
+
+    /**
+     * @param string $url
+     *
+     * @throws InvalidUrlException
+     */
+    public function __construct($url) {
+        $this->ensureUrlIsValid($url);
+
+        $this->url = $url;
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString() {
+        return $this->url;
+    }
+
+    /**
+     * @param string $url
+     *
+     * @throws InvalidUrlException
+     */
+    private function ensureUrlIsValid($url) {
+        if (filter_var($url, \FILTER_VALIDATE_URL) === false) {
+            throw new InvalidUrlException;
+        }
+    }
+}
diff --git a/vendor/phar-io/manifest/src/xml/AuthorElement.php b/vendor/phar-io/manifest/src/xml/AuthorElement.php
new file mode 100644
index 0000000000..a32f39737b
--- /dev/null
+++ b/vendor/phar-io/manifest/src/xml/AuthorElement.php
@@ -0,0 +1,21 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+class AuthorElement extends ManifestElement {
+    public function getName() {
+        return $this->getAttributeValue('name');
+    }
+
+    public function getEmail() {
+        return $this->getAttributeValue('email');
+    }
+}
diff --git a/vendor/phar-io/manifest/src/xml/AuthorElementCollection.php b/vendor/phar-io/manifest/src/xml/AuthorElementCollection.php
new file mode 100644
index 0000000000..1240d8c1ba
--- /dev/null
+++ b/vendor/phar-io/manifest/src/xml/AuthorElementCollection.php
@@ -0,0 +1,19 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+class AuthorElementCollection extends ElementCollection {
+    public function current() {
+        return new AuthorElement(
+            $this->getCurrentElement()
+        );
+    }
+}
diff --git a/vendor/phar-io/manifest/src/xml/BundlesElement.php b/vendor/phar-io/manifest/src/xml/BundlesElement.php
new file mode 100644
index 0000000000..b90023e4fc
--- /dev/null
+++ b/vendor/phar-io/manifest/src/xml/BundlesElement.php
@@ -0,0 +1,19 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+class BundlesElement extends ManifestElement {
+    public function getComponentElements() {
+        return new ComponentElementCollection(
+            $this->getChildrenByName('component')
+        );
+    }
+}
diff --git a/vendor/phar-io/manifest/src/xml/ComponentElement.php b/vendor/phar-io/manifest/src/xml/ComponentElement.php
new file mode 100644
index 0000000000..64ed6b0dda
--- /dev/null
+++ b/vendor/phar-io/manifest/src/xml/ComponentElement.php
@@ -0,0 +1,21 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+class ComponentElement extends ManifestElement {
+    public function getName() {
+        return $this->getAttributeValue('name');
+    }
+
+    public function getVersion() {
+        return $this->getAttributeValue('version');
+    }
+}
diff --git a/vendor/phar-io/manifest/src/xml/ComponentElementCollection.php b/vendor/phar-io/manifest/src/xml/ComponentElementCollection.php
new file mode 100644
index 0000000000..9d375f981e
--- /dev/null
+++ b/vendor/phar-io/manifest/src/xml/ComponentElementCollection.php
@@ -0,0 +1,19 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+class ComponentElementCollection extends ElementCollection {
+    public function current() {
+        return new ComponentElement(
+            $this->getCurrentElement()
+        );
+    }
+}
diff --git a/vendor/phar-io/manifest/src/xml/ContainsElement.php b/vendor/phar-io/manifest/src/xml/ContainsElement.php
new file mode 100644
index 0000000000..8172f3341c
--- /dev/null
+++ b/vendor/phar-io/manifest/src/xml/ContainsElement.php
@@ -0,0 +1,31 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+class ContainsElement extends ManifestElement {
+    public function getName() {
+        return $this->getAttributeValue('name');
+    }
+
+    public function getVersion() {
+        return $this->getAttributeValue('version');
+    }
+
+    public function getType() {
+        return $this->getAttributeValue('type');
+    }
+
+    public function getExtensionElement() {
+        return new ExtensionElement(
+            $this->getChildByName('extension')
+        );
+    }
+}
diff --git a/vendor/phar-io/manifest/src/xml/CopyrightElement.php b/vendor/phar-io/manifest/src/xml/CopyrightElement.php
new file mode 100644
index 0000000000..bf7848e410
--- /dev/null
+++ b/vendor/phar-io/manifest/src/xml/CopyrightElement.php
@@ -0,0 +1,25 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+class CopyrightElement extends ManifestElement {
+    public function getAuthorElements() {
+        return new AuthorElementCollection(
+            $this->getChildrenByName('author')
+        );
+    }
+
+    public function getLicenseElement() {
+        return new LicenseElement(
+            $this->getChildByName('license')
+        );
+    }
+}
diff --git a/vendor/phar-io/manifest/src/xml/ElementCollection.php b/vendor/phar-io/manifest/src/xml/ElementCollection.php
new file mode 100644
index 0000000000..284e77b6e0
--- /dev/null
+++ b/vendor/phar-io/manifest/src/xml/ElementCollection.php
@@ -0,0 +1,58 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+use DOMElement;
+use DOMNodeList;
+
+abstract class ElementCollection implements \Iterator {
+    /**
+     * @var DOMNodeList
+     */
+    private $nodeList;
+
+    private $position;
+
+    /**
+     * ElementCollection constructor.
+     *
+     * @param DOMNodeList $nodeList
+     */
+    public function __construct(DOMNodeList $nodeList) {
+        $this->nodeList = $nodeList;
+        $this->position = 0;
+    }
+
+    abstract public function current();
+
+    /**
+     * @return DOMElement
+     */
+    protected function getCurrentElement() {
+        return $this->nodeList->item($this->position);
+    }
+
+    public function next() {
+        $this->position++;
+    }
+
+    public function key() {
+        return $this->position;
+    }
+
+    public function valid() {
+        return $this->position < $this->nodeList->length;
+    }
+
+    public function rewind() {
+        $this->position = 0;
+    }
+}
diff --git a/vendor/phar-io/manifest/src/xml/ExtElement.php b/vendor/phar-io/manifest/src/xml/ExtElement.php
new file mode 100644
index 0000000000..7a824ab7c5
--- /dev/null
+++ b/vendor/phar-io/manifest/src/xml/ExtElement.php
@@ -0,0 +1,17 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+class ExtElement extends ManifestElement {
+    public function getName() {
+        return $this->getAttributeValue('name');
+    }
+}
diff --git a/vendor/phar-io/manifest/src/xml/ExtElementCollection.php b/vendor/phar-io/manifest/src/xml/ExtElementCollection.php
new file mode 100644
index 0000000000..17acc62a58
--- /dev/null
+++ b/vendor/phar-io/manifest/src/xml/ExtElementCollection.php
@@ -0,0 +1,20 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+class ExtElementCollection extends ElementCollection {
+    public function current() {
+        return new ExtElement(
+            $this->getCurrentElement()
+        );
+    }
+
+}
diff --git a/vendor/phar-io/manifest/src/xml/ExtensionElement.php b/vendor/phar-io/manifest/src/xml/ExtensionElement.php
new file mode 100644
index 0000000000..536c085cb8
--- /dev/null
+++ b/vendor/phar-io/manifest/src/xml/ExtensionElement.php
@@ -0,0 +1,21 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+class ExtensionElement extends ManifestElement {
+    public function getFor() {
+        return $this->getAttributeValue('for');
+    }
+
+    public function getCompatible() {
+        return $this->getAttributeValue('compatible');
+    }
+}
diff --git a/vendor/phar-io/manifest/src/xml/LicenseElement.php b/vendor/phar-io/manifest/src/xml/LicenseElement.php
new file mode 100644
index 0000000000..ee001dfa31
--- /dev/null
+++ b/vendor/phar-io/manifest/src/xml/LicenseElement.php
@@ -0,0 +1,21 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+class LicenseElement extends ManifestElement {
+    public function getType() {
+        return $this->getAttributeValue('type');
+    }
+
+    public function getUrl() {
+        return $this->getAttributeValue('url');
+    }
+}
diff --git a/vendor/phar-io/manifest/src/xml/ManifestDocument.php b/vendor/phar-io/manifest/src/xml/ManifestDocument.php
new file mode 100644
index 0000000000..9b0bd9d9d0
--- /dev/null
+++ b/vendor/phar-io/manifest/src/xml/ManifestDocument.php
@@ -0,0 +1,118 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+use DOMDocument;
+use DOMElement;
+
+class ManifestDocument {
+    const XMLNS = 'https://phar.io/xml/manifest/1.0';
+
+    /**
+     * @var DOMDocument
+     */
+    private $dom;
+
+    /**
+     * ManifestDocument constructor.
+     *
+     * @param DOMDocument $dom
+     */
+    private function __construct(DOMDocument $dom) {
+        $this->ensureCorrectDocumentType($dom);
+
+        $this->dom = $dom;
+    }
+
+    public static function fromFile($filename) {
+        if (!file_exists($filename)) {
+            throw new ManifestDocumentException(
+                sprintf('File "%s" not found', $filename)
+            );
+        }
+
+        return self::fromString(
+            file_get_contents($filename)
+        );
+    }
+
+    public static function fromString($xmlString) {
+        $prev = libxml_use_internal_errors(true);
+        libxml_clear_errors();
+
+        $dom = new DOMDocument();
+        $dom->loadXML($xmlString);
+
+        $errors = libxml_get_errors();
+        libxml_use_internal_errors($prev);
+
+        if (count($errors) !== 0) {
+            throw new ManifestDocumentLoadingException($errors);
+        }
+
+        return new self($dom);
+    }
+
+    public function getContainsElement() {
+        return new ContainsElement(
+            $this->fetchElementByName('contains')
+        );
+    }
+
+    public function getCopyrightElement() {
+        return new CopyrightElement(
+            $this->fetchElementByName('copyright')
+        );
+    }
+
+    public function getRequiresElement() {
+        return new RequiresElement(
+            $this->fetchElementByName('requires')
+        );
+    }
+
+    public function hasBundlesElement() {
+        return $this->dom->getElementsByTagNameNS(self::XMLNS, 'bundles')->length === 1;
+    }
+
+    public function getBundlesElement() {
+        return new BundlesElement(
+            $this->fetchElementByName('bundles')
+        );
+    }
+
+    private function ensureCorrectDocumentType(DOMDocument $dom) {
+        $root = $dom->documentElement;
+
+        if ($root->localName !== 'phar' || $root->namespaceURI !== self::XMLNS) {
+            throw new ManifestDocumentException('Not a phar.io manifest document');
+        }
+    }
+
+    /**
+     * @param $elementName
+     *
+     * @return DOMElement
+     *
+     * @throws ManifestDocumentException
+     */
+    private function fetchElementByName($elementName) {
+        $element = $this->dom->getElementsByTagNameNS(self::XMLNS, $elementName)->item(0);
+
+        if (!$element instanceof DOMElement) {
+            throw new ManifestDocumentException(
+                sprintf('Element %s missing', $elementName)
+            );
+        }
+
+        return $element;
+    }
+}
diff --git a/vendor/phar-io/manifest/src/xml/ManifestDocumentLoadingException.php b/vendor/phar-io/manifest/src/xml/ManifestDocumentLoadingException.php
new file mode 100644
index 0000000000..59ac5c69d6
--- /dev/null
+++ b/vendor/phar-io/manifest/src/xml/ManifestDocumentLoadingException.php
@@ -0,0 +1,48 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+use LibXMLError;
+
+class ManifestDocumentLoadingException extends \Exception implements Exception {
+    /**
+     * @var LibXMLError[]
+     */
+    private $libxmlErrors;
+
+    /**
+     * ManifestDocumentLoadingException constructor.
+     *
+     * @param LibXMLError[] $libxmlErrors
+     */
+    public function __construct(array $libxmlErrors) {
+        $this->libxmlErrors = $libxmlErrors;
+        $first              = $this->libxmlErrors[0];
+
+        parent::__construct(
+            sprintf(
+                '%s (Line: %d / Column: %d / File: %s)',
+                $first->message,
+                $first->line,
+                $first->column,
+                $first->file
+            ),
+            $first->code
+        );
+    }
+
+    /**
+     * @return LibXMLError[]
+     */
+    public function getLibxmlErrors() {
+        return $this->libxmlErrors;
+    }
+}
diff --git a/vendor/phar-io/manifest/src/xml/ManifestElement.php b/vendor/phar-io/manifest/src/xml/ManifestElement.php
new file mode 100644
index 0000000000..09d07ccf64
--- /dev/null
+++ b/vendor/phar-io/manifest/src/xml/ManifestElement.php
@@ -0,0 +1,100 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+use DOMElement;
+use DOMNodeList;
+
+class ManifestElement {
+    const XMLNS = 'https://phar.io/xml/manifest/1.0';
+
+    /**
+     * @var DOMElement
+     */
+    private $element;
+
+    /**
+     * ContainsElement constructor.
+     *
+     * @param DOMElement $element
+     */
+    public function __construct(DOMElement $element) {
+        $this->element = $element;
+    }
+
+    /**
+     * @param string $name
+     *
+     * @return string
+     *
+     * @throws ManifestElementException
+     */
+    protected function getAttributeValue($name) {
+        if (!$this->element->hasAttribute($name)) {
+            throw new ManifestElementException(
+                sprintf(
+                    'Attribute %s not set on element %s',
+                    $name,
+                    $this->element->localName
+                )
+            );
+        }
+
+        return $this->element->getAttribute($name);
+    }
+
+    /**
+     * @param $elementName
+     *
+     * @return DOMElement
+     *
+     * @throws ManifestElementException
+     */
+    protected function getChildByName($elementName) {
+        $element = $this->element->getElementsByTagNameNS(self::XMLNS, $elementName)->item(0);
+
+        if (!$element instanceof DOMElement) {
+            throw new ManifestElementException(
+                sprintf('Element %s missing', $elementName)
+            );
+        }
+
+        return $element;
+    }
+
+    /**
+     * @param $elementName
+     *
+     * @return DOMNodeList
+     *
+     * @throws ManifestElementException
+     */
+    protected function getChildrenByName($elementName) {
+        $elementList = $this->element->getElementsByTagNameNS(self::XMLNS, $elementName);
+
+        if ($elementList->length === 0) {
+            throw new ManifestElementException(
+                sprintf('Element(s) %s missing', $elementName)
+            );
+        }
+
+        return $elementList;
+    }
+
+    /**
+     * @param string $elementName
+     *
+     * @return bool
+     */
+    protected function hasChild($elementName) {
+        return $this->element->getElementsByTagNameNS(self::XMLNS, $elementName)->length !== 0;
+    }
+}
diff --git a/vendor/phar-io/manifest/src/xml/PhpElement.php b/vendor/phar-io/manifest/src/xml/PhpElement.php
new file mode 100644
index 0000000000..e7340c0d3a
--- /dev/null
+++ b/vendor/phar-io/manifest/src/xml/PhpElement.php
@@ -0,0 +1,27 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+class PhpElement extends ManifestElement {
+    public function getVersion() {
+        return $this->getAttributeValue('version');
+    }
+
+    public function hasExtElements() {
+        return $this->hasChild('ext');
+    }
+
+    public function getExtElements() {
+        return new ExtElementCollection(
+            $this->getChildrenByName('ext')
+        );
+    }
+}
diff --git a/vendor/phar-io/manifest/src/xml/RequiresElement.php b/vendor/phar-io/manifest/src/xml/RequiresElement.php
new file mode 100644
index 0000000000..5f41b2eb1a
--- /dev/null
+++ b/vendor/phar-io/manifest/src/xml/RequiresElement.php
@@ -0,0 +1,19 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+class RequiresElement extends ManifestElement {
+    public function getPHPElement() {
+        return new PhpElement(
+            $this->getChildByName('php')
+        );
+    }
+}
diff --git a/vendor/phar-io/manifest/tests/ManifestDocumentMapperTest.php b/vendor/phar-io/manifest/tests/ManifestDocumentMapperTest.php
new file mode 100644
index 0000000000..c69d7619fd
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/ManifestDocumentMapperTest.php
@@ -0,0 +1,110 @@
+assertInstanceOf(
+            Manifest::class,
+            $mapper->map($manifestDocument)
+        );
+    }
+
+    public function dataProvider() {
+        return [
+            'application' => [__DIR__ . '/_fixture/phpunit-5.6.5.xml'],
+            'library'     => [__DIR__ . '/_fixture/library.xml'],
+            'extension'   => [__DIR__ . '/_fixture/extension.xml']
+        ];
+    }
+
+    public function testThrowsExceptionOnUnsupportedType() {
+        $manifestDocument = ManifestDocument::fromFile(__DIR__ . '/_fixture/custom.xml');
+        $mapper           = new ManifestDocumentMapper();
+
+        $this->expectException(ManifestDocumentMapperException::class);
+        $mapper->map($manifestDocument);
+    }
+
+    public function testInvalidVersionInformationThrowsException() {
+        $manifestDocument = ManifestDocument::fromFile(__DIR__ . '/_fixture/invalidversion.xml');
+        $mapper           = new ManifestDocumentMapper();
+
+        $this->expectException(ManifestDocumentMapperException::class);
+        $mapper->map($manifestDocument);
+    }
+
+    public function testInvalidVersionConstraintThrowsException() {
+        $manifestDocument = ManifestDocument::fromFile(__DIR__ . '/_fixture/invalidversionconstraint.xml');
+        $mapper           = new ManifestDocumentMapper();
+
+        $this->expectException(ManifestDocumentMapperException::class);
+        $mapper->map($manifestDocument);
+    }
+
+    /**
+     * @uses \PharIo\Manifest\ExtensionElement
+     */
+    public function testInvalidCompatibleConstraintThrowsException() {
+        $manifestDocument = ManifestDocument::fromFile(__DIR__ . '/_fixture/extension-invalidcompatible.xml');
+        $mapper           = new ManifestDocumentMapper();
+
+        $this->expectException(ManifestDocumentMapperException::class);
+        $mapper->map($manifestDocument);
+    }
+
+}
diff --git a/vendor/phar-io/manifest/tests/ManifestLoaderTest.php b/vendor/phar-io/manifest/tests/ManifestLoaderTest.php
new file mode 100644
index 0000000000..919143a30f
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/ManifestLoaderTest.php
@@ -0,0 +1,83 @@
+assertInstanceOf(
+            Manifest::class,
+            ManifestLoader::fromFile(__DIR__ . '/_fixture/library.xml')
+        );
+    }
+
+    public function testCanBeLoadedFromString() {
+        $this->assertInstanceOf(
+            Manifest::class,
+            ManifestLoader::fromString(
+                file_get_contents(__DIR__ . '/_fixture/library.xml')
+            )
+        );
+    }
+
+    public function testCanBeLoadedFromPhar() {
+        $this->assertInstanceOf(
+            Manifest::class,
+            ManifestLoader::fromPhar(__DIR__ . '/_fixture/test.phar')
+        );
+
+    }
+
+    public function testLoadingNonExistingFileThrowsException() {
+        $this->expectException(ManifestLoaderException::class);
+        ManifestLoader::fromFile('/not/existing');
+    }
+
+    /**
+     * @uses \PharIo\Manifest\ManifestDocumentLoadingException
+     */
+    public function testLoadingInvalidXmlThrowsException() {
+        $this->expectException(ManifestLoaderException::class);
+        ManifestLoader::fromString('');
+    }
+
+}
diff --git a/vendor/phar-io/manifest/tests/ManifestSerializerTest.php b/vendor/phar-io/manifest/tests/ManifestSerializerTest.php
new file mode 100644
index 0000000000..5fdf799fb5
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/ManifestSerializerTest.php
@@ -0,0 +1,114 @@
+assertXmlStringEqualsXmlString(
+            $expected,
+            $serializer->serializeToString($manifest)
+        );
+    }
+
+    public function dataProvider() {
+        return [
+            'application' => [file_get_contents(__DIR__ . '/_fixture/phpunit-5.6.5.xml')],
+            'library'     => [file_get_contents(__DIR__ . '/_fixture/library.xml')],
+            'extension'   => [file_get_contents(__DIR__ . '/_fixture/extension.xml')]
+        ];
+    }
+
+    /**
+     * @uses \PharIo\Manifest\Library
+     * @uses \PharIo\Manifest\ApplicationName
+     */
+    public function testCanSerializeToFile() {
+        $src        = __DIR__ . '/_fixture/library.xml';
+        $dest       = '/tmp/' . uniqid('serializer', true);
+        $manifest   = ManifestLoader::fromFile($src);
+        $serializer = new ManifestSerializer();
+        $serializer->serializeToFile($manifest, $dest);
+        $this->assertXmlFileEqualsXmlFile($src, $dest);
+        unlink($dest);
+    }
+
+    /**
+     * @uses \PharIo\Manifest\ApplicationName
+     */
+    public function testCanHandleUnknownType() {
+        $type     = $this->getMockForAbstractClass(Type::class);
+        $manifest = new Manifest(
+            new ApplicationName('testvendor/testname'),
+            new Version('1.0.0'),
+            $type,
+            new CopyrightInformation(
+                new AuthorCollection(),
+                new License('bsd-3', new Url('https://some/uri'))
+            ),
+            new RequirementCollection(),
+            new BundledComponentCollection()
+        );
+
+        $serializer = new ManifestSerializer();
+        $this->assertXmlStringEqualsXmlFile(
+            __DIR__ . '/_fixture/custom.xml',
+            $serializer->serializeToString($manifest)
+        );
+    }
+}
diff --git a/vendor/phar-io/manifest/tests/_fixture/custom.xml b/vendor/phar-io/manifest/tests/_fixture/custom.xml
new file mode 100644
index 0000000000..4f43828077
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/_fixture/custom.xml
@@ -0,0 +1,10 @@
+
+
+    
+    
+        
+    
+    
+        
+    
+
diff --git a/vendor/phar-io/manifest/tests/_fixture/extension-invalidcompatible.xml b/vendor/phar-io/manifest/tests/_fixture/extension-invalidcompatible.xml
new file mode 100644
index 0000000000..a78111c167
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/_fixture/extension-invalidcompatible.xml
@@ -0,0 +1,13 @@
+
+
+    
+        
+    
+    
+        
+        
+    
+    
+        
+    
+
diff --git a/vendor/phar-io/manifest/tests/_fixture/extension.xml b/vendor/phar-io/manifest/tests/_fixture/extension.xml
new file mode 100644
index 0000000000..a870aee8e4
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/_fixture/extension.xml
@@ -0,0 +1,13 @@
+
+
+    
+        
+    
+    
+        
+        
+    
+    
+        
+    
+
diff --git a/vendor/phar-io/manifest/tests/_fixture/invalidversion.xml b/vendor/phar-io/manifest/tests/_fixture/invalidversion.xml
new file mode 100644
index 0000000000..788dd4cd30
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/_fixture/invalidversion.xml
@@ -0,0 +1,11 @@
+
+
+    
+    
+        
+        
+    
+    
+        
+    
+
diff --git a/vendor/phar-io/manifest/tests/_fixture/invalidversionconstraint.xml b/vendor/phar-io/manifest/tests/_fixture/invalidversionconstraint.xml
new file mode 100644
index 0000000000..f881f8b039
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/_fixture/invalidversionconstraint.xml
@@ -0,0 +1,11 @@
+
+
+    
+    
+        
+        
+    
+    
+        
+    
+
diff --git a/vendor/phar-io/manifest/tests/_fixture/library.xml b/vendor/phar-io/manifest/tests/_fixture/library.xml
new file mode 100644
index 0000000000..a5e25237ac
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/_fixture/library.xml
@@ -0,0 +1,11 @@
+
+
+    
+    
+        
+        
+    
+    
+        
+    
+
diff --git a/vendor/phar-io/manifest/tests/_fixture/manifest.xml b/vendor/phar-io/manifest/tests/_fixture/manifest.xml
new file mode 100644
index 0000000000..a5e25237ac
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/_fixture/manifest.xml
@@ -0,0 +1,11 @@
+
+
+    
+    
+        
+        
+    
+    
+        
+    
+
diff --git a/vendor/phar-io/manifest/tests/_fixture/phpunit-5.6.5.xml b/vendor/phar-io/manifest/tests/_fixture/phpunit-5.6.5.xml
new file mode 100644
index 0000000000..aadbea2f93
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/_fixture/phpunit-5.6.5.xml
@@ -0,0 +1,46 @@
+
+
+    
+    
+        
+        
+    
+    
+        
+        
+            
+            
+            
+            
+            
+        
+    
+    
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+    
+
diff --git a/vendor/phar-io/manifest/tests/_fixture/test.phar b/vendor/phar-io/manifest/tests/_fixture/test.phar
new file mode 100644
index 0000000000..d2a3e393ea
Binary files /dev/null and b/vendor/phar-io/manifest/tests/_fixture/test.phar differ
diff --git a/vendor/phar-io/manifest/tests/exceptions/ManifestDocumentLoadingExceptionTest.php b/vendor/phar-io/manifest/tests/exceptions/ManifestDocumentLoadingExceptionTest.php
new file mode 100644
index 0000000000..70f7553804
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/exceptions/ManifestDocumentLoadingExceptionTest.php
@@ -0,0 +1,19 @@
+loadXML('');
+        $exception = new ManifestDocumentLoadingException(libxml_get_errors());
+        libxml_use_internal_errors($prev);
+
+        $this->assertContainsOnlyInstancesOf(LibXMLError::class, $exception->getLibxmlErrors());
+    }
+
+}
diff --git a/vendor/phar-io/manifest/tests/values/ApplicationNameTest.php b/vendor/phar-io/manifest/tests/values/ApplicationNameTest.php
new file mode 100644
index 0000000000..8ed3f3ab82
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/values/ApplicationNameTest.php
@@ -0,0 +1,57 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+use PHPUnit\Framework\TestCase;
+
+class ApplicationNameTest extends TestCase {
+
+    public function testCanBeCreatedWithValidName() {
+        $this->assertInstanceOf(
+            ApplicationName::class,
+            new ApplicationName('foo/bar')
+        );
+    }
+
+    public function testUsingInvalidFormatForNameThrowsException() {
+        $this->expectException(InvalidApplicationNameException::class);
+        $this->expectExceptionCode(InvalidApplicationNameException::InvalidFormat);
+        new ApplicationName('foo');
+    }
+
+    public function testUsingWrongTypeForNameThrowsException() {
+        $this->expectException(InvalidApplicationNameException::class);
+        $this->expectExceptionCode(InvalidApplicationNameException::NotAString);
+        new ApplicationName(123);
+    }
+
+    public function testReturnsTrueForEqualNamesWhenCompared() {
+        $app = new ApplicationName('foo/bar');
+        $this->assertTrue(
+            $app->isEqual($app)
+        );
+    }
+
+    public function testReturnsFalseForNonEqualNamesWhenCompared() {
+        $app1 = new ApplicationName('foo/bar');
+        $app2 = new ApplicationName('foo/foo');
+        $this->assertFalse(
+            $app1->isEqual($app2)
+        );
+    }
+
+    public function testCanBeConvertedToString() {
+        $this->assertEquals(
+            'foo/bar',
+            new ApplicationName('foo/bar')
+        );
+    }
+}
diff --git a/vendor/phar-io/manifest/tests/values/ApplicationTest.php b/vendor/phar-io/manifest/tests/values/ApplicationTest.php
new file mode 100644
index 0000000000..86b5da64d6
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/values/ApplicationTest.php
@@ -0,0 +1,44 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @covers PharIo\Manifest\Application
+ * @covers PharIo\Manifest\Type
+ */
+class ApplicationTest extends TestCase {
+    /**
+     * @var Application
+     */
+    private $type;
+
+    protected function setUp() {
+        $this->type = Type::application();
+    }
+
+    public function testCanBeCreated() {
+        $this->assertInstanceOf(Application::class, $this->type);
+    }
+
+    public function testIsApplication() {
+        $this->assertTrue($this->type->isApplication());
+    }
+
+    public function testIsNotLibrary() {
+        $this->assertFalse($this->type->isLibrary());
+    }
+
+    public function testIsNotExtension() {
+        $this->assertFalse($this->type->isExtension());
+    }
+}
diff --git a/vendor/phar-io/manifest/tests/values/AuthorCollectionTest.php b/vendor/phar-io/manifest/tests/values/AuthorCollectionTest.php
new file mode 100644
index 0000000000..0fa1b9503f
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/values/AuthorCollectionTest.php
@@ -0,0 +1,62 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @covers \PharIo\Manifest\AuthorCollection
+ * @covers \PharIo\Manifest\AuthorCollectionIterator
+ *
+ * @uses \PharIo\Manifest\Author
+ * @uses \PharIo\Manifest\Email
+ */
+class AuthorCollectionTest extends TestCase {
+    /**
+     * @var AuthorCollection
+     */
+    private $collection;
+
+    /**
+     * @var Author
+     */
+    private $item;
+
+    protected function setUp() {
+        $this->collection = new AuthorCollection;
+        $this->item       = new Author('Joe Developer', new Email('user@example.com'));
+    }
+
+    public function testCanBeCreated() {
+        $this->assertInstanceOf(AuthorCollection::class, $this->collection);
+    }
+
+    public function testCanBeCounted() {
+        $this->collection->add($this->item);
+
+        $this->assertCount(1, $this->collection);
+    }
+
+    public function testCanBeIterated() {
+        $this->collection->add(
+            new Author('Dummy First', new Email('dummy@example.com'))
+        );
+        $this->collection->add($this->item);
+        $this->assertContains($this->item, $this->collection);
+    }
+
+    public function testKeyPositionCanBeRetreived() {
+        $this->collection->add($this->item);
+        foreach($this->collection as $key => $item) {
+            $this->assertEquals(0, $key);
+        }
+    }
+}
diff --git a/vendor/phar-io/manifest/tests/values/AuthorTest.php b/vendor/phar-io/manifest/tests/values/AuthorTest.php
new file mode 100644
index 0000000000..b7317fab23
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/values/AuthorTest.php
@@ -0,0 +1,45 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @covers PharIo\Manifest\Author
+ *
+ * @uses PharIo\Manifest\Email
+ */
+class AuthorTest extends TestCase {
+    /**
+     * @var Author
+     */
+    private $author;
+
+    protected function setUp() {
+        $this->author = new Author('Joe Developer', new Email('user@example.com'));
+    }
+
+    public function testCanBeCreated() {
+        $this->assertInstanceOf(Author::class, $this->author);
+    }
+
+    public function testNameCanBeRetrieved() {
+        $this->assertEquals('Joe Developer', $this->author->getName());
+    }
+
+    public function testEmailCanBeRetrieved() {
+        $this->assertEquals('user@example.com', $this->author->getEmail());
+    }
+
+    public function testCanBeUsedAsString() {
+        $this->assertEquals('Joe Developer ', $this->author);
+    }
+}
diff --git a/vendor/phar-io/manifest/tests/values/BundledComponentCollectionTest.php b/vendor/phar-io/manifest/tests/values/BundledComponentCollectionTest.php
new file mode 100644
index 0000000000..66cd0c4cb3
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/values/BundledComponentCollectionTest.php
@@ -0,0 +1,63 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+use PharIo\Version\Version;
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @covers \PharIo\Manifest\BundledComponentCollection
+ * @covers \PharIo\Manifest\BundledComponentCollectionIterator
+ *
+ * @uses \PharIo\Manifest\BundledComponent
+ * @uses \PharIo\Version\Version
+ */
+class BundledComponentCollectionTest extends TestCase {
+    /**
+     * @var BundledComponentCollection
+     */
+    private $collection;
+
+    /**
+     * @var BundledComponent
+     */
+    private $item;
+
+    protected function setUp() {
+        $this->collection = new BundledComponentCollection;
+        $this->item       = new BundledComponent('phpunit/php-code-coverage', new Version('4.0.2'));
+    }
+
+    public function testCanBeCreated() {
+        $this->assertInstanceOf(BundledComponentCollection::class, $this->collection);
+    }
+
+    public function testCanBeCounted() {
+        $this->collection->add($this->item);
+
+        $this->assertCount(1, $this->collection);
+    }
+
+    public function testCanBeIterated() {
+        $this->collection->add($this->createMock(BundledComponent::class));
+        $this->collection->add($this->item);
+
+        $this->assertContains($this->item, $this->collection);
+    }
+
+    public function testKeyPositionCanBeRetreived() {
+        $this->collection->add($this->item);
+        foreach($this->collection as $key => $item) {
+            $this->assertEquals(0, $key);
+        }
+    }
+
+}
diff --git a/vendor/phar-io/manifest/tests/values/BundledComponentTest.php b/vendor/phar-io/manifest/tests/values/BundledComponentTest.php
new file mode 100644
index 0000000000..01b8e13e7d
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/values/BundledComponentTest.php
@@ -0,0 +1,42 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+use PharIo\Version\Version;
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @covers PharIo\Manifest\BundledComponent
+ *
+ * @uses \PharIo\Version\Version
+ */
+class BundledComponentTest extends TestCase {
+    /**
+     * @var BundledComponent
+     */
+    private $bundledComponent;
+
+    protected function setUp() {
+        $this->bundledComponent = new BundledComponent('phpunit/php-code-coverage', new Version('4.0.2'));
+    }
+
+    public function testCanBeCreated() {
+        $this->assertInstanceOf(BundledComponent::class, $this->bundledComponent);
+    }
+
+    public function testNameCanBeRetrieved() {
+        $this->assertEquals('phpunit/php-code-coverage', $this->bundledComponent->getName());
+    }
+
+    public function testVersionCanBeRetrieved() {
+        $this->assertEquals('4.0.2', $this->bundledComponent->getVersion()->getVersionString());
+    }
+}
diff --git a/vendor/phar-io/manifest/tests/values/CopyrightInformationTest.php b/vendor/phar-io/manifest/tests/values/CopyrightInformationTest.php
new file mode 100644
index 0000000000..de738f4867
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/values/CopyrightInformationTest.php
@@ -0,0 +1,62 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @covers PharIo\Manifest\CopyrightInformation
+ *
+ * @uses PharIo\Manifest\AuthorCollection
+ * @uses PharIo\Manifest\AuthorCollectionIterator
+ * @uses PharIo\Manifest\Author
+ * @uses PharIo\Manifest\Email
+ * @uses PharIo\Manifest\License
+ * @uses PharIo\Manifest\Url
+ */
+class CopyrightInformationTest extends TestCase {
+    /**
+     * @var CopyrightInformation
+     */
+    private $copyrightInformation;
+
+    /**
+     * @var Author
+     */
+    private $author;
+
+    /**
+     * @var License
+     */
+    private $license;
+
+    protected function setUp() {
+        $this->author  = new Author('Joe Developer', new Email('user@example.com'));
+        $this->license = new License('BSD-3-Clause', new Url('https://github.com/sebastianbergmann/phpunit/blob/master/LICENSE'));
+
+        $authors = new AuthorCollection;
+        $authors->add($this->author);
+
+        $this->copyrightInformation = new CopyrightInformation($authors, $this->license);
+    }
+
+    public function testCanBeCreated() {
+        $this->assertInstanceOf(CopyrightInformation::class, $this->copyrightInformation);
+    }
+
+    public function testAuthorsCanBeRetrieved() {
+        $this->assertContains($this->author, $this->copyrightInformation->getAuthors());
+    }
+
+    public function testLicenseCanBeRetrieved() {
+        $this->assertEquals($this->license, $this->copyrightInformation->getLicense());
+    }
+}
diff --git a/vendor/phar-io/manifest/tests/values/EmailTest.php b/vendor/phar-io/manifest/tests/values/EmailTest.php
new file mode 100644
index 0000000000..ee38531f1b
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/values/EmailTest.php
@@ -0,0 +1,35 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @covers PharIo\Manifest\Email
+ */
+class EmailTest extends TestCase {
+    public function testCanBeCreatedForValidEmail() {
+        $this->assertInstanceOf(Email::class, new Email('user@example.com'));
+    }
+
+    public function testCanBeUsedAsString() {
+        $this->assertEquals('user@example.com', new Email('user@example.com'));
+    }
+
+    /**
+     * @covers PharIo\Manifest\InvalidEmailException
+     */
+    public function testCannotBeCreatedForInvalidEmail() {
+        $this->expectException(InvalidEmailException::class);
+
+        new Email('invalid');
+    }
+}
diff --git a/vendor/phar-io/manifest/tests/values/ExtensionTest.php b/vendor/phar-io/manifest/tests/values/ExtensionTest.php
new file mode 100644
index 0000000000..1c9d676f0d
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/values/ExtensionTest.php
@@ -0,0 +1,109 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+use PharIo\Version\AnyVersionConstraint;
+use PharIo\Version\Version;
+use PharIo\Version\VersionConstraint;
+use PharIo\Version\VersionConstraintParser;
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @covers \PharIo\Manifest\Extension
+ * @covers \PharIo\Manifest\Type
+ *
+ * @uses \PharIo\Version\VersionConstraint
+ * @uses \PharIo\Manifest\ApplicationName
+ */
+class ExtensionTest extends TestCase {
+    /**
+     * @var Extension
+     */
+    private $type;
+
+    /**
+     * @var ApplicationName|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $name;
+
+    protected function setUp() {
+        $this->name = $this->createMock(ApplicationName::class);
+        $this->type = Type::extension($this->name, new AnyVersionConstraint);
+    }
+
+    public function testCanBeCreated() {
+        $this->assertInstanceOf(Extension::class, $this->type);
+    }
+
+    public function testIsNotApplication() {
+        $this->assertFalse($this->type->isApplication());
+    }
+
+    public function testIsNotLibrary() {
+        $this->assertFalse($this->type->isLibrary());
+    }
+
+    public function testIsExtension() {
+        $this->assertTrue($this->type->isExtension());
+    }
+
+    public function testApplicationCanBeRetrieved()
+    {
+        $this->assertInstanceOf(ApplicationName::class, $this->type->getApplicationName());
+    }
+
+    public function testVersionConstraintCanBeRetrieved() {
+        $this->assertInstanceOf(
+            VersionConstraint::class,
+            $this->type->getVersionConstraint()
+        );
+    }
+
+    public function testApplicationCanBeQueried()
+    {
+        $this->name->method('isEqual')->willReturn(true);
+        $this->assertTrue(
+            $this->type->isExtensionFor($this->createMock(ApplicationName::class))
+        );
+    }
+
+    public function testCompatibleWithReturnsTrueForMatchingVersionConstraintAndApplicaiton() {
+        $app = new ApplicationName('foo/bar');
+        $extension = Type::extension($app, (new VersionConstraintParser)->parse('^1.0'));
+        $version = new Version('1.0.0');
+
+        $this->assertTrue(
+            $extension->isCompatibleWith($app, $version)
+        );
+    }
+
+    public function testCompatibleWithReturnsFalseForNotMatchingVersionConstraint() {
+        $app = new ApplicationName('foo/bar');
+        $extension = Type::extension($app, (new VersionConstraintParser)->parse('^1.0'));
+        $version = new Version('2.0.0');
+
+        $this->assertFalse(
+            $extension->isCompatibleWith($app, $version)
+        );
+    }
+
+    public function testCompatibleWithReturnsFalseForNotMatchingApplication() {
+        $app1 = new ApplicationName('foo/bar');
+        $app2 = new ApplicationName('foo/foo');
+        $extension = Type::extension($app1, (new VersionConstraintParser)->parse('^1.0'));
+        $version = new Version('1.0.0');
+
+        $this->assertFalse(
+            $extension->isCompatibleWith($app2, $version)
+        );
+    }
+
+}
diff --git a/vendor/phar-io/manifest/tests/values/LibraryTest.php b/vendor/phar-io/manifest/tests/values/LibraryTest.php
new file mode 100644
index 0000000000..f8d1c6495c
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/values/LibraryTest.php
@@ -0,0 +1,44 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @covers PharIo\Manifest\Library
+ * @covers PharIo\Manifest\Type
+ */
+class LibraryTest extends TestCase {
+    /**
+     * @var Library
+     */
+    private $type;
+
+    protected function setUp() {
+        $this->type = Type::library();
+    }
+
+    public function testCanBeCreated() {
+        $this->assertInstanceOf(Library::class, $this->type);
+    }
+
+    public function testIsNotApplication() {
+        $this->assertFalse($this->type->isApplication());
+    }
+
+    public function testIsLibrary() {
+        $this->assertTrue($this->type->isLibrary());
+    }
+
+    public function testIsNotExtension() {
+        $this->assertFalse($this->type->isExtension());
+    }
+}
diff --git a/vendor/phar-io/manifest/tests/values/LicenseTest.php b/vendor/phar-io/manifest/tests/values/LicenseTest.php
new file mode 100644
index 0000000000..c9c5c3c787
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/values/LicenseTest.php
@@ -0,0 +1,41 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @covers PharIo\Manifest\License
+ *
+ * @uses PharIo\Manifest\Url
+ */
+class LicenseTest extends TestCase {
+    /**
+     * @var License
+     */
+    private $license;
+
+    protected function setUp() {
+        $this->license = new License('BSD-3-Clause', new Url('https://github.com/sebastianbergmann/phpunit/blob/master/LICENSE'));
+    }
+
+    public function testCanBeCreated() {
+        $this->assertInstanceOf(License::class, $this->license);
+    }
+
+    public function testNameCanBeRetrieved() {
+        $this->assertEquals('BSD-3-Clause', $this->license->getName());
+    }
+
+    public function testUrlCanBeRetrieved() {
+        $this->assertEquals('https://github.com/sebastianbergmann/phpunit/blob/master/LICENSE', $this->license->getUrl());
+    }
+}
diff --git a/vendor/phar-io/manifest/tests/values/ManifestTest.php b/vendor/phar-io/manifest/tests/values/ManifestTest.php
new file mode 100644
index 0000000000..cff0a682c5
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/values/ManifestTest.php
@@ -0,0 +1,187 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+use PharIo\Version\Version;
+use PharIo\Version\AnyVersionConstraint;
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @covers \PharIo\Manifest\Manifest
+ *
+ * @uses \PharIo\Manifest\ApplicationName
+ * @uses \PharIo\Manifest\Author
+ * @uses \PharIo\Manifest\AuthorCollection
+ * @uses \PharIo\Manifest\BundledComponent
+ * @uses \PharIo\Manifest\BundledComponentCollection
+ * @uses \PharIo\Manifest\CopyrightInformation
+ * @uses \PharIo\Manifest\Email
+ * @uses \PharIo\Manifest\License
+ * @uses \PharIo\Manifest\RequirementCollection
+ * @uses \PharIo\Manifest\PhpVersionRequirement
+ * @uses \PharIo\Manifest\Type
+ * @uses \PharIo\Manifest\Application
+ * @uses \PharIo\Manifest\Url
+ * @uses \PharIo\Version\Version
+ * @uses \PharIo\Version\VersionConstraint
+ */
+class ManifestTest extends TestCase {
+    /**
+     * @var ApplicationName
+     */
+    private $name;
+
+    /**
+     * @var Version
+     */
+    private $version;
+
+    /**
+     * @var Type
+     */
+    private $type;
+
+    /**
+     * @var CopyrightInformation
+     */
+    private $copyrightInformation;
+
+    /**
+     * @var RequirementCollection
+     */
+    private $requirements;
+
+    /**
+     * @var BundledComponentCollection
+     */
+    private $bundledComponents;
+
+    /**
+     * @var Manifest
+     */
+    private $manifest;
+
+    protected function setUp() {
+        $this->version = new Version('5.6.5');
+
+        $this->type = Type::application();
+
+        $author  = new Author('Joe Developer', new Email('user@example.com'));
+        $license = new License('BSD-3-Clause', new Url('https://github.com/sebastianbergmann/phpunit/blob/master/LICENSE'));
+
+        $authors = new AuthorCollection;
+        $authors->add($author);
+
+        $this->copyrightInformation = new CopyrightInformation($authors, $license);
+
+        $this->requirements = new RequirementCollection;
+        $this->requirements->add(new PhpVersionRequirement(new AnyVersionConstraint));
+
+        $this->bundledComponents = new BundledComponentCollection;
+        $this->bundledComponents->add(new BundledComponent('phpunit/php-code-coverage', new Version('4.0.2')));
+
+        $this->name = new ApplicationName('phpunit/phpunit');
+
+        $this->manifest = new Manifest(
+            $this->name,
+            $this->version,
+            $this->type,
+            $this->copyrightInformation,
+            $this->requirements,
+            $this->bundledComponents
+        );
+    }
+
+    public function testCanBeCreated() {
+        $this->assertInstanceOf(Manifest::class, $this->manifest);
+    }
+
+    public function testNameCanBeRetrieved() {
+        $this->assertEquals($this->name, $this->manifest->getName());
+    }
+
+    public function testVersionCanBeRetrieved() {
+        $this->assertEquals($this->version, $this->manifest->getVersion());
+    }
+
+    public function testTypeCanBeRetrieved() {
+        $this->assertEquals($this->type, $this->manifest->getType());
+    }
+
+    public function testTypeCanBeQueried() {
+        $this->assertTrue($this->manifest->isApplication());
+        $this->assertFalse($this->manifest->isLibrary());
+        $this->assertFalse($this->manifest->isExtension());
+    }
+
+    public function testCopyrightInformationCanBeRetrieved() {
+        $this->assertEquals($this->copyrightInformation, $this->manifest->getCopyrightInformation());
+    }
+
+    public function testRequirementsCanBeRetrieved() {
+        $this->assertEquals($this->requirements, $this->manifest->getRequirements());
+    }
+
+    public function testBundledComponentsCanBeRetrieved() {
+        $this->assertEquals($this->bundledComponents, $this->manifest->getBundledComponents());
+    }
+
+    /**
+     * @uses \PharIo\Manifest\Extension
+     */
+    public function testExtendedApplicationCanBeQueriedForExtension()
+    {
+        $appName = new ApplicationName('foo/bar');
+        $manifest = new Manifest(
+            new ApplicationName('foo/foo'),
+            new Version('1.0.0'),
+            Type::extension($appName, new AnyVersionConstraint),
+            $this->copyrightInformation,
+            new RequirementCollection,
+            new BundledComponentCollection
+        );
+
+        $this->assertTrue($manifest->isExtensionFor($appName));
+    }
+
+    public function testNonExtensionReturnsFalseWhenQueriesForExtension() {
+        $appName = new ApplicationName('foo/bar');
+        $manifest = new Manifest(
+            new ApplicationName('foo/foo'),
+            new Version('1.0.0'),
+            Type::library(),
+            $this->copyrightInformation,
+            new RequirementCollection,
+            new BundledComponentCollection
+        );
+
+        $this->assertFalse($manifest->isExtensionFor($appName));
+    }
+
+    /**
+     * @uses \PharIo\Manifest\Extension
+     */
+    public function testExtendedApplicationCanBeQueriedForExtensionWithVersion()
+    {
+        $appName = new ApplicationName('foo/bar');
+        $manifest = new Manifest(
+            new ApplicationName('foo/foo'),
+            new Version('1.0.0'),
+            Type::extension($appName, new AnyVersionConstraint),
+            $this->copyrightInformation,
+            new RequirementCollection,
+            new BundledComponentCollection
+        );
+
+        $this->assertTrue($manifest->isExtensionFor($appName, new Version('1.2.3')));
+    }
+
+}
diff --git a/vendor/phar-io/manifest/tests/values/PhpExtensionRequirementTest.php b/vendor/phar-io/manifest/tests/values/PhpExtensionRequirementTest.php
new file mode 100644
index 0000000000..ae1c058fcb
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/values/PhpExtensionRequirementTest.php
@@ -0,0 +1,26 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @covers PharIo\Manifest\PhpExtensionRequirement
+ */
+class PhpExtensionRequirementTest extends TestCase {
+    public function testCanBeCreated() {
+        $this->assertInstanceOf(PhpExtensionRequirement::class, new PhpExtensionRequirement('dom'));
+    }
+
+    public function testCanBeUsedAsString() {
+        $this->assertEquals('dom', new PhpExtensionRequirement('dom'));
+    }
+}
diff --git a/vendor/phar-io/manifest/tests/values/PhpVersionRequirementTest.php b/vendor/phar-io/manifest/tests/values/PhpVersionRequirementTest.php
new file mode 100644
index 0000000000..67ac41ada2
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/values/PhpVersionRequirementTest.php
@@ -0,0 +1,38 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+use PharIo\Version\ExactVersionConstraint;
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @covers PharIo\Manifest\PhpVersionRequirement
+ *
+ * @uses \PharIo\Version\VersionConstraint
+ */
+class PhpVersionRequirementTest extends TestCase {
+    /**
+     * @var PhpVersionRequirement
+     */
+    private $requirement;
+
+    protected function setUp() {
+        $this->requirement = new PhpVersionRequirement(new ExactVersionConstraint('7.1.0'));
+    }
+
+    public function testCanBeCreated() {
+        $this->assertInstanceOf(PhpVersionRequirement::class, $this->requirement);
+    }
+
+    public function testVersionConstraintCanBeRetrieved() {
+        $this->assertEquals('7.1.0', $this->requirement->getVersionConstraint()->asString());
+    }
+}
diff --git a/vendor/phar-io/manifest/tests/values/RequirementCollectionTest.php b/vendor/phar-io/manifest/tests/values/RequirementCollectionTest.php
new file mode 100644
index 0000000000..2afeb1a3cd
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/values/RequirementCollectionTest.php
@@ -0,0 +1,63 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+use PharIo\Version\ExactVersionConstraint;
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @covers \PharIo\Manifest\RequirementCollection
+ * @covers \PharIo\Manifest\RequirementCollectionIterator
+ *
+ * @uses \PharIo\Manifest\PhpVersionRequirement
+ * @uses \PharIo\Version\VersionConstraint
+ */
+class RequirementCollectionTest extends TestCase {
+    /**
+     * @var RequirementCollection
+     */
+    private $collection;
+
+    /**
+     * @var Requirement
+     */
+    private $item;
+
+    protected function setUp() {
+        $this->collection = new RequirementCollection;
+        $this->item       = new PhpVersionRequirement(new ExactVersionConstraint('7.1.0'));
+    }
+
+    public function testCanBeCreated() {
+        $this->assertInstanceOf(RequirementCollection::class, $this->collection);
+    }
+
+    public function testCanBeCounted() {
+        $this->collection->add($this->item);
+
+        $this->assertCount(1, $this->collection);
+    }
+
+    public function testCanBeIterated() {
+        $this->collection->add(new PhpVersionRequirement(new ExactVersionConstraint('5.6.0')));
+        $this->collection->add($this->item);
+
+        $this->assertContains($this->item, $this->collection);
+    }
+
+    public function testKeyPositionCanBeRetreived() {
+        $this->collection->add($this->item);
+        foreach($this->collection as $key => $item) {
+            $this->assertEquals(0, $key);
+        }
+    }
+
+}
diff --git a/vendor/phar-io/manifest/tests/values/UrlTest.php b/vendor/phar-io/manifest/tests/values/UrlTest.php
new file mode 100644
index 0000000000..20f09c1522
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/values/UrlTest.php
@@ -0,0 +1,35 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Manifest;
+
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @covers PharIo\Manifest\Url
+ */
+class UrlTest extends TestCase {
+    public function testCanBeCreatedForValidUrl() {
+        $this->assertInstanceOf(Url::class, new Url('https://phar.io/'));
+    }
+
+    public function testCanBeUsedAsString() {
+        $this->assertEquals('https://phar.io/', new Url('https://phar.io/'));
+    }
+
+    /**
+     * @covers PharIo\Manifest\InvalidUrlException
+     */
+    public function testCannotBeCreatedForInvalidUrl() {
+        $this->expectException(InvalidUrlException::class);
+
+        new Url('invalid');
+    }
+}
diff --git a/vendor/phar-io/manifest/tests/xml/AuthorElementCollectionTest.php b/vendor/phar-io/manifest/tests/xml/AuthorElementCollectionTest.php
new file mode 100644
index 0000000000..588558ef11
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/xml/AuthorElementCollectionTest.php
@@ -0,0 +1,18 @@
+loadXML('');
+        $collection = new AuthorElementCollection($dom->childNodes);
+
+        foreach($collection as $authorElement) {
+            $this->assertInstanceOf(AuthorElement::class, $authorElement);
+        }
+    }
+
+}
diff --git a/vendor/phar-io/manifest/tests/xml/AuthorElementTest.php b/vendor/phar-io/manifest/tests/xml/AuthorElementTest.php
new file mode 100644
index 0000000000..6fce1d4a86
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/xml/AuthorElementTest.php
@@ -0,0 +1,25 @@
+loadXML('');
+        $this->author = new AuthorElement($dom->documentElement);
+    }
+
+    public function testNameCanBeRetrieved() {
+        $this->assertEquals('Reiner Zufall', $this->author->getName());
+    }
+
+    public function testEmailCanBeRetrieved() {
+        $this->assertEquals('reiner@zufall.de', $this->author->getEmail());
+    }
+
+}
diff --git a/vendor/phar-io/manifest/tests/xml/BundlesElementTest.php b/vendor/phar-io/manifest/tests/xml/BundlesElementTest.php
new file mode 100644
index 0000000000..787279588c
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/xml/BundlesElementTest.php
@@ -0,0 +1,41 @@
+dom = new DOMDocument();
+        $this->dom->loadXML('');
+        $this->bundles = new BundlesElement($this->dom->documentElement);
+    }
+
+    public function testThrowsExceptionWhenGetComponentElementsIsCalledButNodesAreMissing() {
+        $this->expectException(ManifestElementException::class);
+        $this->bundles->getComponentElements();
+    }
+
+    public function testGetComponentElementsReturnsComponentElementCollection() {
+        $this->addComponent();
+        $this->assertInstanceOf(
+            ComponentElementCollection::class, $this->bundles->getComponentElements()
+        );
+    }
+
+    private function addComponent() {
+        $this->dom->documentElement->appendChild(
+            $this->dom->createElementNS('https://phar.io/xml/manifest/1.0', 'component')
+        );
+    }
+}
diff --git a/vendor/phar-io/manifest/tests/xml/ComponentElementCollectionTest.php b/vendor/phar-io/manifest/tests/xml/ComponentElementCollectionTest.php
new file mode 100644
index 0000000000..9fe2378132
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/xml/ComponentElementCollectionTest.php
@@ -0,0 +1,18 @@
+loadXML('');
+        $collection = new ComponentElementCollection($dom->childNodes);
+
+        foreach($collection as $componentElement) {
+            $this->assertInstanceOf(ComponentElement::class, $componentElement);
+        }
+    }
+
+}
diff --git a/vendor/phar-io/manifest/tests/xml/ComponentElementTest.php b/vendor/phar-io/manifest/tests/xml/ComponentElementTest.php
new file mode 100644
index 0000000000..1996585b78
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/xml/ComponentElementTest.php
@@ -0,0 +1,25 @@
+loadXML('');
+        $this->component = new ComponentElement($dom->documentElement);
+    }
+
+    public function testNameCanBeRetrieved() {
+        $this->assertEquals('phar-io/phive', $this->component->getName());
+    }
+
+    public function testEmailCanBeRetrieved() {
+        $this->assertEquals('0.6.0', $this->component->getVersion());
+    }
+
+}
diff --git a/vendor/phar-io/manifest/tests/xml/ContainsElementTest.php b/vendor/phar-io/manifest/tests/xml/ContainsElementTest.php
new file mode 100644
index 0000000000..ed08600de7
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/xml/ContainsElementTest.php
@@ -0,0 +1,63 @@
+loadXML('');
+        $this->domElement = $dom->documentElement;
+        $this->contains   = new ContainsElement($this->domElement);
+    }
+
+    public function testVersionCanBeRetrieved() {
+        $this->assertEquals('5.6.5', $this->contains->getVersion());
+    }
+
+    public function testThrowsExceptionWhenVersionAttributeIsMissing() {
+        $this->domElement->removeAttribute('version');
+        $this->expectException(ManifestElementException::class);
+        $this->contains->getVersion();
+    }
+
+    public function testNameCanBeRetrieved() {
+        $this->assertEquals('phpunit/phpunit', $this->contains->getName());
+    }
+
+    public function testThrowsExceptionWhenNameAttributeIsMissing() {
+        $this->domElement->removeAttribute('name');
+        $this->expectException(ManifestElementException::class);
+        $this->contains->getName();
+    }
+
+    public function testTypeCanBeRetrieved() {
+        $this->assertEquals('application', $this->contains->getType());
+    }
+
+    public function testThrowsExceptionWhenTypeAttributeIsMissing() {
+        $this->domElement->removeAttribute('type');
+        $this->expectException(ManifestElementException::class);
+        $this->contains->getType();
+    }
+
+    public function testGetExtensionElementReturnsExtensionElement() {
+        $this->domElement->appendChild(
+            $this->domElement->ownerDocument->createElementNS('https://phar.io/xml/manifest/1.0', 'extension')
+        );
+        $this->assertInstanceOf(ExtensionElement::class, $this->contains->getExtensionElement());
+    }
+
+}
diff --git a/vendor/phar-io/manifest/tests/xml/CopyrightElementTest.php b/vendor/phar-io/manifest/tests/xml/CopyrightElementTest.php
new file mode 100644
index 0000000000..c74a2ce3d6
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/xml/CopyrightElementTest.php
@@ -0,0 +1,52 @@
+dom = new DOMDocument();
+        $this->dom->loadXML('');
+        $this->copyright = new CopyrightElement($this->dom->documentElement);
+    }
+
+    public function testThrowsExceptionWhenGetAuthroElementsIsCalledButNodesAreMissing() {
+        $this->expectException(ManifestElementException::class);
+        $this->copyright->getAuthorElements();
+    }
+
+    public function testThrowsExceptionWhenGetLicenseElementIsCalledButNodeIsMissing() {
+        $this->expectException(ManifestElementException::class);
+        $this->copyright->getLicenseElement();
+    }
+
+    public function testGetAuthorElementsReturnsAuthorElementCollection() {
+        $this->dom->documentElement->appendChild(
+            $this->dom->createElementNS('https://phar.io/xml/manifest/1.0', 'author')
+        );
+        $this->assertInstanceOf(
+            AuthorElementCollection::class, $this->copyright->getAuthorElements()
+        );
+    }
+
+    public function testGetLicenseElementReturnsLicenseElement() {
+        $this->dom->documentElement->appendChild(
+            $this->dom->createElementNS('https://phar.io/xml/manifest/1.0', 'license')
+        );
+        $this->assertInstanceOf(
+            LicenseElement::class, $this->copyright->getLicenseElement()
+        );
+    }
+
+}
diff --git a/vendor/phar-io/manifest/tests/xml/ExtElementCollectionTest.php b/vendor/phar-io/manifest/tests/xml/ExtElementCollectionTest.php
new file mode 100644
index 0000000000..7a456d2b70
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/xml/ExtElementCollectionTest.php
@@ -0,0 +1,19 @@
+loadXML('');
+        $collection = new ExtElementCollection($dom->childNodes);
+
+        foreach($collection as $position => $extElement) {
+            $this->assertInstanceOf(ExtElement::class, $extElement);
+            $this->assertEquals(0, $position);
+        }
+    }
+
+}
diff --git a/vendor/phar-io/manifest/tests/xml/ExtElementTest.php b/vendor/phar-io/manifest/tests/xml/ExtElementTest.php
new file mode 100644
index 0000000000..db6ecbc334
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/xml/ExtElementTest.php
@@ -0,0 +1,21 @@
+loadXML('');
+        $this->ext = new ExtElement($dom->documentElement);
+    }
+
+    public function testNameCanBeRetrieved() {
+        $this->assertEquals('dom', $this->ext->getName());
+    }
+
+}
diff --git a/vendor/phar-io/manifest/tests/xml/ExtensionElementTest.php b/vendor/phar-io/manifest/tests/xml/ExtensionElementTest.php
new file mode 100644
index 0000000000..58965d8233
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/xml/ExtensionElementTest.php
@@ -0,0 +1,25 @@
+loadXML('');
+        $this->extension = new ExtensionElement($dom->documentElement);
+    }
+
+    public function testNForCanBeRetrieved() {
+        $this->assertEquals('phar-io/phive', $this->extension->getFor());
+    }
+
+    public function testCompatibleVersionConstraintCanBeRetrieved() {
+        $this->assertEquals('~0.6', $this->extension->getCompatible());
+    }
+
+}
diff --git a/vendor/phar-io/manifest/tests/xml/LicenseElementTest.php b/vendor/phar-io/manifest/tests/xml/LicenseElementTest.php
new file mode 100644
index 0000000000..5b1ffcbede
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/xml/LicenseElementTest.php
@@ -0,0 +1,25 @@
+loadXML('');
+        $this->license = new LicenseElement($dom->documentElement);
+    }
+
+    public function testTypeCanBeRetrieved() {
+        $this->assertEquals('BSD-3', $this->license->getType());
+    }
+
+    public function testUrlCanBeRetrieved() {
+        $this->assertEquals('https://some.tld/LICENSE', $this->license->getUrl());
+    }
+
+}
diff --git a/vendor/phar-io/manifest/tests/xml/ManifestDocumentTest.php b/vendor/phar-io/manifest/tests/xml/ManifestDocumentTest.php
new file mode 100644
index 0000000000..3dd59bf5c1
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/xml/ManifestDocumentTest.php
@@ -0,0 +1,110 @@
+expectException(ManifestDocumentException::class);
+        ManifestDocument::fromFile('/does/not/exist');
+    }
+
+    public function testCanBeCreatedFromFile() {
+        $this->assertInstanceOf(
+            ManifestDocument::class,
+            ManifestDocument::fromFile(__DIR__ . '/../_fixture/phpunit-5.6.5.xml')
+        );
+    }
+
+    public function testCaneBeConstructedFromString() {
+        $content = file_get_contents(__DIR__ . '/../_fixture/phpunit-5.6.5.xml');
+        $this->assertInstanceOf(
+            ManifestDocument::class,
+            ManifestDocument::fromString($content)
+        );
+    }
+
+    public function testThrowsExceptionOnInvalidXML() {
+        $this->expectException(ManifestDocumentLoadingException::class);
+        ManifestDocument::fromString('');
+    }
+
+    public function testLoadingDocumentWithWrongRootNameThrowsException() {
+        $this->expectException(ManifestDocumentException::class);
+        ManifestDocument::fromString('');
+    }
+
+    public function testLoadingDocumentWithWrongNamespaceThrowsException() {
+        $this->expectException(ManifestDocumentException::class);
+        ManifestDocument::fromString('');
+    }
+
+    public function testContainsElementCanBeRetrieved() {
+        $this->assertInstanceOf(
+            ContainsElement::class,
+            $this->loadFixture()->getContainsElement()
+        );
+    }
+
+    public function testRequiresElementCanBeRetrieved() {
+        $this->assertInstanceOf(
+            RequiresElement::class,
+            $this->loadFixture()->getRequiresElement()
+        );
+    }
+
+    public function testCopyrightElementCanBeRetrieved() {
+        $this->assertInstanceOf(
+            CopyrightElement::class,
+            $this->loadFixture()->getCopyrightElement()
+        );
+    }
+
+    public function testBundlesElementCanBeRetrieved() {
+        $this->assertInstanceOf(
+            BundlesElement::class,
+            $this->loadFixture()->getBundlesElement()
+        );
+    }
+
+    public function testThrowsExceptionWhenContainsIsMissing() {
+        $this->expectException(ManifestDocumentException::class);
+        $this->loadEmptyFixture()->getContainsElement();
+    }
+
+    public function testThrowsExceptionWhenCopyirhgtIsMissing() {
+        $this->expectException(ManifestDocumentException::class);
+        $this->loadEmptyFixture()->getCopyrightElement();
+    }
+
+    public function testThrowsExceptionWhenRequiresIsMissing() {
+        $this->expectException(ManifestDocumentException::class);
+        $this->loadEmptyFixture()->getRequiresElement();
+    }
+
+    public function testThrowsExceptionWhenBundlesIsMissing() {
+        $this->expectException(ManifestDocumentException::class);
+        $this->loadEmptyFixture()->getBundlesElement();
+    }
+
+    public function testHasBundlesReturnsTrueWhenBundlesNodeIsPresent() {
+        $this->assertTrue(
+            $this->loadFixture()->hasBundlesElement()
+        );
+    }
+
+    public function testHasBundlesReturnsFalseWhenBundlesNoNodeIsPresent() {
+        $this->assertFalse(
+            $this->loadEmptyFixture()->hasBundlesElement()
+        );
+    }
+
+    private function loadFixture() {
+        return ManifestDocument::fromFile(__DIR__ . '/../_fixture/phpunit-5.6.5.xml');
+    }
+
+    private function loadEmptyFixture() {
+        return ManifestDocument::fromString(
+            ''
+        );
+    }
+}
diff --git a/vendor/phar-io/manifest/tests/xml/PhpElementTest.php b/vendor/phar-io/manifest/tests/xml/PhpElementTest.php
new file mode 100644
index 0000000000..62dd359bfe
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/xml/PhpElementTest.php
@@ -0,0 +1,48 @@
+dom = new DOMDocument();
+        $this->dom->loadXML('');
+        $this->php = new PhpElement($this->dom->documentElement);
+    }
+
+    public function testVersionConstraintCanBeRetrieved() {
+        $this->assertEquals('^5.6 || ^7.0', $this->php->getVersion());
+    }
+
+    public function testHasExtElementsReturnsFalseWhenNoExtensionsAreRequired() {
+        $this->assertFalse($this->php->hasExtElements());
+    }
+
+    public function testHasExtElementsReturnsTrueWhenExtensionsAreRequired() {
+        $this->addExtElement();
+        $this->assertTrue($this->php->hasExtElements());
+    }
+
+    public function testGetExtElementsReturnsExtElementCollection() {
+        $this->addExtElement();
+        $this->assertInstanceOf(ExtElementCollection::class, $this->php->getExtElements());
+    }
+
+    private function addExtElement() {
+        $this->dom->documentElement->appendChild(
+            $this->dom->createElementNS('https://phar.io/xml/manifest/1.0', 'ext')
+        );
+    }
+
+}
diff --git a/vendor/phar-io/manifest/tests/xml/RequiresElementTest.php b/vendor/phar-io/manifest/tests/xml/RequiresElementTest.php
new file mode 100644
index 0000000000..35ddc826cb
--- /dev/null
+++ b/vendor/phar-io/manifest/tests/xml/RequiresElementTest.php
@@ -0,0 +1,37 @@
+dom = new DOMDocument();
+        $this->dom->loadXML('');
+        $this->requires = new RequiresElement($this->dom->documentElement);
+    }
+
+    public function testThrowsExceptionWhenGetPhpElementIsCalledButElementIsMissing() {
+        $this->expectException(ManifestElementException::class);
+        $this->requires->getPHPElement();
+    }
+
+    public function testHasExtElementsReturnsTrueWhenExtensionsAreRequired() {
+        $this->dom->documentElement->appendChild(
+            $this->dom->createElementNS('https://phar.io/xml/manifest/1.0', 'php')
+        );
+
+        $this->assertInstanceOf(PhpElement::class, $this->requires->getPHPElement());
+    }
+
+}
diff --git a/vendor/phar-io/version/.gitignore b/vendor/phar-io/version/.gitignore
new file mode 100644
index 0000000000..1c8f2e64a2
--- /dev/null
+++ b/vendor/phar-io/version/.gitignore
@@ -0,0 +1,7 @@
+/.idea
+/.php_cs.cache
+/composer.lock
+/src/autoload.php
+/tools
+/vendor
+
diff --git a/vendor/phar-io/version/.php_cs b/vendor/phar-io/version/.php_cs
new file mode 100644
index 0000000000..159d6a35a2
--- /dev/null
+++ b/vendor/phar-io/version/.php_cs
@@ -0,0 +1,67 @@
+files()
+    ->in('src')
+    ->in('tests')
+    ->name('*.php');
+
+return Symfony\CS\Config\Config::create()
+    ->setUsingCache(true)
+    ->level(\Symfony\CS\FixerInterface::NONE_LEVEL)
+    ->fixers(
+        array(
+            'align_double_arrow',
+            'align_equals',
+            'concat_with_spaces',
+            'duplicate_semicolon',
+            'elseif',
+            'empty_return',
+            'encoding',
+            'eof_ending',
+            'extra_empty_lines',
+            'function_call_space',
+            'function_declaration',
+            'indentation',
+            'join_function',
+            'line_after_namespace',
+            'linefeed',
+            'list_commas',
+            'lowercase_constants',
+            'lowercase_keywords',
+            'method_argument_space',
+            'multiple_use',
+            'namespace_no_leading_whitespace',
+            'no_blank_lines_after_class_opening',
+            'no_empty_lines_after_phpdocs',
+            'parenthesis',
+            'php_closing_tag',
+            'phpdoc_indent',
+            'phpdoc_no_access',
+            'phpdoc_no_empty_return',
+            'phpdoc_no_package',
+            'phpdoc_params',
+            'phpdoc_scalar',
+            'phpdoc_separation',
+            'phpdoc_to_comment',
+            'phpdoc_trim',
+            'phpdoc_types',
+            'phpdoc_var_without_name',
+            'remove_lines_between_uses',
+            'return',
+            'self_accessor',
+            'short_array_syntax',
+            'short_tag',
+            'single_line_after_imports',
+            'single_quote',
+            'spaces_before_semicolon',
+            'spaces_cast',
+            'ternary_spaces',
+            'trailing_spaces',
+            'trim_array_spaces',
+            'unused_use',
+            'visibility',
+            'whitespacy_lines'
+        )
+    )
+    ->finder($finder);
+
diff --git a/vendor/phar-io/version/.travis.yml b/vendor/phar-io/version/.travis.yml
new file mode 100644
index 0000000000..b4be10f9c3
--- /dev/null
+++ b/vendor/phar-io/version/.travis.yml
@@ -0,0 +1,33 @@
+os:
+- linux
+
+language: php
+
+before_install:
+  - wget https://phar.io/releases/phive.phar
+  - wget https://phar.io/releases/phive.phar.asc
+  - gpg --keyserver hkps.pool.sks-keyservers.net --recv-keys 0x9B2D5D79
+  - gpg --verify phive.phar.asc phive.phar
+  - chmod +x phive.phar
+  - sudo mv phive.phar /usr/bin/phive
+
+install:
+  - ant setup
+
+script: ./tools/phpunit
+
+php:
+  - 5.6
+  - 7.0
+  - 7.1
+  - 7.0snapshot
+  - 7.1snapshot
+  - master
+
+matrix:
+  allow_failures:
+    - php: master
+  fast_finish: true
+
+notifications:
+  email: false
diff --git a/vendor/phar-io/version/CHANGELOG.md b/vendor/phar-io/version/CHANGELOG.md
new file mode 100644
index 0000000000..ab9df36841
--- /dev/null
+++ b/vendor/phar-io/version/CHANGELOG.md
@@ -0,0 +1,44 @@
+# Changelog
+
+All notable changes to phar-io/version are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles.
+
+## [2.0.1] - 08.07.2018
+
+### Fixed
+
+- Versions without a pre-release suffix are now always considered greater 
+than versions without a pre-release suffix. Example: `3.0.0 > 3.0.0-alpha.1`  
+
+## [2.0.0] - 23.06.2018
+
+Changes to public API:
+
+- `PreReleaseSuffix::construct()`: optional parameter `$number` removed
+- `PreReleaseSuffix::isGreaterThan()`: introduced
+- `Version::hasPreReleaseSuffix()`: introduced
+
+### Added
+
+- [#11](https://github.com/phar-io/version/issues/11): Added support for pre-release version suffixes. Supported values are:
+  - `dev`
+  - `beta` (also abbreviated form `b`)
+  - `rc`
+  - `alpha` (also abbreviated form `a`)
+  - `patch` (also abbreviated form `p`)
+
+  All values can be followed by a number, e.g. `beta3`. 
+
+  When comparing versions, the pre-release suffix is taken into account. Example:
+`1.5.0 > 1.5.0-beta1 > 1.5.0-alpha3 > 1.5.0-alpha2 > 1.5.0-dev11`
+
+### Changed
+
+- reorganized the source directories
+
+### Fixed
+
+- [#10](https://github.com/phar-io/version/issues/10): Version numbers containing 
+a numeric suffix as seen in Debian packages are now supported.  
+
+[2.0.1]: https://github.com/phar-io/version/compare/2.0.0...2.0.1
+[2.0.0]: https://github.com/phar-io/version/compare/1.0.1...2.0.0
diff --git a/vendor/phar-io/version/LICENSE b/vendor/phar-io/version/LICENSE
new file mode 100644
index 0000000000..359dbc50f2
--- /dev/null
+++ b/vendor/phar-io/version/LICENSE
@@ -0,0 +1,31 @@
+phar-io/version
+
+Copyright (c) 2016-2017 Arne Blankerts , Sebastian Heuer  and contributors
+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 Arne Blankerts nor the names of 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 HOLDER 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/phar-io/version/README.md b/vendor/phar-io/version/README.md
new file mode 100644
index 0000000000..76e6e98579
--- /dev/null
+++ b/vendor/phar-io/version/README.md
@@ -0,0 +1,61 @@
+# Version
+
+Library for handling version information and constraints
+
+[![Build Status](https://travis-ci.org/phar-io/version.svg?branch=master)](https://travis-ci.org/phar-io/version)
+
+## Installation
+
+You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/):
+
+    composer require phar-io/version
+
+If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency:
+
+    composer require --dev phar-io/version
+
+## Version constraints
+
+A Version constraint describes a range of versions or a discrete version number. The format of version numbers follows the schema of [semantic versioning](http://semver.org): `..`. A constraint might contain an operator that describes the range.
+
+Beside the typical mathematical operators like `<=`, `>=`, there are two special operators:
+
+*Caret operator*: `^1.0`
+can be written as `>=1.0.0 <2.0.0` and read as »every Version within major version `1`«.
+
+*Tilde operator*: `~1.0.0`
+can be written as `>=1.0.0 <1.1.0` and read as »every version within minor version `1.1`. The behavior of tilde operator depends on whether a patch level version is provided or not. If no patch level is provided, tilde operator behaves like the caret operator: `~1.0` is identical to `^1.0`.
+
+## Usage examples
+
+Parsing version constraints and check discrete versions for compliance:
+
+```php
+
+use PharIo\Version\Version;
+use PharIo\Version\VersionConstraintParser;
+
+$parser = new VersionConstraintParser();
+$caret_constraint = $parser->parse( '^7.0' );
+
+$caret_constraint->complies( new Version( '7.0.17' ) ); // true
+$caret_constraint->complies( new Version( '7.1.0' ) ); // true
+$caret_constraint->complies( new Version( '6.4.34' ) ); // false
+
+$tilde_constraint = $parser->parse( '~1.1.0' );
+
+$tilde_constraint->complies( new Version( '1.1.4' ) ); // true
+$tilde_constraint->complies( new Version( '1.2.0' ) ); // false
+```
+
+As of version 2.0.0, pre-release labels are supported and taken into account when comparing versions:
+
+```php
+
+$leftVersion = new PharIo\Version\Version('3.0.0-alpha.1');
+$rightVersion = new PharIo\Version\Version('3.0.0-alpha.2');
+
+$leftVersion->isGreaterThan($rightVersion); // false
+$rightVersion->isGreaterThan($leftVersion); // true
+
+``` 
diff --git a/vendor/phar-io/version/build.xml b/vendor/phar-io/version/build.xml
new file mode 100644
index 0000000000..943c957fd9
--- /dev/null
+++ b/vendor/phar-io/version/build.xml
@@ -0,0 +1,41 @@
+
+
+    
+
+    
+        
+        
+        
+
+        
+    
+
+    
+        
+    
+
+    
+        
+    
+
+    
+        
+            
+            
+            
+        
+    
+
+    
+        
+            
+            
+            
+        
+    
+
+    
+        
+    
+
+
diff --git a/vendor/phar-io/version/composer.json b/vendor/phar-io/version/composer.json
new file mode 100644
index 0000000000..891e8b174d
--- /dev/null
+++ b/vendor/phar-io/version/composer.json
@@ -0,0 +1,34 @@
+{
+  "name": "phar-io/version",
+  "description": "Library for handling version information and constraints",
+  "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"
+    }
+  ],
+  "support": {
+    "issues": "https://github.com/phar-io/version/issues"
+  },
+  "require": {
+    "php": "^5.6 || ^7.0"
+  },
+  "autoload": {
+    "classmap": [
+      "src/"
+    ]
+  }
+}
+
diff --git a/vendor/phar-io/version/phive.xml b/vendor/phar-io/version/phive.xml
new file mode 100644
index 0000000000..0c3bc6f38f
--- /dev/null
+++ b/vendor/phar-io/version/phive.xml
@@ -0,0 +1,5 @@
+
+
+  
+  
+
diff --git a/vendor/phar-io/version/phpunit.xml b/vendor/phar-io/version/phpunit.xml
new file mode 100644
index 0000000000..c21ffbc090
--- /dev/null
+++ b/vendor/phar-io/version/phpunit.xml
@@ -0,0 +1,19 @@
+
+
+    
+        tests
+    
+
+    
+        
+            src
+        
+    
+
diff --git a/vendor/phar-io/version/src/PreReleaseSuffix.php b/vendor/phar-io/version/src/PreReleaseSuffix.php
new file mode 100644
index 0000000000..e936c0ee86
--- /dev/null
+++ b/vendor/phar-io/version/src/PreReleaseSuffix.php
@@ -0,0 +1,95 @@
+ 0,
+        'a' => 1,
+        'alpha' => 1,
+        'b' => 2,
+        'beta' => 2,
+        'rc' => 3,
+        'p' => 4,
+        'patch' => 4,
+    ];
+
+    /**
+     * @var string
+     */
+    private $value;
+
+    /**
+     * @var int
+     */
+    private $valueScore;
+
+    /**
+     * @var int
+     */
+    private $number = 0;
+
+    /**
+     * @param string $value
+     */
+    public function __construct($value) {
+        $this->parseValue($value);
+    }
+
+    /**
+     * @return string
+     */
+    public function getValue() {
+        return $this->value;
+    }
+
+    /**
+     * @return int|null
+     */
+    public function getNumber() {
+        return $this->number;
+    }
+
+    /**
+     * @param PreReleaseSuffix $suffix
+     *
+     * @return bool
+     */
+    public function isGreaterThan(PreReleaseSuffix $suffix) {
+        if ($this->valueScore > $suffix->valueScore) {
+            return true;
+        }
+
+        if ($this->valueScore < $suffix->valueScore) {
+            return false;
+        }
+
+        return $this->getNumber() > $suffix->getNumber();
+    }
+
+    /**
+     * @param $value
+     *
+     * @return int
+     */
+    private function mapValueToScore($value) {
+        if (array_key_exists($value, $this->valueScoreMap)) {
+            return $this->valueScoreMap[$value];
+        }
+
+        return 0;
+    }
+
+    private function parseValue($value) {
+        $regex = '/-?(dev|beta|b|rc|alpha|a|patch|p)\.?(\d*).*$/i';
+        if (preg_match($regex, $value, $matches) !== 1) {
+            throw new InvalidPreReleaseSuffixException(sprintf('Invalid label %s', $value));
+        }
+
+        $this->value = $matches[1];
+        if (isset($matches[2])) {
+            $this->number = (int)$matches[2];
+        }
+        $this->valueScore = $this->mapValueToScore($this->value);
+    }
+}
diff --git a/vendor/phar-io/version/src/Version.php b/vendor/phar-io/version/src/Version.php
new file mode 100644
index 0000000000..73e1b98ac2
--- /dev/null
+++ b/vendor/phar-io/version/src/Version.php
@@ -0,0 +1,175 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Version;
+
+class Version {
+    /**
+     * @var VersionNumber
+     */
+    private $major;
+
+    /**
+     * @var VersionNumber
+     */
+    private $minor;
+
+    /**
+     * @var VersionNumber
+     */
+    private $patch;
+
+    /**
+     * @var PreReleaseSuffix
+     */
+    private $preReleaseSuffix;
+
+    /**
+     * @var string
+     */
+    private $versionString = '';
+
+    /**
+     * @param string $versionString
+     */
+    public function __construct($versionString) {
+        $this->ensureVersionStringIsValid($versionString);
+
+        $this->versionString = $versionString;
+    }
+
+    /**
+     * @return PreReleaseSuffix
+     */
+    public function getPreReleaseSuffix() {
+        return $this->preReleaseSuffix;
+    }
+
+    /**
+     * @return string
+     */
+    public function getVersionString() {
+        return $this->versionString;
+    }
+
+    /**
+     * @return bool
+     */
+    public function hasPreReleaseSuffix() {
+        return $this->preReleaseSuffix !== null;
+    }
+
+    /**
+     * @param Version $version
+     *
+     * @return bool
+     */
+    public function isGreaterThan(Version $version) {
+        if ($version->getMajor()->getValue() > $this->getMajor()->getValue()) {
+            return false;
+        }
+
+        if ($version->getMajor()->getValue() < $this->getMajor()->getValue()) {
+            return true;
+        }
+
+        if ($version->getMinor()->getValue() > $this->getMinor()->getValue()) {
+            return false;
+        }
+
+        if ($version->getMinor()->getValue() < $this->getMinor()->getValue()) {
+            return true;
+        }
+
+        if ($version->getPatch()->getValue() > $this->getPatch()->getValue()) {
+            return false;
+        }
+
+        if ($version->getPatch()->getValue() < $this->getPatch()->getValue()) {
+            return true;
+        }
+
+        if (!$version->hasPreReleaseSuffix() && !$this->hasPreReleaseSuffix()) {
+            return false;
+        }
+
+        if ($version->hasPreReleaseSuffix() && !$this->hasPreReleaseSuffix()) {
+            return true;
+        }
+
+        if (!$version->hasPreReleaseSuffix() && $this->hasPreReleaseSuffix()) {
+            return false;
+        }
+
+        return $this->getPreReleaseSuffix()->isGreaterThan($version->getPreReleaseSuffix());
+    }
+
+    /**
+     * @return VersionNumber
+     */
+    public function getMajor() {
+        return $this->major;
+    }
+
+    /**
+     * @return VersionNumber
+     */
+    public function getMinor() {
+        return $this->minor;
+    }
+
+    /**
+     * @return VersionNumber
+     */
+    public function getPatch() {
+        return $this->patch;
+    }
+
+    /**
+     * @param array $matches
+     */
+    private function parseVersion(array $matches) {
+        $this->major = new VersionNumber($matches['Major']);
+        $this->minor = new VersionNumber($matches['Minor']);
+        $this->patch = isset($matches['Patch']) ? new VersionNumber($matches['Patch']) : new VersionNumber(null);
+
+        if (isset($matches['PreReleaseSuffix'])) {
+            $this->preReleaseSuffix = new PreReleaseSuffix($matches['PreReleaseSuffix']);
+        }
+    }
+
+    /**
+     * @param string $version
+     *
+     * @throws InvalidVersionException
+     */
+    private function ensureVersionStringIsValid($version) {
+        $regex = '/^v?
+            (?(0|(?:[1-9][0-9]*)))
+            \\.
+            (?(0|(?:[1-9][0-9]*)))
+            (\\.
+                (?(0|(?:[1-9][0-9]*)))
+            )?
+            (?:
+                -
+                (?(?:(dev|beta|b|RC|alpha|a|patch|p)\.?\d*))
+            )?       
+        $/x';
+
+        if (preg_match($regex, $version, $matches) !== 1) {
+            throw new InvalidVersionException(
+                sprintf("Version string '%s' does not follow SemVer semantics", $version)
+            );
+        }
+
+        $this->parseVersion($matches);
+    }
+}
diff --git a/vendor/phar-io/version/src/VersionConstraintParser.php b/vendor/phar-io/version/src/VersionConstraintParser.php
new file mode 100644
index 0000000000..ed46843896
--- /dev/null
+++ b/vendor/phar-io/version/src/VersionConstraintParser.php
@@ -0,0 +1,122 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Version;
+
+class VersionConstraintParser {
+    /**
+     * @param string $value
+     *
+     * @return VersionConstraint
+     *
+     * @throws UnsupportedVersionConstraintException
+     */
+    public function parse($value) {
+
+        if (strpos($value, '||') !== false) {
+            return $this->handleOrGroup($value);
+        }
+
+        if (!preg_match('/^[\^~\*]?[\d.\*]+(?:-.*)?$/', $value)) {
+            throw new UnsupportedVersionConstraintException(
+                sprintf('Version constraint %s is not supported.', $value)
+            );
+        }
+
+        switch ($value[0]) {
+            case '~':
+                return $this->handleTildeOperator($value);
+            case '^':
+                return $this->handleCaretOperator($value);
+        }
+
+        $version = new VersionConstraintValue($value);
+
+        if ($version->getMajor()->isAny()) {
+            return new AnyVersionConstraint();
+        }
+
+        if ($version->getMinor()->isAny()) {
+            return new SpecificMajorVersionConstraint(
+                $version->getVersionString(),
+                $version->getMajor()->getValue()
+            );
+        }
+
+        if ($version->getPatch()->isAny()) {
+            return new SpecificMajorAndMinorVersionConstraint(
+                $version->getVersionString(),
+                $version->getMajor()->getValue(),
+                $version->getMinor()->getValue()
+            );
+        }
+
+        return new ExactVersionConstraint($version->getVersionString());
+    }
+
+    /**
+     * @param $value
+     *
+     * @return OrVersionConstraintGroup
+     */
+    private function handleOrGroup($value) {
+        $constraints = [];
+
+        foreach (explode('||', $value) as $groupSegment) {
+            $constraints[] = $this->parse(trim($groupSegment));
+        }
+
+        return new OrVersionConstraintGroup($value, $constraints);
+    }
+
+    /**
+     * @param string $value
+     *
+     * @return AndVersionConstraintGroup
+     */
+    private function handleTildeOperator($value) {
+        $version = new Version(substr($value, 1));
+        $constraints = [
+            new GreaterThanOrEqualToVersionConstraint($value, $version)
+        ];
+
+        if ($version->getPatch()->isAny()) {
+            $constraints[] = new SpecificMajorVersionConstraint(
+                $value,
+                $version->getMajor()->getValue()
+            );
+        } else {
+            $constraints[] = new SpecificMajorAndMinorVersionConstraint(
+                $value,
+                $version->getMajor()->getValue(),
+                $version->getMinor()->getValue()
+            );
+        }
+
+        return new AndVersionConstraintGroup($value, $constraints);
+    }
+
+    /**
+     * @param string $value
+     *
+     * @return AndVersionConstraintGroup
+     */
+    private function handleCaretOperator($value) {
+        $version = new Version(substr($value, 1));
+
+        return new AndVersionConstraintGroup(
+            $value,
+            [
+                new GreaterThanOrEqualToVersionConstraint($value, $version),
+                new SpecificMajorVersionConstraint($value, $version->getMajor()->getValue())
+            ]
+        );
+    }
+}
diff --git a/vendor/phar-io/version/src/VersionConstraintValue.php b/vendor/phar-io/version/src/VersionConstraintValue.php
new file mode 100644
index 0000000000..8c975b8a84
--- /dev/null
+++ b/vendor/phar-io/version/src/VersionConstraintValue.php
@@ -0,0 +1,123 @@
+versionString = $versionString;
+
+        $this->parseVersion($versionString);
+    }
+
+    /**
+     * @return string
+     */
+    public function getLabel() {
+        return $this->label;
+    }
+
+    /**
+     * @return string
+     */
+    public function getBuildMetaData() {
+        return $this->buildMetaData;
+    }
+
+    /**
+     * @return string
+     */
+    public function getVersionString() {
+        return $this->versionString;
+    }
+
+    /**
+     * @return VersionNumber
+     */
+    public function getMajor() {
+        return $this->major;
+    }
+
+    /**
+     * @return VersionNumber
+     */
+    public function getMinor() {
+        return $this->minor;
+    }
+
+    /**
+     * @return VersionNumber
+     */
+    public function getPatch() {
+        return $this->patch;
+    }
+
+    /**
+     * @param $versionString
+     */
+    private function parseVersion($versionString) {
+        $this->extractBuildMetaData($versionString);
+        $this->extractLabel($versionString);
+
+        $versionSegments = explode('.', $versionString);
+        $this->major = new VersionNumber($versionSegments[0]);
+
+        $minorValue = isset($versionSegments[1]) ? $versionSegments[1] : null;
+        $patchValue = isset($versionSegments[2]) ? $versionSegments[2] : null;
+
+        $this->minor = new VersionNumber($minorValue);
+        $this->patch = new VersionNumber($patchValue);
+    }
+
+    /**
+     * @param string $versionString
+     */
+    private function extractBuildMetaData(&$versionString) {
+        if (preg_match('/\+(.*)/', $versionString, $matches) == 1) {
+            $this->buildMetaData = $matches[1];
+            $versionString = str_replace($matches[0], '', $versionString);
+        }
+    }
+
+    /**
+     * @param string $versionString
+     */
+    private function extractLabel(&$versionString) {
+        if (preg_match('/\-(.*)/', $versionString, $matches) == 1) {
+            $this->label = $matches[1];
+            $versionString = str_replace($matches[0], '', $versionString);
+        }
+    }
+}
diff --git a/vendor/phar-io/version/src/VersionNumber.php b/vendor/phar-io/version/src/VersionNumber.php
new file mode 100644
index 0000000000..ab512ed15c
--- /dev/null
+++ b/vendor/phar-io/version/src/VersionNumber.php
@@ -0,0 +1,41 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Version;
+
+class VersionNumber {
+    /**
+     * @var int
+     */
+    private $value;
+
+    /**
+     * @param mixed $value
+     */
+    public function __construct($value) {
+        if (is_numeric($value)) {
+            $this->value = $value;
+        }
+    }
+
+    /**
+     * @return bool
+     */
+    public function isAny() {
+        return $this->value === null;
+    }
+
+    /**
+     * @return int
+     */
+    public function getValue() {
+        return $this->value;
+    }
+}
diff --git a/vendor/phar-io/version/src/constraints/AbstractVersionConstraint.php b/vendor/phar-io/version/src/constraints/AbstractVersionConstraint.php
new file mode 100644
index 0000000000..b732dbcaba
--- /dev/null
+++ b/vendor/phar-io/version/src/constraints/AbstractVersionConstraint.php
@@ -0,0 +1,32 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Version;
+
+abstract class AbstractVersionConstraint implements VersionConstraint {
+    /**
+     * @var string
+     */
+    private $originalValue = '';
+
+    /**
+     * @param string $originalValue
+     */
+    public function __construct($originalValue) {
+        $this->originalValue = $originalValue;
+    }
+
+    /**
+     * @return string
+     */
+    public function asString() {
+        return $this->originalValue;
+    }
+}
diff --git a/vendor/phar-io/version/src/constraints/AndVersionConstraintGroup.php b/vendor/phar-io/version/src/constraints/AndVersionConstraintGroup.php
new file mode 100644
index 0000000000..d9efeef7ad
--- /dev/null
+++ b/vendor/phar-io/version/src/constraints/AndVersionConstraintGroup.php
@@ -0,0 +1,43 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Version;
+
+class AndVersionConstraintGroup extends AbstractVersionConstraint {
+    /**
+     * @var VersionConstraint[]
+     */
+    private $constraints = [];
+
+    /**
+     * @param string $originalValue
+     * @param VersionConstraint[] $constraints
+     */
+    public function __construct($originalValue, array $constraints) {
+        parent::__construct($originalValue);
+
+        $this->constraints = $constraints;
+    }
+
+    /**
+     * @param Version $version
+     *
+     * @return bool
+     */
+    public function complies(Version $version) {
+        foreach ($this->constraints as $constraint) {
+            if (!$constraint->complies($version)) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+}
diff --git a/vendor/phar-io/version/src/constraints/AnyVersionConstraint.php b/vendor/phar-io/version/src/constraints/AnyVersionConstraint.php
new file mode 100644
index 0000000000..13ca2efcb6
--- /dev/null
+++ b/vendor/phar-io/version/src/constraints/AnyVersionConstraint.php
@@ -0,0 +1,29 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Version;
+
+class AnyVersionConstraint implements VersionConstraint {
+    /**
+     * @param Version $version
+     *
+     * @return bool
+     */
+    public function complies(Version $version) {
+        return true;
+    }
+
+    /**
+     * @return string
+     */
+    public function asString() {
+        return '*';
+    }
+}
diff --git a/vendor/phar-io/version/src/constraints/ExactVersionConstraint.php b/vendor/phar-io/version/src/constraints/ExactVersionConstraint.php
new file mode 100644
index 0000000000..b214117201
--- /dev/null
+++ b/vendor/phar-io/version/src/constraints/ExactVersionConstraint.php
@@ -0,0 +1,22 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Version;
+
+class ExactVersionConstraint extends AbstractVersionConstraint {
+    /**
+     * @param Version $version
+     *
+     * @return bool
+     */
+    public function complies(Version $version) {
+        return $this->asString() == $version->getVersionString();
+    }
+}
diff --git a/vendor/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php b/vendor/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php
new file mode 100644
index 0000000000..47039a899d
--- /dev/null
+++ b/vendor/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php
@@ -0,0 +1,38 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Version;
+
+class GreaterThanOrEqualToVersionConstraint extends AbstractVersionConstraint {
+    /**
+     * @var Version
+     */
+    private $minimalVersion;
+
+    /**
+     * @param string $originalValue
+     * @param Version $minimalVersion
+     */
+    public function __construct($originalValue, Version $minimalVersion) {
+        parent::__construct($originalValue);
+
+        $this->minimalVersion = $minimalVersion;
+    }
+
+    /**
+     * @param Version $version
+     *
+     * @return bool
+     */
+    public function complies(Version $version) {
+        return $version->getVersionString() == $this->minimalVersion->getVersionString()
+            || $version->isGreaterThan($this->minimalVersion);
+    }
+}
diff --git a/vendor/phar-io/version/src/constraints/OrVersionConstraintGroup.php b/vendor/phar-io/version/src/constraints/OrVersionConstraintGroup.php
new file mode 100644
index 0000000000..274407f80e
--- /dev/null
+++ b/vendor/phar-io/version/src/constraints/OrVersionConstraintGroup.php
@@ -0,0 +1,43 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Version;
+
+class OrVersionConstraintGroup extends AbstractVersionConstraint {
+    /**
+     * @var VersionConstraint[]
+     */
+    private $constraints = [];
+
+    /**
+     * @param string $originalValue
+     * @param VersionConstraint[] $constraints
+     */
+    public function __construct($originalValue, array $constraints) {
+        parent::__construct($originalValue);
+
+        $this->constraints = $constraints;
+    }
+
+    /**
+     * @param Version $version
+     *
+     * @return bool
+     */
+    public function complies(Version $version) {
+        foreach ($this->constraints as $constraint) {
+            if ($constraint->complies($version)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+}
diff --git a/vendor/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php b/vendor/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php
new file mode 100644
index 0000000000..3d589057d0
--- /dev/null
+++ b/vendor/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php
@@ -0,0 +1,48 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Version;
+
+class SpecificMajorAndMinorVersionConstraint extends AbstractVersionConstraint {
+    /**
+     * @var int
+     */
+    private $major = 0;
+
+    /**
+     * @var int
+     */
+    private $minor = 0;
+
+    /**
+     * @param string $originalValue
+     * @param int $major
+     * @param int $minor
+     */
+    public function __construct($originalValue, $major, $minor) {
+        parent::__construct($originalValue);
+
+        $this->major = $major;
+        $this->minor = $minor;
+    }
+
+    /**
+     * @param Version $version
+     *
+     * @return bool
+     */
+    public function complies(Version $version) {
+        if ($version->getMajor()->getValue() != $this->major) {
+            return false;
+        }
+
+        return $version->getMinor()->getValue() == $this->minor;
+    }
+}
diff --git a/vendor/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php b/vendor/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php
new file mode 100644
index 0000000000..bbac47b8df
--- /dev/null
+++ b/vendor/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php
@@ -0,0 +1,37 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Version;
+
+class SpecificMajorVersionConstraint extends AbstractVersionConstraint {
+    /**
+     * @var int
+     */
+    private $major = 0;
+
+    /**
+     * @param string $originalValue
+     * @param int $major
+     */
+    public function __construct($originalValue, $major) {
+        parent::__construct($originalValue);
+
+        $this->major = $major;
+    }
+
+    /**
+     * @param Version $version
+     *
+     * @return bool
+     */
+    public function complies(Version $version) {
+        return $version->getMajor()->getValue() == $this->major;
+    }
+}
diff --git a/vendor/phar-io/version/src/constraints/VersionConstraint.php b/vendor/phar-io/version/src/constraints/VersionConstraint.php
new file mode 100644
index 0000000000..9558163f0a
--- /dev/null
+++ b/vendor/phar-io/version/src/constraints/VersionConstraint.php
@@ -0,0 +1,26 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Version;
+
+interface VersionConstraint {
+    /**
+     * @param Version $version
+     *
+     * @return bool
+     */
+    public function complies(Version $version);
+
+    /**
+     * @return string
+     */
+    public function asString();
+
+}
diff --git a/vendor/phar-io/version/src/exceptions/Exception.php b/vendor/phar-io/version/src/exceptions/Exception.php
new file mode 100644
index 0000000000..b99e4dd453
--- /dev/null
+++ b/vendor/phar-io/version/src/exceptions/Exception.php
@@ -0,0 +1,14 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Version;
+
+interface Exception {
+}
diff --git a/vendor/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php b/vendor/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php
new file mode 100644
index 0000000000..225fe715e6
--- /dev/null
+++ b/vendor/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php
@@ -0,0 +1,7 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Version;
+
+final class UnsupportedVersionConstraintException extends \RuntimeException implements Exception {
+}
diff --git a/vendor/phar-io/version/tests/Integration/VersionConstraintParserTest.php b/vendor/phar-io/version/tests/Integration/VersionConstraintParserTest.php
new file mode 100644
index 0000000000..f3e1ba81b0
--- /dev/null
+++ b/vendor/phar-io/version/tests/Integration/VersionConstraintParserTest.php
@@ -0,0 +1,146 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Version;
+
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @covers \PharIo\Version\VersionConstraintParser
+ */
+class VersionConstraintParserTest extends TestCase {
+    /**
+     * @dataProvider versionStringProvider
+     *
+     * @param string $versionString
+     * @param VersionConstraint $expectedConstraint
+     */
+    public function testReturnsExpectedConstraint($versionString, VersionConstraint $expectedConstraint) {
+        $parser = new VersionConstraintParser;
+
+        $this->assertEquals($expectedConstraint, $parser->parse($versionString));
+    }
+
+    /**
+     * @dataProvider unsupportedVersionStringProvider
+     *
+     * @param string $versionString
+     */
+    public function testThrowsExceptionIfVersionStringIsNotSupported($versionString) {
+        $parser = new VersionConstraintParser;
+
+        $this->expectException(UnsupportedVersionConstraintException::class);
+
+        $parser->parse($versionString);
+    }
+
+    /**
+     * @return array
+     */
+    public function versionStringProvider() {
+        return [
+            ['1.0.2', new ExactVersionConstraint('1.0.2')],
+            [
+                '~4.6',
+                new AndVersionConstraintGroup(
+                    '~4.6',
+                    [
+                        new GreaterThanOrEqualToVersionConstraint('~4.6', new Version('4.6')),
+                        new SpecificMajorVersionConstraint('~4.6', 4)
+                    ]
+                )
+            ],
+            [
+                '~4.6.2',
+                new AndVersionConstraintGroup(
+                    '~4.6.2',
+                    [
+                        new GreaterThanOrEqualToVersionConstraint('~4.6.2', new Version('4.6.2')),
+                        new SpecificMajorAndMinorVersionConstraint('~4.6.2', 4, 6)
+                    ]
+                )
+            ],
+            [
+                '^2.6.1',
+                new AndVersionConstraintGroup(
+                    '^2.6.1',
+                    [
+                        new GreaterThanOrEqualToVersionConstraint('^2.6.1', new Version('2.6.1')),
+                        new SpecificMajorVersionConstraint('^2.6.1', 2)
+                    ]
+                )
+            ],
+            ['5.1.*', new SpecificMajorAndMinorVersionConstraint('5.1.*', 5, 1)],
+            ['5.*', new SpecificMajorVersionConstraint('5.*', 5)],
+            ['*', new AnyVersionConstraint()],
+            [
+                '1.0.2 || 1.0.5',
+                new OrVersionConstraintGroup(
+                    '1.0.2 || 1.0.5',
+                    [
+                        new ExactVersionConstraint('1.0.2'),
+                        new ExactVersionConstraint('1.0.5')
+                    ]
+                )
+            ],
+            [
+                '^5.6 || ^7.0',
+                new OrVersionConstraintGroup(
+                    '^5.6 || ^7.0',
+                    [
+                        new AndVersionConstraintGroup(
+                            '^5.6', [
+                                new GreaterThanOrEqualToVersionConstraint('^5.6', new Version('5.6')),
+                                new SpecificMajorVersionConstraint('^5.6', 5)
+                            ]
+                        ),
+                        new AndVersionConstraintGroup(
+                            '^7.0', [
+                                new GreaterThanOrEqualToVersionConstraint('^7.0', new Version('7.0')),
+                                new SpecificMajorVersionConstraint('^7.0', 7)
+                            ]
+                        )
+                    ]
+                )
+            ],
+            ['7.0.28-1', new ExactVersionConstraint('7.0.28-1')],
+            [
+                '^3.0.0-alpha1',
+                new AndVersionConstraintGroup(
+                    '^3.0.0-alpha1',
+                    [
+                        new GreaterThanOrEqualToVersionConstraint('^3.0.0-alpha1', new Version('3.0.0-alpha1')),
+                        new SpecificMajorVersionConstraint('^3.0.0-alpha1', 3)
+                    ]
+                )
+            ],
+            [
+                '^3.0.0-alpha.1',
+                new AndVersionConstraintGroup(
+                    '^3.0.0-alpha.1',
+                    [
+                        new GreaterThanOrEqualToVersionConstraint('^3.0.0-alpha.1', new Version('3.0.0-alpha.1')),
+                        new SpecificMajorVersionConstraint('^3.0.0-alpha.1', 3)
+                    ]
+                )
+            ]
+        ];
+    }
+
+    public function unsupportedVersionStringProvider() {
+        return [
+            ['foo'],
+            ['+1.0.2'],
+            ['>=2.0'],
+            ['^5.6 || >= 7.0'],
+            ['2.0 || foo']
+        ];
+    }
+}
diff --git a/vendor/phar-io/version/tests/Unit/AbstractVersionConstraintTest.php b/vendor/phar-io/version/tests/Unit/AbstractVersionConstraintTest.php
new file mode 100644
index 0000000000..c61856692b
--- /dev/null
+++ b/vendor/phar-io/version/tests/Unit/AbstractVersionConstraintTest.php
@@ -0,0 +1,25 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Version;
+
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @covers \PharIo\Version\AbstractVersionConstraint
+ */
+class AbstractVersionConstraintTest extends TestCase {
+    public function testAsString() {
+        /** @var AbstractVersionConstraint|\PHPUnit_Framework_MockObject_MockObject $constraint */
+        $constraint = $this->getMockForAbstractClass(AbstractVersionConstraint::class, ['foo']);
+
+        $this->assertSame('foo', $constraint->asString());
+    }
+}
diff --git a/vendor/phar-io/version/tests/Unit/AndVersionConstraintGroupTest.php b/vendor/phar-io/version/tests/Unit/AndVersionConstraintGroupTest.php
new file mode 100644
index 0000000000..c2c5ec0f97
--- /dev/null
+++ b/vendor/phar-io/version/tests/Unit/AndVersionConstraintGroupTest.php
@@ -0,0 +1,52 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Version;
+
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @covers \PharIo\Version\AndVersionConstraintGroup
+ */
+class AndVersionConstraintGroupTest extends TestCase {
+    public function testReturnsFalseIfOneConstraintReturnsFalse() {
+        $firstConstraint = $this->createMock(VersionConstraint::class);
+        $secondConstraint = $this->createMock(VersionConstraint::class);
+
+        $firstConstraint->expects($this->once())
+            ->method('complies')
+            ->will($this->returnValue(true));
+
+        $secondConstraint->expects($this->once())
+            ->method('complies')
+            ->will($this->returnValue(false));
+
+        $group = new AndVersionConstraintGroup('foo', [$firstConstraint, $secondConstraint]);
+
+        $this->assertFalse($group->complies(new Version('1.0.0')));
+    }
+
+    public function testReturnsTrueIfAllConstraintsReturnsTrue() {
+        $firstConstraint = $this->createMock(VersionConstraint::class);
+        $secondConstraint = $this->createMock(VersionConstraint::class);
+
+        $firstConstraint->expects($this->once())
+            ->method('complies')
+            ->will($this->returnValue(true));
+
+        $secondConstraint->expects($this->once())
+            ->method('complies')
+            ->will($this->returnValue(true));
+
+        $group = new AndVersionConstraintGroup('foo', [$firstConstraint, $secondConstraint]);
+
+        $this->assertTrue($group->complies(new Version('1.0.0')));
+    }
+}
diff --git a/vendor/phar-io/version/tests/Unit/AnyVersionConstraintTest.php b/vendor/phar-io/version/tests/Unit/AnyVersionConstraintTest.php
new file mode 100644
index 0000000000..6883099d3e
--- /dev/null
+++ b/vendor/phar-io/version/tests/Unit/AnyVersionConstraintTest.php
@@ -0,0 +1,41 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Version;
+
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @covers \PharIo\Version\AnyVersionConstraint
+ */
+class AnyVersionConstraintTest extends TestCase {
+    public function versionProvider() {
+        return [
+            [new Version('1.0.2')],
+            [new Version('4.8')],
+            [new Version('0.1.1-dev')]
+        ];
+    }
+
+    /**
+     * @dataProvider versionProvider
+     *
+     * @param Version $version
+     */
+    public function testReturnsTrue(Version $version) {
+        $constraint = new AnyVersionConstraint;
+
+        $this->assertTrue($constraint->complies($version));
+    }
+
+    public function testAsString() {
+        $this->assertSame('*', (new AnyVersionConstraint())->asString());
+    }
+}
diff --git a/vendor/phar-io/version/tests/Unit/ExactVersionConstraintTest.php b/vendor/phar-io/version/tests/Unit/ExactVersionConstraintTest.php
new file mode 100644
index 0000000000..ebba024134
--- /dev/null
+++ b/vendor/phar-io/version/tests/Unit/ExactVersionConstraintTest.php
@@ -0,0 +1,58 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Version;
+
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @covers \PharIo\Version\ExactVersionConstraint
+ */
+class ExactVersionConstraintTest extends TestCase {
+    public function compliantVersionProvider() {
+        return [
+            ['1.0.2', new Version('1.0.2')],
+            ['4.8.9', new Version('4.8.9')],
+            ['4.8', new Version('4.8')],
+        ];
+    }
+
+    public function nonCompliantVersionProvider() {
+        return [
+            ['1.0.2', new Version('1.0.3')],
+            ['4.8.9', new Version('4.7.9')],
+            ['4.8', new Version('4.8.5')],
+        ];
+    }
+
+    /**
+     * @dataProvider compliantVersionProvider
+     *
+     * @param string $constraintValue
+     * @param Version $version
+     */
+    public function testReturnsTrueForCompliantVersion($constraintValue, Version $version) {
+        $constraint = new ExactVersionConstraint($constraintValue);
+
+        $this->assertTrue($constraint->complies($version));
+    }
+
+    /**
+     * @dataProvider nonCompliantVersionProvider
+     *
+     * @param string $constraintValue
+     * @param Version $version
+     */
+    public function testReturnsFalseForNonCompliantVersion($constraintValue, Version $version) {
+        $constraint = new ExactVersionConstraint($constraintValue);
+
+        $this->assertFalse($constraint->complies($version));
+    }
+}
diff --git a/vendor/phar-io/version/tests/Unit/GreaterThanOrEqualToVersionConstraintTest.php b/vendor/phar-io/version/tests/Unit/GreaterThanOrEqualToVersionConstraintTest.php
new file mode 100644
index 0000000000..3cbb11d726
--- /dev/null
+++ b/vendor/phar-io/version/tests/Unit/GreaterThanOrEqualToVersionConstraintTest.php
@@ -0,0 +1,47 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Version;
+
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @covers \PharIo\Version\GreaterThanOrEqualToVersionConstraint
+ */
+class GreaterThanOrEqualToVersionConstraintTest extends TestCase {
+    public function versionProvider() {
+        return [
+            // compliant versions
+            [new Version('1.0.2'), new Version('1.0.2'), true],
+            [new Version('1.0.2'), new Version('1.0.3'), true],
+            [new Version('1.0.2'), new Version('1.1.1'), true],
+            [new Version('1.0.2'), new Version('2.0.0'), true],
+            [new Version('1.0.2'), new Version('1.0.3'), true],
+            // non-compliant versions
+            [new Version('1.0.2'), new Version('1.0.1'), false],
+            [new Version('1.9.8'), new Version('0.9.9'), false],
+            [new Version('2.3.1'), new Version('2.2.3'), false],
+            [new Version('3.0.2'), new Version('2.9.9'), false],
+        ];
+    }
+
+    /**
+     * @dataProvider versionProvider
+     *
+     * @param Version $constraintVersion
+     * @param Version $version
+     * @param bool $expectedResult
+     */
+    public function testReturnsTrueForCompliantVersions(Version $constraintVersion, Version $version, $expectedResult) {
+        $constraint = new GreaterThanOrEqualToVersionConstraint('foo', $constraintVersion);
+
+        $this->assertSame($expectedResult, $constraint->complies($version));
+    }
+}
diff --git a/vendor/phar-io/version/tests/Unit/OrVersionConstraintGroupTest.php b/vendor/phar-io/version/tests/Unit/OrVersionConstraintGroupTest.php
new file mode 100644
index 0000000000..088d557b78
--- /dev/null
+++ b/vendor/phar-io/version/tests/Unit/OrVersionConstraintGroupTest.php
@@ -0,0 +1,65 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Version;
+
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @covers \PharIo\Version\OrVersionConstraintGroup
+ */
+class OrVersionConstraintGroupTest extends TestCase {
+    public function testReturnsTrueIfOneConstraintReturnsFalse() {
+        $firstConstraint = $this->createMock(VersionConstraint::class);
+        $secondConstraint = $this->createMock(VersionConstraint::class);
+
+        $firstConstraint->expects($this->once())
+            ->method('complies')
+            ->will($this->returnValue(false));
+
+        $secondConstraint->expects($this->once())
+            ->method('complies')
+            ->will($this->returnValue(true));
+
+        $group = new OrVersionConstraintGroup('foo', [$firstConstraint, $secondConstraint]);
+
+        $this->assertTrue($group->complies(new Version('1.0.0')));
+    }
+
+    public function testReturnsTrueIfAllConstraintsReturnsTrue() {
+        $firstConstraint = $this->createMock(VersionConstraint::class);
+        $secondConstraint = $this->createMock(VersionConstraint::class);
+
+        $firstConstraint->expects($this->once())
+            ->method('complies')
+            ->will($this->returnValue(true));
+
+        $group = new OrVersionConstraintGroup('foo', [$firstConstraint, $secondConstraint]);
+
+        $this->assertTrue($group->complies(new Version('1.0.0')));
+    }
+
+    public function testReturnsFalseIfAllConstraintsReturnsFalse() {
+        $firstConstraint = $this->createMock(VersionConstraint::class);
+        $secondConstraint = $this->createMock(VersionConstraint::class);
+
+        $firstConstraint->expects($this->once())
+            ->method('complies')
+            ->will($this->returnValue(false));
+
+        $secondConstraint->expects($this->once())
+            ->method('complies')
+            ->will($this->returnValue(false));
+
+        $group = new OrVersionConstraintGroup('foo', [$firstConstraint, $secondConstraint]);
+
+        $this->assertFalse($group->complies(new Version('1.0.0')));
+    }
+}
diff --git a/vendor/phar-io/version/tests/Unit/PreReleaseSuffixTest.php b/vendor/phar-io/version/tests/Unit/PreReleaseSuffixTest.php
new file mode 100644
index 0000000000..e09a66d357
--- /dev/null
+++ b/vendor/phar-io/version/tests/Unit/PreReleaseSuffixTest.php
@@ -0,0 +1,46 @@
+assertSame($expectedResult, $leftSuffix->isGreaterThan($rightSuffix));
+    }
+
+    public function greaterThanProvider() {
+        return [
+            ['alpha1', 'alpha2', false],
+            ['alpha2', 'alpha1', true],
+            ['beta1', 'alpha3', true],
+            ['b1', 'alpha3', true],
+            ['b1', 'a3', true],
+            ['dev1', 'alpha2', false],
+            ['dev1', 'alpha2', false],
+            ['alpha2', 'dev5', true],
+            ['rc1', 'beta2', true],
+            ['patch5', 'rc7', true],
+            ['alpha1', 'alpha.2', false],
+            ['alpha.3', 'alpha2', true],
+            ['alpha.3', 'alpha.2', true],
+        ];
+    }
+}
diff --git a/vendor/phar-io/version/tests/Unit/SpecificMajorAndMinorVersionConstraintTest.php b/vendor/phar-io/version/tests/Unit/SpecificMajorAndMinorVersionConstraintTest.php
new file mode 100644
index 0000000000..6025889e0a
--- /dev/null
+++ b/vendor/phar-io/version/tests/Unit/SpecificMajorAndMinorVersionConstraintTest.php
@@ -0,0 +1,45 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Version;
+
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @covers \PharIo\Version\SpecificMajorAndMinorVersionConstraint
+ */
+class SpecificMajorAndMinorVersionConstraintTest extends TestCase {
+    public function versionProvider() {
+        return [
+            // compliant versions
+            [1, 0, new Version('1.0.2'), true],
+            [1, 0, new Version('1.0.3'), true],
+            [1, 1, new Version('1.1.1'), true],
+            // non-compliant versions
+            [2, 9, new Version('0.9.9'), false],
+            [3, 2, new Version('2.2.3'), false],
+            [2, 8, new Version('2.9.9'), false],
+        ];
+    }
+
+    /**
+     * @dataProvider versionProvider
+     *
+     * @param int $major
+     * @param int $minor
+     * @param Version $version
+     * @param bool $expectedResult
+     */
+    public function testReturnsTrueForCompliantVersions($major, $minor, Version $version, $expectedResult) {
+        $constraint = new SpecificMajorAndMinorVersionConstraint('foo', $major, $minor);
+
+        $this->assertSame($expectedResult, $constraint->complies($version));
+    }
+}
diff --git a/vendor/phar-io/version/tests/Unit/SpecificMajorVersionConstraintTest.php b/vendor/phar-io/version/tests/Unit/SpecificMajorVersionConstraintTest.php
new file mode 100644
index 0000000000..6dc3b718ed
--- /dev/null
+++ b/vendor/phar-io/version/tests/Unit/SpecificMajorVersionConstraintTest.php
@@ -0,0 +1,44 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Version;
+
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @covers \PharIo\Version\SpecificMajorVersionConstraint
+ */
+class SpecificMajorVersionConstraintTest extends TestCase {
+    public function versionProvider() {
+        return [
+            // compliant versions
+            [1, new Version('1.0.2'), true],
+            [1, new Version('1.0.3'), true],
+            [1, new Version('1.1.1'), true],
+            // non-compliant versions
+            [2, new Version('0.9.9'), false],
+            [3, new Version('2.2.3'), false],
+            [3, new Version('2.9.9'), false],
+        ];
+    }
+
+    /**
+     * @dataProvider versionProvider
+     *
+     * @param int $major
+     * @param Version $version
+     * @param bool $expectedResult
+     */
+    public function testReturnsTrueForCompliantVersions($major, Version $version, $expectedResult) {
+        $constraint = new SpecificMajorVersionConstraint('foo', $major);
+
+        $this->assertSame($expectedResult, $constraint->complies($version));
+    }
+}
diff --git a/vendor/phar-io/version/tests/Unit/VersionTest.php b/vendor/phar-io/version/tests/Unit/VersionTest.php
new file mode 100644
index 0000000000..6b4897a94d
--- /dev/null
+++ b/vendor/phar-io/version/tests/Unit/VersionTest.php
@@ -0,0 +1,113 @@
+, Sebastian Heuer , Sebastian Bergmann 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace PharIo\Version;
+
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @covers \PharIo\Version\Version
+ */
+class VersionTest extends TestCase {
+    /**
+     * @dataProvider versionProvider
+     *
+     * @param string $versionString
+     * @param string $expectedMajor
+     * @param string $expectedMinor
+     * @param string $expectedPatch
+     * @param string $expectedPreReleaseValue
+     * @param int $expectedReleaseCount
+     */
+    public function testParsesVersionNumbers(
+        $versionString,
+        $expectedMajor,
+        $expectedMinor,
+        $expectedPatch,
+        $expectedPreReleaseValue = '',
+        $expectedReleaseCount = 0
+    ) {
+        $version = new Version($versionString);
+
+        $this->assertSame($expectedMajor, $version->getMajor()->getValue());
+        $this->assertSame($expectedMinor, $version->getMinor()->getValue());
+        $this->assertSame($expectedPatch, $version->getPatch()->getValue());
+        if ($expectedPreReleaseValue !== '') {
+            $this->assertSame($expectedPreReleaseValue, $version->getPreReleaseSuffix()->getValue());
+        }
+        if ($expectedReleaseCount !== 0) {
+            $this->assertSame($expectedReleaseCount, $version->getPreReleaseSuffix()->getNumber());
+        }
+
+        $this->assertSame($versionString, $version->getVersionString());
+    }
+
+    public function versionProvider() {
+        return [
+            ['0.0.1', '0', '0', '1'],
+            ['0.1.2', '0', '1', '2'],
+            ['1.0.0-alpha', '1', '0', '0', 'alpha'],
+            ['3.4.12-dev3', '3', '4', '12', 'dev', 3],
+        ];
+    }
+
+    /**
+     * @dataProvider versionGreaterThanProvider
+     *
+     * @param Version $versionA
+     * @param Version $versionB
+     * @param bool $expectedResult
+     */
+    public function testIsGreaterThan(Version $versionA, Version $versionB, $expectedResult) {
+        $this->assertSame($expectedResult, $versionA->isGreaterThan($versionB));
+    }
+
+    /**
+     * @return array
+     */
+    public function versionGreaterThanProvider() {
+        return [
+            [new Version('1.0.0'), new Version('1.0.1'), false],
+            [new Version('1.0.1'), new Version('1.0.0'), true],
+            [new Version('1.1.0'), new Version('1.0.1'), true],
+            [new Version('1.1.0'), new Version('2.0.1'), false],
+            [new Version('1.1.0'), new Version('1.1.0'), false],
+            [new Version('2.5.8'), new Version('1.6.8'), true],
+            [new Version('2.5.8'), new Version('2.6.8'), false],
+            [new Version('2.5.8'), new Version('3.1.2'), false],
+            [new Version('3.0.0-alpha1'), new Version('3.0.0-alpha2'), false],
+            [new Version('3.0.0-alpha2'), new Version('3.0.0-alpha1'), true],
+            [new Version('3.0.0-alpha.1'), new Version('3.0.0'), false],
+            [new Version('3.0.0'), new Version('3.0.0-alpha.1'), true],
+        ];
+    }
+
+    /**
+     * @dataProvider invalidVersionStringProvider
+     *
+     * @param string $versionString
+     */
+    public function testThrowsExceptionIfVersionStringDoesNotFollowSemVer($versionString) {
+        $this->expectException(InvalidVersionException::class);
+        new Version($versionString);
+    }
+
+    /**
+     * @return array
+     */
+    public function invalidVersionStringProvider() {
+        return [
+            ['foo'],
+            ['0.0.1-dev+ABC', '0', '0', '1', 'dev', 'ABC'],
+            ['1.0.0-x.7.z.92', '1', '0', '0', 'x.7.z.92']
+        ];
+    }
+
+}
diff --git a/vendor/php-ffmpeg/php-ffmpeg/.github/ISSUE_TEMPLATE.md b/vendor/php-ffmpeg/php-ffmpeg/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 0000000000..ef7b4f8f55
--- /dev/null
+++ b/vendor/php-ffmpeg/php-ffmpeg/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,25 @@
+| Q              | A
+| -------------- | ---
+| Bug?           | no
+| New Feature?   | no
+| Version Used   | Specific tag or commit sha
+| FFmpeg Version | FFmpeg or AVConv and version
+| OS             | Your OS and version
+
+#### Actual Behavior
+
+How does PHP-FFMpeg behave at the moment?
+
+#### Expected Behavior
+
+What is the behavior you expect?
+
+#### Steps to Reproduce
+
+What are the steps to reproduce this bug? Please add code examples,
+screenshots or links to GitHub repositories that reproduce the problem.
+
+#### Possible Solutions
+
+If you have already ideas how to solve the issue, add them here.
+Otherwise remove this section.
diff --git a/vendor/php-ffmpeg/php-ffmpeg/.github/PULL_REQUEST_TEMPLATE.md b/vendor/php-ffmpeg/php-ffmpeg/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000000..49205d2049
--- /dev/null
+++ b/vendor/php-ffmpeg/php-ffmpeg/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,36 @@
+| Q                  | A
+| ------------------ | ---
+| Bug fix?           | no
+| New feature?       | no
+| BC breaks?         | no
+| Deprecations?      | no
+| Fixed tickets      | fixes #issuenum
+| Related issues/PRs | #issuenum
+| License            | MIT
+
+#### What's in this PR?
+
+Explain the contents of the PR.
+
+#### Why?
+
+Which problem does the PR fix?
+
+#### Example Usage
+
+```php
+$foo = new Foo();
+
+// Now we can do
+$foo->doSomething();
+
+// Remove this section if not needed
+~~~
+
+#### BC Breaks/Deprecations
+
+Describe BC breaks/deprecations here (Remove this section if not needed).
+
+#### To Do
+
+- [ ] Create tests
diff --git a/vendor/php-ffmpeg/php-ffmpeg/.gitignore b/vendor/php-ffmpeg/php-ffmpeg/.gitignore
new file mode 100644
index 0000000000..6b443ed622
--- /dev/null
+++ b/vendor/php-ffmpeg/php-ffmpeg/.gitignore
@@ -0,0 +1,11 @@
+#/nbproject/
+/vendor/
+/docs/build
+composer.phar
+composer.lock
+phpunit.xml
+.phpunit.result.cache
+/tests/Functional/output/output-*
+sami.phar
+.idea/
+/phpunit
diff --git a/vendor/php-ffmpeg/php-ffmpeg/.sami.php b/vendor/php-ffmpeg/php-ffmpeg/.sami.php
new file mode 100644
index 0000000000..e4957880bb
--- /dev/null
+++ b/vendor/php-ffmpeg/php-ffmpeg/.sami.php
@@ -0,0 +1,20 @@
+files()
+    ->name('*.php')
+    ->in($dir = 'src')
+;
+
+return new Sami($iterator, array(
+    'title'                => 'PHP-FFMpeg API',
+    'theme'                => 'enhanced',
+    'build_dir'            => __DIR__.'/docs/source/API/API',
+    'cache_dir'            => __DIR__.'/docs/source/API/API/cache',
+    'default_opened_level' => 2,
+));
diff --git a/vendor/php-ffmpeg/php-ffmpeg/.travis.yml b/vendor/php-ffmpeg/php-ffmpeg/.travis.yml
new file mode 100644
index 0000000000..0cdcf37eb7
--- /dev/null
+++ b/vendor/php-ffmpeg/php-ffmpeg/.travis.yml
@@ -0,0 +1,60 @@
+language: php
+
+dist: trusty
+
+branches:
+  only:
+    - master
+    - v1.x
+
+cache:
+  directories:
+    - $HOME/.composer/cache
+    - $HOME/.cache
+
+matrix:
+  include:
+    - php: 5.4
+      env:
+        - PHPUNIT_VERSION=4
+        - COMPOSER_FLAGS="--prefer-lowest"
+    - php: 5.4
+      env:
+        - PHPUNIT_VERSION=4
+    - php: 5.5
+      env:
+        - PHPUNIT_VERSION=4
+    - php: 5.6
+    - php: 7.0
+    - php: 7.1
+    - php: 7.2
+    - php: 7.3
+    - php: 7.4
+
+before_install:
+  - sudo add-apt-repository ppa:mc3man/trusty-media -y
+  - sudo apt-get update -q
+  - composer self-update
+  - echo "$PHPUNIT_VERSION"
+  - |
+    if [ "$PHPUNIT_VERSION" ]; then
+      composer remove symfony/phpunit-bridge --dev
+      wget -O phpunit "https://phar.phpunit.de/phpunit-$PHPUNIT_VERSION.phar"
+      chmod +x phpunit
+    fi;
+  - |
+    if [ "$COMPOSER_FLAGS" == "--prefer-lowest" ]; then
+      composer require "roave/security-advisories" dev-master --no-update
+    fi;
+
+install:
+  - sudo apt-get install -y ffmpeg
+  - composer update --prefer-dist $COMPOSER_FLAGS
+
+script:
+  - |
+    if [ "$PHPUNIT_VERSION" ]; then
+      ./phpunit --verbose
+    else
+      ./vendor/bin/simple-phpunit --verbose
+    fi;
diff --git a/vendor/php-ffmpeg/php-ffmpeg/CHANGELOG.md b/vendor/php-ffmpeg/php-ffmpeg/CHANGELOG.md
new file mode 100644
index 0000000000..78aeb46da0
--- /dev/null
+++ b/vendor/php-ffmpeg/php-ffmpeg/CHANGELOG.md
@@ -0,0 +1,173 @@
+CHANGELOG
+=========
+
+All notable changes to this project will be documented in this file.
+This project adheres to [Semantic Versioning](http://semver.org/).
+
+[Unreleased]
+------------
+
+### Added
+
+- Add pull request and issue templates.
+- Usage of new codec "aac" of ffmpeg 3
+
+### Changed
+
+- Updated changelog to follow [keepachangelog.com](http://keepachangelog.com/)
+  style you see now here.
+
+[0.7.0] - 2016-12-15
+--------------------
+
+- Add support for FFMpeg 3 aac codec (@Nek-)
+- Add a waveform filter to extract audio waveform images (@Romain)
+
+[0.6.1] - 2016-03-08
+--------------------
+
+- Support PHP 7 and test against
+- Unused code cleanup (@haphan)
+- Composer and tests cleanup (PSR-4 autoloading)
+- Allow usage of evenement v2.0
+
+[0.6.0] - 2016-01-30
+--------------------
+
+- AbstractData::get no longer throws exceptions (@sujayjaju).
+- Add crop filter (@cangelis).
+- Fix watermark (@sujayjaju).
+
+[0.5.1] - 2016-08-26
+--------------------
+
+- Fix video aspect ratio calculation (@nlegoff).
+
+[0.5.0] - 2014-08-12
+--------------------
+
+- Add support for Wav and AAC audio formats (@MrHash).
+- Add watermark filter (@sylvainv).
+- Add configuration for audio channels (@SimonSimCity).
+
+[0.4.4] - 2016-12-17
+--------------------
+
+- Fix width / height dimensions extraction.
+
+[0.4.3] - 2013-02-12
+--------------------
+
+- Fix using rotate and resize filters at the same time (#78)
+
+[0.4.2] - 2013-11-29
+--------------------
+
+- Add Rotate filter.
+- Remove time_start metadata when using synchronize filter
+- Remove restriction on filesystem resources.
+
+[0.4.1] - 2013-11-26
+--------------------
+
+- Add Clip filter (@guimeira)
+
+[0.4.0] - 2013-10-21
+--------------------
+
+- Add support for video to audio transcoding
+- BC Break : Add FormatInterface::getPasses and FormatInterface::getExtraParams
+
+[0.3.5] - 2013-10-21
+--------------------
+
+- Add vorbis audio format (@jacobbudin).
+- Fix #66 : Allow single pass encodings.
+
+[0.3.4] - 2013-09-05
+--------------------
+
+- Fix Invalid ratio computing.
+
+[0.3.3] - 2013-09-05
+--------------------
+
+- Add convenient Stream::getDimensions method to extract video dimension.
+- Add DisplayRatioFixer Frame filter.
+
+[0.3.2] - 2013-08-08
+--------------------
+
+- Fix A/V synchronization over flash and HTML5 players.
+
+[0.3.1] - 2013-08-06
+--------------------
+
+- Allow use of FFProbe on remote URIs.
+- Fix #47 : MediaTypeInterface::save adds filters depending on the codec.
+- Save frame to target file without prompt.
+
+[0.3.0] - 2013-07-04
+--------------------
+
+- Complete rewrite of the library, lots of BC breaks, check the doc.
+
+[0.2.4] - 2013-05-10
+--------------------
+
+- Add Video\ResizableInterface::getModulus method for better output scaling (@retrojunk)
+- Fix timeout setting on audio/video encoding (@xammep-ua)
+
+[0.2.3] - 2013-04-21
+--------------------
+
+- Add timeout getter and setter on FFMpeg and FFProbe
+- Add timeout setting via second argument on FFMpeg::load and FFProbe::load
+
+[0.2.2] - 2013-02-11
+--------------------
+
+- Add compatibility with FFMpeg 1.1
+- Upgrade deprecated options (`-ab`, `-qscale` and `-b`)
+- Use of a custom stat file for each multi-pass encoding (fix #20)
+- Use larger version range for dependencies
+
+[0.2.1] - 2013-02-04
+--------------------
+
+- Parse the output of FFProbe using correct EOL sequences (@ak76)
+- Add process timeout customization (@pulse00)
+- Fix `accurate` option (`FFMpeg::extractImage`)
+
+[0.2.0] - 2012-12-13
+--------------------
+
+- Add HelperInterface and support for realtime progress ( @pulse00 ).
+- Add `accurate` option to `FFMpeg::extractImage` method.
+
+0.1.0 - 2012-10-30
+--------------------
+
+- First stable version.
+
+[Unreleased]: https://github.com/PHP-FFMpeg/PHP-FFMpeg/compare/0.6.1...HEAD
+[0.6.1]: https://github.com/PHP-FFMpeg/PHP-FFMpeg/compare/0.6.0...0.6.1
+[0.6.0]: https://github.com/PHP-FFMpeg/PHP-FFMpeg/compare/0.5.1...0.6.0
+[0.5.1]: https://github.com/PHP-FFMpeg/PHP-FFMpeg/compare/0.5.0...0.5.1
+[0.5.0]: https://github.com/PHP-FFMpeg/PHP-FFMpeg/compare/0.4.4...0.5.0
+[0.4.4]: https://github.com/PHP-FFMpeg/PHP-FFMpeg/compare/0.4.3...0.4.4
+[0.4.3]: https://github.com/PHP-FFMpeg/PHP-FFMpeg/compare/0.4.2...0.4.3
+[0.4.2]: https://github.com/PHP-FFMpeg/PHP-FFMpeg/compare/0.4.1...0.4.2
+[0.4.1]: https://github.com/PHP-FFMpeg/PHP-FFMpeg/compare/0.4.0...0.4.1
+[0.4.0]: https://github.com/PHP-FFMpeg/PHP-FFMpeg/compare/0.3.5...0.4.0
+[0.3.5]: https://github.com/PHP-FFMpeg/PHP-FFMpeg/compare/0.3.4...0.3.5
+[0.3.4]: https://github.com/PHP-FFMpeg/PHP-FFMpeg/compare/0.3.3...0.3.4
+[0.3.3]: https://github.com/PHP-FFMpeg/PHP-FFMpeg/compare/0.3.2...0.3.3
+[0.3.2]: https://github.com/PHP-FFMpeg/PHP-FFMpeg/compare/0.3.1...0.3.2
+[0.3.1]: https://github.com/PHP-FFMpeg/PHP-FFMpeg/compare/0.3.0...0.3.1
+[0.3.0]: https://github.com/PHP-FFMpeg/PHP-FFMpeg/compare/0.2.4...0.3.0
+[0.2.4]: https://github.com/PHP-FFMpeg/PHP-FFMpeg/compare/0.2.3...0.2.4
+[0.2.3]: https://github.com/PHP-FFMpeg/PHP-FFMpeg/compare/0.2.2...0.2.3
+[0.2.2]: https://github.com/PHP-FFMpeg/PHP-FFMpeg/compare/0.2.1...0.2.2
+[0.2.1]: https://github.com/PHP-FFMpeg/PHP-FFMpeg/compare/0.2.0...0.2.1
+[0.2.0]: https://github.com/PHP-FFMpeg/PHP-FFMpeg/compare/0.1.0...0.2.0
diff --git a/vendor/php-ffmpeg/php-ffmpeg/LICENSE b/vendor/php-ffmpeg/php-ffmpeg/LICENSE
new file mode 100644
index 0000000000..ac8da71916
--- /dev/null
+++ b/vendor/php-ffmpeg/php-ffmpeg/LICENSE
@@ -0,0 +1,21 @@
+PHP-FFmpeg is released with MIT License :
+
+Copyright (c) 2012 Alchemy
+
+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/php-ffmpeg/php-ffmpeg/README.md b/vendor/php-ffmpeg/php-ffmpeg/README.md
new file mode 100644
index 0000000000..980a5a214f
--- /dev/null
+++ b/vendor/php-ffmpeg/php-ffmpeg/README.md
@@ -0,0 +1,755 @@
+# php-ffmpeg
+
+[![Build Status](https://secure.travis-ci.org/PHP-FFMpeg/PHP-FFMpeg.png?branch=master)](http://travis-ci.org/PHP-FFMpeg/PHP-FFMpeg)
+
+[![SensioLabsInsight](https://insight.sensiolabs.com/projects/607f3111-e2d7-44e8-8bcc-54dd64521983/big.png)](https://insight.sensiolabs.com/projects/607f3111-e2d7-44e8-8bcc-54dd64521983)
+
+An Object-Oriented library to convert video/audio files with FFmpeg / AVConv.
+
+Check another amazing repo: [PHP FFMpeg extras](https://github.com/alchemy-fr/PHP-FFMpeg-Extras), you will find lots of Audio/Video formats there.
+
+## Your attention please
+
+### How this library works:
+
+This library requires a working FFMpeg install. You will need both FFMpeg and FFProbe binaries to use it.
+Be sure that these binaries can be located with system PATH to get the benefit of the binary detection,
+otherwise you should have to explicitly give the binaries path on load.
+
+For Windows users: Please find the binaries at http://ffmpeg.zeranoe.com/builds/.
+
+### Known issues:
+
+- Using rotate and resize will produce a corrupted output when using
+[libav](http://libav.org/) 0.8. The bug is fixed in version 9. This bug does not
+appear in latest ffmpeg version.
+
+## Installation
+
+The recommended way to install PHP-FFMpeg is through [Composer](https://getcomposer.org).
+
+```bash
+$ composer require php-ffmpeg/php-ffmpeg
+```
+
+## Basic Usage
+
+```php
+
+require 'vendor/autoload.php';
+
+$ffmpeg = FFMpeg\FFMpeg::create();
+$video = $ffmpeg->open('video.mpg');
+$video
+    ->filters()
+    ->resize(new FFMpeg\Coordinate\Dimension(320, 240))
+    ->synchronize();
+$video
+    ->frame(FFMpeg\Coordinate\TimeCode::fromSeconds(10))
+    ->save('frame.jpg');
+$video
+    ->save(new FFMpeg\Format\Video\X264(), 'export-x264.mp4')
+    ->save(new FFMpeg\Format\Video\WMV(), 'export-wmv.wmv')
+    ->save(new FFMpeg\Format\Video\WebM(), 'export-webm.webm');
+```
+
+## Documentation
+
+This documentation is an introduction to discover the API. It's recommended
+to browse the source code as it is self-documented.
+
+### FFMpeg
+
+`FFMpeg\FFMpeg` is the main object to use to manipulate medias. To build it,
+use the static `FFMpeg\FFMpeg::create`:
+
+```php
+$ffmpeg = FFMpeg\FFMpeg::create();
+```
+
+FFMpeg will autodetect ffmpeg and ffprobe binaries. If you want to give binary
+paths explicitly, you can pass an array as configuration. A `Psr\Logger\LoggerInterface`
+can also be passed to log binary executions.
+
+```php
+$ffmpeg = FFMpeg\FFMpeg::create(array(
+    'ffmpeg.binaries'  => '/opt/local/ffmpeg/bin/ffmpeg',
+    'ffprobe.binaries' => '/opt/local/ffmpeg/bin/ffprobe',
+    'timeout'          => 3600, // The timeout for the underlying process
+    'ffmpeg.threads'   => 12,   // The number of threads that FFMpeg should use
+), $logger);
+```
+
+### Manipulate media
+
+`FFMpeg\FFMpeg` creates media based on URIs. URIs could be either a pointer to a
+local filesystem resource, an HTTP resource or any resource supported by FFmpeg.
+
+**Note**: To list all supported resource type of your FFmpeg build, use the
+`-protocols` command:
+
+```
+ffmpeg -protocols
+```
+
+To open a resource, use the `FFMpeg\FFMpeg::open` method.
+
+```php
+$ffmpeg->open('video.mpeg');
+```
+
+Two types of media can be resolved: `FFMpeg\Media\Audio` and `FFMpeg\Media\Video`.
+A third type, `FFMpeg\Media\Frame`, is available through videos.
+
+### Video
+
+`FFMpeg\Media\Video` can be transcoded, ie: change codec, isolate audio or
+video. Frames can be extracted.
+
+##### Transcoding
+
+You can transcode videos using the `FFMpeg\Media\Video:save` method. You will
+pass a `FFMpeg\Format\FormatInterface` for that.
+
+Please note that audio and video bitrate are set on the format.
+
+```php
+$format = new FFMpeg\Format\Video\X264();
+$format->on('progress', function ($video, $format, $percentage) {
+    echo "$percentage % transcoded";
+});
+
+$format
+    ->setKiloBitrate(1000)
+    ->setAudioChannels(2)
+    ->setAudioKiloBitrate(256);
+
+$video->save($format, 'video.avi');
+```
+
+Transcoding progress can be monitored in realtime, see Format documentation
+below for more information.
+
+##### Extracting image
+
+You can extract a frame at any timecode using the `FFMpeg\Media\Video::frame`
+method.
+
+This code returns a `FFMpeg\Media\Frame` instance corresponding to the second 42.
+You can pass any `FFMpeg\Coordinate\TimeCode` as argument, see dedicated
+documentation below for more information.
+
+```php
+$frame = $video->frame(FFMpeg\Coordinate\TimeCode::fromSeconds(42));
+$frame->save('image.jpg');
+```
+
+If you want to extract multiple images from the video, you can use the following filter:
+
+```php
+$video
+    ->filters()
+    ->extractMultipleFrames(FFMpeg\Filters\Video\ExtractMultipleFramesFilter::FRAMERATE_EVERY_10SEC, '/path/to/destination/folder/')
+    ->synchronize();
+
+$video
+    ->save(new FFMpeg\Format\Video\X264(), '/path/to/new/file');
+```
+By default, this will save the frames as `jpg` images.
+
+You are able to override this using `setFrameFileType` to save the frames in another format:
+```php
+$frameFileType = 'jpg'; // either 'jpg', 'jpeg' or 'png'
+$filter = new ExtractMultipleFramesFilter($frameRate, $destinationFolder);
+$filter->setFrameFileType($frameFileType);
+
+$video->addFilter($filter);
+```
+
+##### Clip
+
+Cuts the video at a desired point. Use input seeking method. It is faster option than use filter clip.
+
+```php
+$clip = $video->clip(FFMpeg\Coordinate\TimeCode::fromSeconds(30), FFMpeg\Coordinate\TimeCode::fromSeconds(15));
+$clip->save(new FFMpeg\Format\Video\X264(), 'video.avi');
+```
+
+The clip filter takes two parameters:
+
+- `$start`, an instance of `FFMpeg\Coordinate\TimeCode`, specifies the start point of the clip
+- `$duration`, optional, an instance of `FFMpeg\Coordinate\TimeCode`, specifies the duration of the clip
+
+On clip you can apply same filters as on video. For example resizing filter.
+
+```php
+$clip = $video->clip(FFMpeg\Coordinate\TimeCode::fromSeconds(30), FFMpeg\Coordinate\TimeCode::fromSeconds(15));
+$clip->filters()->resize(new FFMpeg\Coordinate\Dimension(320, 240), FFMpeg\Filters\Video\ResizeFilter::RESIZEMODE_INSET, true);
+$clip->save(new FFMpeg\Format\Video\X264(), 'video.avi');
+```
+
+##### Generate a waveform
+
+You can generate a waveform of an audio file using the `FFMpeg\Media\Audio::waveform`
+method.
+
+This code returns a `FFMpeg\Media\Waveform` instance.
+You can optionally pass dimensions as the first two arguments and an array of hex string colors for ffmpeg to use for the waveform, see dedicated
+documentation below for more information.
+
+The output file MUST use the PNG extension.
+
+```php
+$waveform = $audio->waveform(640, 120, array('#00FF00'));
+$waveform->save('waveform.png');
+```
+
+If you want to get a waveform from a video, convert it in an audio file first.
+
+```php
+// Open your video file
+$video = $ffmpeg->open( 'video.mp4' );
+
+// Set an audio format
+$audio_format = new FFMpeg\Format\Audio\Mp3();
+
+// Extract the audio into a new file as mp3
+$video->save($audio_format, 'audio.mp3');
+
+// Set the audio file
+$audio = $ffmpeg->open( 'audio.mp3' );
+
+// Create the waveform
+$waveform = $audio->waveform();
+$waveform->save( 'waveform.png' );
+```
+
+##### Filters
+
+You can apply filters on `FFMpeg\Media\Video` with the `FFMpeg\Media\Video::addFilter`
+method. Video accepts Audio and Video filters.
+
+You can build your own filters and some are bundled in PHP-FFMpeg - they are
+accessible through the `FFMpeg\Media\Video::filters` method.
+
+Filters are chainable
+
+```php
+$video
+    ->filters()
+    ->resize($dimension, $mode, $useStandards)
+    ->framerate($framerate, $gop)
+    ->synchronize();
+```
+
+###### Rotate
+
+Rotates a video to a given angle.
+
+```php
+$video->filters()->rotate($angle);
+```
+
+The `$angle` parameter must be one of the following constants :
+
+- `FFMpeg\Filters\Video\RotateFilter::ROTATE_90`: 90° clockwise
+- `FFMpeg\Filters\Video\RotateFilter::ROTATE_180`: 180°
+- `FFMpeg\Filters\Video\RotateFilter::ROTATE_270`: 90° counterclockwise
+
+###### Resize
+
+Resizes a video to a given size.
+
+```php
+$video->filters()->resize($dimension, $mode, $useStandards);
+```
+
+The resize filter takes three parameters:
+
+- `$dimension`, an instance of `FFMpeg\Coordinate\Dimension`
+- `$mode`, one of the constants `FFMpeg\Filters\Video\ResizeFilter::RESIZEMODE_*` constants
+- `$useStandards`, a boolean to force the use of the nearest aspect ratio standard.
+
+If you want a video in a non-standard ratio, you can use the padding filter to resize your video in the desired size, and wrap it into black bars.
+
+```php
+$video->filters()->pad($dimension);
+```
+
+The pad filter takes one parameter:
+
+- `$dimension`, an instance of `FFMpeg\Coordinate\Dimension`
+
+Don't forget to save it afterwards.
+
+```php
+$video->save(new FFMpeg\Format\Video\X264(), $new_file);
+```
+
+###### Watermark
+
+Watermark a video with a given image.
+
+```php
+$video
+    ->filters()
+    ->watermark($watermarkPath, array(
+        'position' => 'relative',
+        'bottom' => 50,
+        'right' => 50,
+    ));
+```
+
+The watermark filter takes two parameters:
+
+`$watermarkPath`, the path to your watermark file.
+`$coordinates`, an array defining how you want your watermark positioned. You can use relative positioning as demonstrated above or absolute as such:
+
+```php
+$video
+    ->filters()
+    ->watermark($watermarkPath, array(
+        'position' => 'absolute',
+        'x' => 1180,
+        'y' => 620,
+    ));
+```
+
+###### Framerate
+
+Changes the frame rate of the video.
+
+```php
+$video->filters()->framerate($framerate, $gop);
+```
+
+The framerate filter takes two parameters:
+
+- `$framerate`, an instance of `FFMpeg\Coordinate\Framerate`
+- `$gop`, a [GOP](https://wikipedia.org/wiki/Group_of_pictures) value (integer)
+
+###### Synchronize
+
+Synchronizes audio and video.
+
+Some containers may use a delay that results in desynchronized outputs. This
+filter solves this issue.
+
+```php
+$video->filters()->synchronize();
+```
+
+###### Clip
+
+Cuts the video at a desired point.
+
+```php
+$video->filters()->clip(FFMpeg\Coordinate\TimeCode::fromSeconds(30), FFMpeg\Coordinate\TimeCode::fromSeconds(15));
+```
+
+The clip filter takes two parameters:
+
+- `$start`, an instance of `FFMpeg\Coordinate\TimeCode`, specifies the start point of the clip
+- `$duration`, optional, an instance of `FFMpeg\Coordinate\TimeCode`, specifies the duration of the clip
+
+###### Crop
+
+Crops the video based on a width and height(a `Point`)
+
+```php
+$video->filters()->crop(new FFMpeg\Coordinate\Point("t*100", 0, true), new FFMpeg\Coordinate\Dimension(200, 600));
+```
+
+It takes two parameters:
+- `$point`, an instance of `FFMpeg\Coordinate\Point`, specifies the point to crop
+- `$dimension`, an instance of `FFMpeg\Coordinate\Dimension`, specifies the dimension of the output video
+
+### Audio
+
+`FFMpeg\Media\Audio` can be transcoded too, ie: change codec, isolate audio or
+video. Frames can be extracted.
+
+##### Transcoding
+
+You can transcode audios using the `FFMpeg\Media\Audio:save` method. You will
+pass a `FFMpeg\Format\FormatInterface` for that.
+
+Please note that audio kilobitrate is set on the audio format.
+
+```php
+$ffmpeg = FFMpeg\FFMpeg::create();
+$audio = $ffmpeg->open('track.mp3');
+
+$format = new FFMpeg\Format\Audio\Flac();
+$format->on('progress', function ($audio, $format, $percentage) {
+    echo "$percentage % transcoded";
+});
+
+$format
+    ->setAudioChannels(2)
+    ->setAudioKiloBitrate(256);
+
+$audio->save($format, 'track.flac');
+```
+
+Transcoding progress can be monitored in realtime, see Format documentation
+below for more information.
+
+##### Filters
+
+You can apply filters on `FFMpeg\Media\Audio` with the `FFMpeg\Media\Audio::addFilter`
+method. It only accepts audio filters.
+
+You can build your own filters and some are bundled in PHP-FFMpeg - they are
+accessible through the `FFMpeg\Media\Audio::filters` method.
+
+##### Clipping
+Cuts the audio at a desired point.
+
+```php
+$audio->filters()->clip(FFMpeg\Coordinate\TimeCode::fromSeconds(30), FFMpeg\Coordinate\TimeCode::fromSeconds(15));
+```
+
+
+###### Metadata
+
+Add metadata to audio files. Just pass an array of key=value pairs of all
+metadata you would like to add. If no arguments are passed into the filter
+all metadata will be removed from input file. Currently supported data is
+title, artist, album, artist, composer, track, year, description, artwork
+
+```php
+$audio->filters()->addMetadata(["title" => "Some Title", "track" => 1]);
+
+//remove all metadata and video streams from audio file
+$audio->filters()->addMetadata();
+```
+
+Add artwork to the audio file
+```php
+$audio->filters()->addMetadata(["artwork" => "/path/to/image/file.jpg"]);
+```
+NOTE: at present ffmpeg (version 3.2.2) only supports artwork output for .mp3
+files
+
+###### Resample
+
+Resamples an audio file.
+
+```php
+$audio->filters()->resample($rate);
+```
+
+The resample filter takes two parameters :
+
+- `$rate`, a valid audio sample rate value (integer)
+
+#### Frame
+
+A frame is an image at a timecode of a video; see documentation above about
+frame extraction.
+
+You can save frames using the `FFMpeg\Media\Frame::save` method.
+
+```php
+$frame->save('target.jpg');
+```
+
+This method has a second optional boolean parameter. Set it to true to get
+accurate images; it takes more time to execute.
+
+#### Gif
+
+A gif is an animated image extracted from a sequence of the video.
+
+You can save gif files using the `FFMpeg\Media\Gif::save` method.
+
+```php
+$video = $ffmpeg->open( '/path/to/video' );
+$video
+    ->gif(FFMpeg\Coordinate\TimeCode::fromSeconds(2), new FFMpeg\Coordinate\Dimension(640, 480), 3)
+    ->save($new_file);
+```
+
+This method has a third optional boolean parameter, which is the duration of the animation.
+If you don't set it, you will get a fixed gif image.
+
+#### Concatenation
+
+This feature allows you to generate one audio or video file, based on multiple sources.
+
+There are two ways to concatenate videos, depending on the codecs of the sources.
+If your sources have all been encoded with the same codec, you will want to use the `FFMpeg\Media\Concatenate::saveFromSameCodecs` which has way better performances.
+If your sources have been encoded with different codecs, you will want to use the `FFMpeg\Media\Concatenate::saveFromDifferentCodecs`.
+
+The first function will use the initial codec as the one for the generated file.
+With the second function, you will be able to choose which codec you want for the generated file.
+
+You also need to pay attention to the fact that, when using the saveFromDifferentCodecs method,
+your files MUST have video and audio streams.
+
+In both cases, you will have to provide an array of files.
+
+To concatenate videos encoded with the same codec, do as follow:
+
+```php
+// In order to instantiate the video object, you HAVE TO pass a path to a valid video file.
+// We recommend that you put there the path of any of the video you want to use in this concatenation.
+$video = $ffmpeg->open( '/path/to/video' );
+$video
+    ->concat(array('/path/to/video1', '/path/to/video2'))
+    ->saveFromSameCodecs('/path/to/new_file', TRUE);
+```
+
+The boolean parameter of the save function allows you to use the copy parameter which accelerates drastically the generation of the encoded file.
+
+To concatenate videos encoded with the same codec, do as follow:
+
+```php
+// In order to instantiate the video object, you HAVE TO pass a path to a valid video file.
+// We recommend that you put there the path of any of the video you want to use in this concatenation.
+$video = $ffmpeg->open( '/path/to/video' );
+
+$format = new FFMpeg\Format\Video\X264();
+$format->setAudioCodec("libmp3lame");
+
+$video
+    ->concat(array('/path/to/video1', '/path/to/video2'))
+    ->saveFromDifferentCodecs($format, '/path/to/new_file');
+```
+
+More details about concatenation in FFMPEG can be found [here](https://trac.ffmpeg.org/wiki/Concatenate), [here](https://ffmpeg.org/ffmpeg-formats.html#concat-1) and [here](https://ffmpeg.org/ffmpeg.html#Stream-copy).
+
+### AdvancedMedia
+AdvancedMedia may have multiple inputs and multiple outputs.
+
+This class has been developed primarily to use with `-filter_complex`.
+
+So, its `filters()` method accepts only filters that can be used inside `-filter_complex` command.
+AdvancedMedia already contains some built-in filters.
+
+#### Base usage
+For example:
+
+```php
+$advancedMedia = $ffmpeg->openAdvanced(array('video_1.mp4', 'video_2.mp4'));
+$advancedMedia->filters()
+    ->custom('[0:v][1:v]', 'hstack', '[v]');
+$advancedMedia
+    ->map(array('0:a', '[v]'), new X264('aac', 'libx264'), 'output.mp4')
+    ->save();
+```
+
+This code takes 2 input videos, stacks they horizontally in 1 output video and adds to this new video the audio from the first video.
+(It is impossible with simple filtergraph that has only 1 input and only 1 output).
+
+
+#### Complicated example
+A more difficult example of possibilities of the AdvancedMedia. Consider all input videos already have the same resolution and duration. ("xstack" filter has been added in the 4.1 version of the ffmpeg).
+
+```php
+$inputs = array(
+    'video_1.mp4',
+    'video_2.mp4',
+    'video_3.mp4',
+    'video_4.mp4',
+);
+
+$advancedMedia = $ffmpeg->openAdvanced($inputs);
+$advancedMedia->filters()
+    ->custom('[0:v]', 'negate', '[v0negate]')
+    ->custom('[1:v]', 'edgedetect', '[v1edgedetect]')
+    ->custom('[2:v]', 'hflip', '[v2hflip]')
+    ->custom('[3:v]', 'vflip', '[v3vflip]')
+    ->xStack('[v0negate][v1edgedetect][v2hflip][v3vflip]', XStackFilter::LAYOUT_2X2, 4, '[resultv]');
+$advancedMedia
+    ->map(array('0:a'), new Mp3(), 'video_1.mp3')
+    ->map(array('1:a'), new Flac(), 'video_2.flac')
+    ->map(array('2:a'), new Wav(), 'video_3.wav')
+    ->map(array('3:a'), new Aac(), 'video_4.aac')
+    ->map(array('[resultv]'), new X264('aac', 'libx264'), 'output.mp4')
+    ->save();
+```
+
+This code takes 4 input videos, then the negates the first video, stores result in `[v0negate]` stream, detects edges in the second video, stores result in `[v1edgedetect]` stream, horizontally flips the third video, stores result in `[v2hflip]` stream, vertically flips the fourth video, stores result in `[v3vflip]` stream, then takes this 4 generated streams ans combine them in one 2x2 collage video.
+Then saves audios from the original videos into the 4 different formats and saves the generated collage video into the separate file.
+
+As you can see, you can take multiple input sources, perform the complicated processing for them and produce multiple output files in the same time, in the one ffmpeg command.
+
+#### Just give me a map!
+You do not have to use `-filter_complex`. You can use only `-map` options. For example, just extract the audio from the video:
+
+```php
+$advancedMedia = $ffmpeg->openAdvanced(array('video.mp4'));
+$advancedMedia
+    ->map(array('0:a'), new Mp3(), 'output.mp3')
+    ->save();
+```
+
+#### Customisation
+If you need you can extra customize the result ffmpeg command of the AdvancedMedia:
+
+```php
+$advancedMedia = $ffmpeg->openAdvanced($inputs);
+$advancedMedia
+    ->setInitialParameters(array('the', 'params', 'that', 'will', 'be', 'added', 'before', '-i', 'part', 'of', 'the', 'command'))
+    ->setAdditionalParameters(array('the', 'params', 'that', 'will', 'be', 'added', 'at', 'the', 'end', 'of', 'the', 'command'));
+```
+
+#### Formats
+
+A format implements `FFMpeg\Format\FormatInterface`. To save to a video file,
+use `FFMpeg\Format\VideoInterface`, and `FFMpeg\Format\AudioInterface` for
+audio files.
+
+A format can also extend `FFMpeg\Format\ProgressableInterface` to get realtime
+information about the transcoding.
+
+Predefined formats already provide progress information as events.
+
+```php
+$format = new FFMpeg\Format\Video\X264();
+$format->on('progress', function ($video, $format, $percentage) {
+    echo "$percentage % transcoded";
+});
+
+$video->save($format, 'video.avi');
+```
+
+The callback provided for the event can be any callable.
+
+##### Add additional parameters
+
+You can add additional parameters to your encoding requests based on your video format.
+
+The argument of the setAdditionalParameters method is an array.
+
+```php
+$format = new FFMpeg\Format\Video\X264();
+$format->setAdditionalParameters(array('foo', 'bar'));
+$video->save($format, 'video.avi');
+```
+
+##### Add initial parameters
+
+You can also add initial parameters to your encoding requests based on your video format. This can be expecially handy in overriding a default input codec in FFMpeg.
+
+The argument of the setInitialParameters method is an array.
+
+```php
+$format = new FFMpeg\Format\Video\X264();
+$format->setInitialParameters(array('-acodec', 'libopus'));
+$video->save($format, 'video.avi');
+```
+
+##### Create your own format
+
+The easiest way to create a format is to extend the abstract
+`FFMpeg\Format\Video\DefaultVideo` and `FFMpeg\Format\Audio\DefaultAudio`.
+and implement the following methods.
+
+```php
+class CustomWMVFormat extends FFMpeg\Format\Video\DefaultVideo
+{
+    public function __construct($audioCodec = 'wmav2', $videoCodec = 'wmv2')
+    {
+        $this
+            ->setAudioCodec($audioCodec)
+            ->setVideoCodec($videoCodec);
+    }
+
+    public function supportBFrames()
+    {
+        return false;
+    }
+
+    public function getAvailableAudioCodecs()
+    {
+        return array('wmav2');
+    }
+
+    public function getAvailableVideoCodecs()
+    {
+        return array('wmv2');
+    }
+}
+```
+
+#### Coordinates
+
+FFMpeg uses many units for time and space coordinates.
+
+- `FFMpeg\Coordinate\AspectRatio` represents an aspect ratio.
+- `FFMpeg\Coordinate\Dimension` represent a dimension.
+- `FFMpeg\Coordinate\FrameRate` represent a framerate.
+- `FFMpeg\Coordinate\Point` represent a point. (Supports dynamic points since v0.10.0)
+- `FFMpeg\Coordinate\TimeCode` represent a timecode.
+
+### FFProbe
+
+`FFMpeg\FFProbe` is used internally by `FFMpeg\FFMpeg` to probe medias. You can
+also use it to extract media metadata.
+
+```php
+$ffprobe = FFMpeg\FFProbe::create();
+$ffprobe
+    ->streams('/path/to/video/mp4') // extracts streams informations
+    ->videos()                      // filters video streams
+    ->first()                       // returns the first video stream
+    ->get('codec_name');            // returns the codec_name property
+```
+
+```php
+$ffprobe = FFMpeg\FFProbe::create();
+$ffprobe
+    ->format('/path/to/video/mp4') // extracts file informations
+    ->get('duration');             // returns the duration property
+```
+
+### Validating media files
+
+(since 0.10.0)
+You can validate media files using PHP-FFMpeg's FFProbe wrapper.
+
+```php
+$ffprobe = FFMpeg\FFProbe::create();
+$ffprobe->isValid('/path/to/file/to/check'); // returns bool
+```
+
+## Using with Silex Microframework
+
+The service provider is easy to set up:
+
+```php
+$app = new Silex\Application();
+$app->register(new FFMpeg\FFMpegServiceProvider());
+
+$video = $app['ffmpeg']->open('video.mpeg');
+```
+
+Available options are as follow:
+
+```php
+$app->register(new FFMpeg\FFMpegServiceProvider(), array(
+    'ffmpeg.configuration' => array(
+        'ffmpeg.threads'   => 4,
+        'ffmpeg.timeout'   => 300,
+        'ffmpeg.binaries'  => '/opt/local/ffmpeg/bin/ffmpeg',
+        'ffprobe.timeout'  => 30,
+        'ffprobe.binaries' => '/opt/local/ffmpeg/bin/ffprobe',
+    ),
+    'ffmpeg.logger' => $logger,
+));
+```
+
+## License
+
+This project is licensed under the [MIT license](http://opensource.org/licenses/MIT).
+
+Music: "Favorite Secrets" by Waylon Thornton
+From the Free Music Archive
+[CC BY NC SA](http://creativecommons.org/licenses/by-nc-sa/3.0/us/)
+
+Music: "Siesta" by Jahzzar
+From the Free Music Archive
+[CC BY SA](https://creativecommons.org/licenses/by-sa/3.0/)
diff --git a/vendor/php-ffmpeg/php-ffmpeg/composer.json b/vendor/php-ffmpeg/php-ffmpeg/composer.json
new file mode 100644
index 0000000000..fda1beb920
--- /dev/null
+++ b/vendor/php-ffmpeg/php-ffmpeg/composer.json
@@ -0,0 +1,64 @@
+{
+    "name": "php-ffmpeg/php-ffmpeg",
+    "type": "library",
+    "description": "FFMpeg PHP, an Object Oriented library to communicate with AVconv / ffmpeg",
+    "keywords": ["video processing", "video", "audio processing", "audio", "avconv", "ffmpeg", "avprobe", "ffprobe"],
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Romain Neutron",
+            "email": "imprec@gmail.com",
+            "homepage": "http://www.lickmychip.com/"
+        },
+        {
+            "name": "Phraseanet Team",
+            "email": "info@alchemy.fr",
+            "homepage": "http://www.phraseanet.com/"
+        },
+        {
+            "name": "Patrik Karisch",
+            "email": "patrik@karisch.guru",
+            "homepage": "http://www.karisch.guru"
+        },
+        {
+            "name": "Romain Biard",
+            "email": "romain.biard@gmail.com",
+            "homepage": "https://www.strime.io/"
+        },
+        {
+            "name": "Jens Hausdorf",
+            "email": "hello@jens-hausdorf.de",
+            "homepage": "https://jens-hausdorf.de"
+        }
+    ],
+    "require": {
+        "php": "^5.3.9 || ^7.0",
+        "alchemy/binary-driver": "^1.5 || ~2.0.0 || ^5.0",
+        "doctrine/cache": "^1.0",
+        "evenement/evenement": "^3.0 || ^2.0 || ^1.0",
+        "neutron/temporary-filesystem": "^2.1.1"
+    },
+    "suggest": {
+        "php-ffmpeg/extras": "A compilation of common audio & video drivers for PHP-FFMpeg"
+    },
+    "require-dev": {
+        "sami/sami": "~1.0",
+        "silex/silex": "~1.0",
+        "symfony/phpunit-bridge": "^5.0.4"
+    },
+    "autoload": {
+        "psr-0": {
+            "FFMpeg": "src"
+        }
+    },
+    "autoload-dev": {
+        "psr-4": {
+            "Tests\\FFMpeg\\": "tests"
+        }
+    },
+    "extra": {
+        "branch-alias": {
+            "dev-master": "0.7-dev"
+        }
+    }
+}
diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg.html
new file mode 100644
index 0000000000..30b55e42b9
--- /dev/null
+++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg.html
@@ -0,0 +1,50 @@
+
+
+    
+        
+        
+        FFMpeg | PHP-FFMpeg API
+                    
+                            
+        
+            
+ + +
PHP-FFMpeg API
+ +
Namespace
+

FFMpeg

+
+
+ + + + + + + + + + + + + +
FFMpeg +
FFMpegServiceProvider +
FFProbe +
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Coordinate.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Coordinate.html new file mode 100644 index 0000000000..a26339fd23 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Coordinate.html @@ -0,0 +1,59 @@ + + + + + + FFMpeg\Coordinate | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Namespace
+

FFMpeg\Coordinate

+
+
+ + + + + + + + + + + + + + + + + + + + + +
AspectRatio +
DimensionDimension object, used for manipulating width and height couples
FrameRate +
Point +
TimeCode +
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Coordinate/AspectRatio.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Coordinate/AspectRatio.html new file mode 100644 index 0000000000..732fcdb633 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Coordinate/AspectRatio.html @@ -0,0 +1,429 @@ + + + + + + FFMpeg\Coordinate\AspectRatio | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Coordinate\AspectRatio

+
+
+

class + AspectRatio

+ + +

Constants

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AR_4_3 +

+

+

+

+
AR_16_9 +

+

+

+

+
AR_3_2 +

+

+

+

+
AR_5_3 +

+

+

+

+
AR_5_4 +

+

+

+

+
AR_1_1 +

+

+

+

+
AR_1_DOT_85_1 +

+

+

+

+
AR_2_DOT_39_1 +

+

+

+

+
AR_ROTATED_3_4 +

+

+

+

+
AR_ROTATED_9_16 +

+

+

+

+
AR_ROTATED_2_3 +

+

+

+

+
AR_ROTATED_3_5 +

+

+

+

+
AR_ROTATED_4_5 +

+

+

+

+
AR_ROTATED_1_DOT_85 +

+

+

+

+
AR_ROTATED_2_DOT_39 +

+

+

+

+
+ + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + __construct($ratio) +

+

+
+ float + + getValue() +

Returns the value of the ratio.

+
+ Integer + + calculateWidth(Integer $height, Integer $modulus = 1) +

Computes the best width for given height and modulus.

+
+ Integer + + calculateHeight(Integer $width, Integer $modulus = 1) +

Computes the best height for given width and modulus.

+
+ static AspectRatio + + create(Dimension $dimension, Boolean $forceStandards = true) +

Creates a ratio based on Dimension.

+
+ + +

Details

+ +

+
at line 61
+ public + __construct($ratio) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
$ratio +
+ + + + +
+
+ +

+
at line 71
+ public float + getValue() +

+
+

Returns the value of the ratio.

+

+

+
+ +

Return Value

+ + + + + + +
float +
+ + + +
+
+ +

+
at line 84
+ public Integer + calculateWidth(Integer $height, Integer $modulus = 1) +

+
+

Computes the best width for given height and modulus.

+

+

+
+

Parameters

+ + + + + + + + + + + + +
Integer$height +
Integer$modulus +
+ + +

Return Value

+ + + + + + +
Integer +
+ + + +
+
+ +

+
at line 103
+ public Integer + calculateHeight(Integer $width, Integer $modulus = 1) +

+
+

Computes the best height for given width and modulus.

+

+

+
+

Parameters

+ + + + + + + + + + + + +
Integer$width +
Integer$modulus +
+ + +

Return Value

+ + + + + + +
Integer +
+ + + +
+
+ +

+
at line 145
+ static public AspectRatio + create(Dimension $dimension, Boolean $forceStandards = true) +

+
+

Creates a ratio based on Dimension.

+

The strategy parameter forces by default to use standardized ratios. If +custom ratio need to be used, disable it.

+
+

Parameters

+ + + + + + + + + + + + +
Dimension$dimension +
Boolean$forceStandardsWhether to force or not standard ratios
+ + +

Return Value

+ + + + + + +
AspectRatio +
+ + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Coordinate/Dimension.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Coordinate/Dimension.html new file mode 100644 index 0000000000..ec52751c08 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Coordinate/Dimension.html @@ -0,0 +1,223 @@ + + + + + + FFMpeg\Coordinate\Dimension | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Coordinate\Dimension

+
+
+

class + Dimension

+ +
+

Dimension object, used for manipulating width and height couples

+

+

+
+ + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + +
+ + + __construct(integer $width, integer $height) +

+

+
+ integer + + getWidth() +

Returns width.

+
+ integer + + getHeight() +

Returns height.

+
+ AspectRatio + + getRatio(type $forceStandards = true) +

Returns the ratio.

+
+ + +

Details

+ +

+
at line 30
+ public + __construct(integer $width, integer $height) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + + + + + + +
integer$width +
integer$height +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentExceptionwhen one of the parameteres is invalid
+ + +
+
+ +

+
at line 45
+ public integer + getWidth() +

+
+

Returns width.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
at line 55
+ public integer + getHeight() +

+
+

Returns height.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
at line 67
+ public AspectRatio + getRatio(type $forceStandards = true) +

+
+

Returns the ratio.

+

+

+
+

Parameters

+ + + + + + + +
type$forceStandardsWhether or not force the use of standards ratios;
+ + +

Return Value

+ + + + + + +
AspectRatio +
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Coordinate/FrameRate.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Coordinate/FrameRate.html new file mode 100644 index 0000000000..ac9462aba9 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Coordinate/FrameRate.html @@ -0,0 +1,123 @@ + + + + + + FFMpeg\Coordinate\FrameRate | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Coordinate\FrameRate

+
+
+

class + FrameRate

+ + + + +

Methods

+ + + + + + + + + + + + +
+ + + __construct($value) +

+

+
+ float + + getValue() +

+

+
+ + +

Details

+ +

+
at line 20
+ public + __construct($value) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
$value +
+ + + + +
+
+ +

+
at line 32
+ public float + getValue() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
float +
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Coordinate/Point.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Coordinate/Point.html new file mode 100644 index 0000000000..b908c58630 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Coordinate/Point.html @@ -0,0 +1,167 @@ + + + + + + FFMpeg\Coordinate\Point | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Coordinate\Point

+
+
+

class + Point

+ + + + +

Methods

+ + + + + + + + + + + + + + + + + +
+ + + __construct($x, $y) +

+

+
+ integer + + getX() +

+

+
+ integer + + getY() +

+

+
+ + +

Details

+ +

+
at line 19
+ public + __construct($x, $y) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + + + + + + +
$x +
$y +
+ + + + +
+
+ +

+
at line 28
+ public integer + getX() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
at line 36
+ public integer + getY() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Coordinate/TimeCode.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Coordinate/TimeCode.html new file mode 100644 index 0000000000..e33e5dc74d --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Coordinate/TimeCode.html @@ -0,0 +1,234 @@ + + + + + + FFMpeg\Coordinate\TimeCode | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Coordinate\TimeCode

+
+
+

class + TimeCode

+ + + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + +
+ + + __construct($hours, $minutes, $seconds, $frames) +

+

+
+ + + __toString() +

+

+
+ static TimeCode + + fromString(string $timecode) +

Creates timecode from string.

+
+ static TimeCode + + fromSeconds(float $quantity) +

Creates timecode from number of seconds.

+
+ + +

Details

+ +

+
at line 24
+ public + __construct($hours, $minutes, $seconds, $frames) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + +
$hours +
$minutes +
$seconds +
$frames +
+ + + + +
+
+ +

+
at line 32
+ public + __toString() +

+
+

+

+

+

+
+ + + +
+
+ +

+
at line 46
+ static public TimeCode + fromString(string $timecode) +

+
+

Creates timecode from string.

+

+

+
+

Parameters

+ + + + + + + +
string$timecode +
+ + +

Return Value

+ + + + + + +
TimeCode +
+ + +

Exceptions

+ + + + + + +
InvalidArgumentExceptionIn case an invalid timecode is supplied
+ + +
+
+ +

+
at line 74
+ static public TimeCode + fromSeconds(float $quantity) +

+
+

Creates timecode from number of seconds.

+

+

+
+

Parameters

+ + + + + + + +
float$quantity +
+ + +

Return Value

+ + + + + + +
TimeCode +
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Coordinate/namespace-frame.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Coordinate/namespace-frame.html new file mode 100644 index 0000000000..c5257cfce5 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Coordinate/namespace-frame.html @@ -0,0 +1,9 @@ + + + + + + FFMpeg\Coordinate | PHP-FFMpeg API + + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Driver.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Driver.html new file mode 100644 index 0000000000..08ade388c2 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Driver.html @@ -0,0 +1,45 @@ + + + + + + FFMpeg\Driver | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Namespace
+

FFMpeg\Driver

+
+
+ + + + + + + + + +
FFMpegDriver +
FFProbeDriver +
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Driver/FFMpegDriver.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Driver/FFMpegDriver.html new file mode 100644 index 0000000000..16e8d491f4 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Driver/FFMpegDriver.html @@ -0,0 +1,125 @@ + + + + + + FFMpeg\Driver\FFMpegDriver | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Driver\FFMpegDriver

+
+
+

class + FFMpegDriver extends AbstractBinary

+ + + + +

Methods

+ + + + + + + + + + + + +
+ + + getName() +

{@inheritdoc}

+
+ static FFMpegDriver + + create(LoggerInterface $logger = null, array|Configuration $configuration = array()) +

Creates an FFMpegDriver.

+
+ + +

Details

+ +

+
at line 26
+ public + getName() +

+
+

{@inheritdoc}

+

+

+
+ + + +
+
+ +

+
at line 39
+ static public FFMpegDriver + create(LoggerInterface $logger = null, array|Configuration $configuration = array()) +

+
+

Creates an FFMpegDriver.

+

+

+
+

Parameters

+ + + + + + + + + + + + +
LoggerInterface$logger +
array|Configuration$configuration +
+ + +

Return Value

+ + + + + + +
FFMpegDriver +
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Driver/FFProbeDriver.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Driver/FFProbeDriver.html new file mode 100644 index 0000000000..53b119d190 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Driver/FFProbeDriver.html @@ -0,0 +1,125 @@ + + + + + + FFMpeg\Driver\FFProbeDriver | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Driver\FFProbeDriver

+
+
+

class + FFProbeDriver extends AbstractBinary

+ + + + +

Methods

+ + + + + + + + + + + + +
+ + + getName() +

{@inheritdoc}

+
+ static FFProbeDriver + + create(array|ConfigurationInterface $configuration, LoggerInterface $logger = null) +

Creates an FFProbeDriver.

+
+ + +

Details

+ +

+
at line 26
+ public + getName() +

+
+

{@inheritdoc}

+

+

+
+ + + +
+
+ +

+
at line 39
+ static public FFProbeDriver + create(array|ConfigurationInterface $configuration, LoggerInterface $logger = null) +

+
+

Creates an FFProbeDriver.

+

+

+
+

Parameters

+ + + + + + + + + + + + +
array|ConfigurationInterface$configuration +
LoggerInterface$logger +
+ + +

Return Value

+ + + + + + +
FFProbeDriver +
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Driver/namespace-frame.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Driver/namespace-frame.html new file mode 100644 index 0000000000..e4fff56b40 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Driver/namespace-frame.html @@ -0,0 +1,9 @@ + + + + + + FFMpeg\Driver | PHP-FFMpeg API + + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Exception.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Exception.html new file mode 100644 index 0000000000..2746cb03c0 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Exception.html @@ -0,0 +1,63 @@ + + + + + + FFMpeg\Exception | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Namespace
+

FFMpeg\Exception

+
+
+ + + + + + + + + + + + + + + + + +
ExecutableNotFoundException +
InvalidArgumentException +
LogicException +
RuntimeException +
+ +

Interfaces

+ + + + + +
ExceptionInterface +
+ +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Exception/ExceptionInterface.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Exception/ExceptionInterface.html new file mode 100644 index 0000000000..28f825be9a --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Exception/ExceptionInterface.html @@ -0,0 +1,37 @@ + + + + + + FFMpeg\Exception\ExceptionInterface | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Interface
+

FFMpeg\Exception\ExceptionInterface

+
+
+

interface + ExceptionInterface

+ + + + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Exception/ExecutableNotFoundException.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Exception/ExecutableNotFoundException.html new file mode 100644 index 0000000000..0dd5663a67 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Exception/ExecutableNotFoundException.html @@ -0,0 +1,37 @@ + + + + + + FFMpeg\Exception\ExecutableNotFoundException | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Exception\ExecutableNotFoundException

+
+
+

class + ExecutableNotFoundException extends RuntimeException

+ + + + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Exception/InvalidArgumentException.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Exception/InvalidArgumentException.html new file mode 100644 index 0000000000..a3b027952c --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Exception/InvalidArgumentException.html @@ -0,0 +1,38 @@ + + + + + + FFMpeg\Exception\InvalidArgumentException | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Exception\InvalidArgumentException

+
+
+

class + InvalidArgumentException extends InvalidArgumentException implements + ExceptionInterface

+ + + + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Exception/LogicException.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Exception/LogicException.html new file mode 100644 index 0000000000..7d310cac3c --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Exception/LogicException.html @@ -0,0 +1,38 @@ + + + + + + FFMpeg\Exception\LogicException | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Exception\LogicException

+
+
+

class + LogicException extends LogicException implements + ExceptionInterface

+ + + + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Exception/RuntimeException.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Exception/RuntimeException.html new file mode 100644 index 0000000000..ef0bcd5b66 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Exception/RuntimeException.html @@ -0,0 +1,38 @@ + + + + + + FFMpeg\Exception\RuntimeException | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Exception\RuntimeException

+
+
+

class + RuntimeException extends RuntimeException implements + ExceptionInterface

+ + + + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Exception/namespace-frame.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Exception/namespace-frame.html new file mode 100644 index 0000000000..c9102a87f3 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Exception/namespace-frame.html @@ -0,0 +1,9 @@ + + + + + + FFMpeg\Exception | PHP-FFMpeg API + + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFMpeg.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFMpeg.html new file mode 100644 index 0000000000..a101240b74 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFMpeg.html @@ -0,0 +1,372 @@ + + + + + + FFMpeg\FFMpeg | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\FFMpeg

+
+
+

class + FFMpeg

+ + + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + __construct(FFMpegDriver $ffmpeg, FFProbe $ffprobe) +

+

+
+ FFMpeg + + setFFProbe(FFProbe $ffprobe) +

Sets FFProbe.

+
+ FFProbe + + getFFProbe() +

Gets FFProbe.

+
+ FFMpeg + + setFFMpegDriver(FFMpegDriver $ffmpeg) +

Sets the ffmpeg driver.

+
+ FFMpegDriver + + getFFMpegDriver() +

Gets the ffmpeg driver.

+
+ Audio|Video + + open(string $pathfile) +

Opens a file in order to be processed.

+
+ static FFMpeg + + create(array|ConfigurationInterface $configuration = array(), LoggerInterface $logger = null, FFProbe $probe = null) +

Creates a new FFMpeg instance.

+
+ + +

Details

+ +

+
at line 29
+ public + __construct(FFMpegDriver $ffmpeg, FFProbe $ffprobe) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + + + + + + +
FFMpegDriver$ffmpeg +
FFProbe$ffprobe +
+ + + + +
+
+ +

+
at line 42
+ public FFMpeg + setFFProbe(FFProbe $ffprobe) +

+
+

Sets FFProbe.

+

+

+
+

Parameters

+ + + + + + + +
FFProbe$ffprobe +
+ + +

Return Value

+ + + + + + +
FFMpeg +
+ + + +
+
+ +

+
at line 54
+ public FFProbe + getFFProbe() +

+
+

Gets FFProbe.

+

+

+
+ +

Return Value

+ + + + + + +
FFProbe +
+ + + +
+
+ +

+
at line 64
+ public FFMpeg + setFFMpegDriver(FFMpegDriver $ffmpeg) +

+
+

Sets the ffmpeg driver.

+

+

+
+

Parameters

+ + + + + + + +
FFMpegDriver$ffmpeg +
+ + +

Return Value

+ + + + + + +
FFMpeg +
+ + + +
+
+ +

+
at line 76
+ public FFMpegDriver + getFFMpegDriver() +

+
+

Gets the ffmpeg driver.

+

+

+
+ +

Return Value

+ + + + + + +
FFMpegDriver +
+ + + +
+
+ +

+
at line 90
+ public Audio|Video + open(string $pathfile) +

+
+

Opens a file in order to be processed.

+

+

+
+

Parameters

+ + + + + + + +
string$pathfileA pathfile
+ + +

Return Value

+ + + + + + +
Audio|Video +
+ + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
at line 114
+ static public FFMpeg + create(array|ConfigurationInterface $configuration = array(), LoggerInterface $logger = null, FFProbe $probe = null) +

+
+

Creates a new FFMpeg instance.

+

+

+
+

Parameters

+ + + + + + + + + + + + + + + + + +
array|ConfigurationInterface$configuration +
LoggerInterface$logger +
FFProbe$probe +
+ + +

Return Value

+ + + + + + +
FFMpeg +
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFMpegServiceProvider.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFMpegServiceProvider.html new file mode 100644 index 0000000000..dc3623d85e --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFMpegServiceProvider.html @@ -0,0 +1,125 @@ + + + + + + FFMpeg\FFMpegServiceProvider | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\FFMpegServiceProvider

+
+
+

class + FFMpegServiceProvider implements + ServiceProviderInterface

+ + + + +

Methods

+ + + + + + + + + + + + +
+ + + register(Application $app) +

+

+
+ + + boot(Application $app) +

+

+
+ + +

Details

+ +

+
at line 20
+ public + register(Application $app) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
Application$app +
+ + + + +
+
+ +

+
at line 61
+ public + boot(Application $app) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
Application$app +
+ + + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe.html new file mode 100644 index 0000000000..cc44fc484f --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe.html @@ -0,0 +1,736 @@ + + + + + + FFMpeg\FFProbe | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\FFProbe

+
+
+

class + FFProbe

+ + +

Constants

+ + + + + + + + + + +
TYPE_STREAMS +

+

+

+

+
TYPE_FORMAT +

+

+

+

+
+ + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + __construct(FFProbeDriver $ffprobe, Cache $cache) +

+

+
+ OutputParserInterface + + getParser() +

+

+
+ FFProbe + + setParser(OutputParserInterface $parser) +

+

+
+ FFProbeDriver + + getFFProbeDriver() +

+

+
+ FFProbe + + setFFProbeDriver(FFProbeDriver $ffprobe) +

+

+
+ FFProbe + + setOptionsTester(OptionsTesterInterface $tester) +

+

+
+ OptionsTesterInterface + + getOptionsTester() +

+

+
+ FFProbe + + setCache(Cache $cache) +

+

+
+ Cache + + getCache() +

+

+
+ MapperInterface + + getMapper() +

+

+
+ FFProbe + + setMapper(MapperInterface $mapper) +

+

+
+ Format + + format(string $pathfile) +

+

+
+ StreamCollection + + streams(string $pathfile) +

+

+
+ static FFProbe + + create(array|ConfigurationInterface $configuration = array(), LoggerInterface $logger = null, Cache $cache = null) +

+

+
+ + +

Details

+ +

+
at line 47
+ public + __construct(FFProbeDriver $ffprobe, Cache $cache) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + + + + + + +
FFProbeDriver$ffprobe +
Cache$cache +
+ + + + +
+
+ +

+
at line 59
+ public OutputParserInterface + getParser() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
OutputParserInterface +
+ + + +
+
+ +

+
at line 69
+ public FFProbe + setParser(OutputParserInterface $parser) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
OutputParserInterface$parser +
+ + +

Return Value

+ + + + + + +
FFProbe +
+ + + +
+
+ +

+
at line 79
+ public FFProbeDriver + getFFProbeDriver() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
FFProbeDriver +
+ + + +
+
+ +

+
at line 89
+ public FFProbe + setFFProbeDriver(FFProbeDriver $ffprobe) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
FFProbeDriver$ffprobe +
+ + +

Return Value

+ + + + + + +
FFProbe +
+ + + +
+
+ +

+
at line 101
+ public FFProbe + setOptionsTester(OptionsTesterInterface $tester) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
OptionsTesterInterface$tester +
+ + +

Return Value

+ + + + + + +
FFProbe +
+ + + +
+
+ +

+
at line 111
+ public OptionsTesterInterface + getOptionsTester() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
OptionsTesterInterface +
+ + + +
+
+ +

+
at line 121
+ public FFProbe + setCache(Cache $cache) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
Cache$cache +
+ + +

Return Value

+ + + + + + +
FFProbe +
+ + + +
+
+ +

+
at line 131
+ public Cache + getCache() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
Cache +
+ + + +
+
+ +

+
at line 139
+ public MapperInterface + getMapper() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
MapperInterface +
+ + + +
+
+ +

+
at line 149
+ public FFProbe + setMapper(MapperInterface $mapper) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
MapperInterface$mapper +
+ + +

Return Value

+ + + + + + +
FFProbe +
+ + + +
+
+ +

+
at line 168
+ public Format + format(string $pathfile) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
string$pathfile +
+ + +

Return Value

+ + + + + + +
FormatA Format object
+ + +

Exceptions

+ + + + + + + + + + +
InvalidArgumentException +
RuntimeException +
+ + +
+
+ +

+
at line 185
+ public StreamCollection + streams(string $pathfile) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
string$pathfile +
+ + +

Return Value

+ + + + + + +
StreamCollectionA collection of streams
+ + +

Exceptions

+ + + + + + + + + + +
InvalidArgumentException +
RuntimeException +
+ + +
+
+ +

+
at line 201
+ static public FFProbe + create(array|ConfigurationInterface $configuration = array(), LoggerInterface $logger = null, Cache $cache = null) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + + + + + + + + + + + +
array|ConfigurationInterface$configuration +
LoggerInterface$logger +
Cache$cache +
+ + +

Return Value

+ + + + + + +
FFProbe +
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/DataMapping.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/DataMapping.html new file mode 100644 index 0000000000..27260db3d1 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/DataMapping.html @@ -0,0 +1,55 @@ + + + + + + FFMpeg\FFProbe\DataMapping | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Namespace
+

FFMpeg\FFProbe\DataMapping

+
+
+ + + + + + + + + + + + + + + + + +
AbstractData +
Format +
Stream +
StreamCollection +
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/DataMapping/AbstractData.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/DataMapping/AbstractData.html new file mode 100644 index 0000000000..d85d70179b --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/DataMapping/AbstractData.html @@ -0,0 +1,340 @@ + + + + + + FFMpeg\FFProbe\DataMapping\AbstractData | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\FFProbe\DataMapping\AbstractData

+
+
+

abstract class + AbstractData implements + Countable

+ + + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + __construct(array $properties) +

+

+
+ Boolean + + has(string $property) +

Returns true if data has property.

+
+ mixed + + get(string $property) +

Returns the property value given its name.

+
+ AbstractData + + set(string $property, mixed $value) +

Sets the property value given its name.

+
+ array + + keys() +

Returns all property names.

+
+ array + + all() +

Returns all properties and their values.

+
+ + + count() +

{@inheritdoc}

+
+ + +

Details

+ +

+
at line 20
+ public + __construct(array $properties) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
array$properties +
+ + + + +
+
+ +

+
at line 31
+ public Boolean + has(string $property) +

+
+

Returns true if data has property.

+

+

+
+

Parameters

+ + + + + + + +
string$property +
+ + +

Return Value

+ + + + + + +
Boolean +
+ + + +
+
+ +

+
at line 44
+ public mixed + get(string $property) +

+
+

Returns the property value given its name.

+

+

+
+

Parameters

+ + + + + + + +
string$property +
+ + +

Return Value

+ + + + + + +
mixed +
+ + +

Exceptions

+ + + + + + +
InvalidArgumentExceptionIn case the data does not have the property
+ + +
+
+ +

+
at line 61
+ public AbstractData + set(string $property, mixed $value) +

+
+

Sets the property value given its name.

+

+

+
+

Parameters

+ + + + + + + + + + + + +
string$property +
mixed$value +
+ + +

Return Value

+ + + + + + +
AbstractData +
+ + + +
+
+ +

+
at line 73
+ public array + keys() +

+
+

Returns all property names.

+

+

+
+ +

Return Value

+ + + + + + +
array +
+ + + +
+
+ +

+
at line 83
+ public array + all() +

+
+

Returns all properties and their values.

+

+

+
+ +

Return Value

+ + + + + + +
array +
+ + + +
+
+ +

+
at line 91
+ public + count() +

+
+

{@inheritdoc}

+

+

+
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/DataMapping/Format.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/DataMapping/Format.html new file mode 100644 index 0000000000..0483759d9e --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/DataMapping/Format.html @@ -0,0 +1,339 @@ + + + + + + FFMpeg\FFProbe\DataMapping\Format | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\FFProbe\DataMapping\Format

+
+
+

class + Format extends AbstractData

+ + + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + __construct(array $properties) +

+

+
from AbstractData
+ Boolean + + has(string $property) +

Returns true if data has property.

+
from AbstractData
+ mixed + + get(string $property) +

Returns the property value given its name.

+
from AbstractData
+ AbstractData + + set(string $property, mixed $value) +

Sets the property value given its name.

+
from AbstractData
+ array + + keys() +

Returns all property names.

+
from AbstractData
+ array + + all() +

Returns all properties and their values.

+
from AbstractData
+ + + count() +

{@inheritdoc}

+
from AbstractData
+ + +

Details

+ +

+
in AbstractData at line 20
+ public + __construct(array $properties) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
array$properties +
+ + + + +
+
+ +

+
in AbstractData at line 31
+ public Boolean + has(string $property) +

+
+

Returns true if data has property.

+

+

+
+

Parameters

+ + + + + + + +
string$property +
+ + +

Return Value

+ + + + + + +
Boolean +
+ + + +
+
+ +

+
in AbstractData at line 44
+ public mixed + get(string $property) +

+
+

Returns the property value given its name.

+

+

+
+

Parameters

+ + + + + + + +
string$property +
+ + +

Return Value

+ + + + + + +
mixed +
+ + +

Exceptions

+ + + + + + +
InvalidArgumentExceptionIn case the data does not have the property
+ + +
+
+ +

+
in AbstractData at line 61
+ public AbstractData + set(string $property, mixed $value) +

+
+

Sets the property value given its name.

+

+

+
+

Parameters

+ + + + + + + + + + + + +
string$property +
mixed$value +
+ + +

Return Value

+ + + + + + +
AbstractData +
+ + + +
+
+ +

+
in AbstractData at line 73
+ public array + keys() +

+
+

Returns all property names.

+

+

+
+ +

Return Value

+ + + + + + +
array +
+ + + +
+
+ +

+
in AbstractData at line 83
+ public array + all() +

+
+

Returns all properties and their values.

+

+

+
+ +

Return Value

+ + + + + + +
array +
+ + + +
+
+ +

+
in AbstractData at line 91
+ public + count() +

+
+

{@inheritdoc}

+

+

+
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/DataMapping/Stream.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/DataMapping/Stream.html new file mode 100644 index 0000000000..d7b5e523eb --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/DataMapping/Stream.html @@ -0,0 +1,460 @@ + + + + + + FFMpeg\FFProbe\DataMapping\Stream | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\FFProbe\DataMapping\Stream

+
+
+

class + Stream extends AbstractData

+ + + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + __construct(array $properties) +

+

+
from AbstractData
+ Boolean + + has(string $property) +

Returns true if data has property.

+
from AbstractData
+ mixed + + get(string $property) +

Returns the property value given its name.

+
from AbstractData
+ AbstractData + + set(string $property, mixed $value) +

Sets the property value given its name.

+
from AbstractData
+ array + + keys() +

Returns all property names.

+
from AbstractData
+ array + + all() +

Returns all properties and their values.

+
from AbstractData
+ + + count() +

{@inheritdoc}

+
from AbstractData
+ Boolean + + isAudio() +

Returns true if the stream is an audio stream.

+
+ Boolean + + isVideo() +

Returns true if the stream is a video stream.

+
+ Dimension + + getDimensions() +

Returns the dimension of the video stream.

+
+ + +

Details

+ +

+
in AbstractData at line 20
+ public + __construct(array $properties) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
array$properties +
+ + + + +
+
+ +

+
in AbstractData at line 31
+ public Boolean + has(string $property) +

+
+

Returns true if data has property.

+

+

+
+

Parameters

+ + + + + + + +
string$property +
+ + +

Return Value

+ + + + + + +
Boolean +
+ + + +
+
+ +

+
in AbstractData at line 44
+ public mixed + get(string $property) +

+
+

Returns the property value given its name.

+

+

+
+

Parameters

+ + + + + + + +
string$property +
+ + +

Return Value

+ + + + + + +
mixed +
+ + +

Exceptions

+ + + + + + +
InvalidArgumentExceptionIn case the data does not have the property
+ + +
+
+ +

+
in AbstractData at line 61
+ public AbstractData + set(string $property, mixed $value) +

+
+

Sets the property value given its name.

+

+

+
+

Parameters

+ + + + + + + + + + + + +
string$property +
mixed$value +
+ + +

Return Value

+ + + + + + +
AbstractData +
+ + + +
+
+ +

+
in AbstractData at line 73
+ public array + keys() +

+
+

Returns all property names.

+

+

+
+ +

Return Value

+ + + + + + +
array +
+ + + +
+
+ +

+
in AbstractData at line 83
+ public array + all() +

+
+

Returns all properties and their values.

+

+

+
+ +

Return Value

+ + + + + + +
array +
+ + + +
+
+ +

+
in AbstractData at line 91
+ public + count() +

+
+

{@inheritdoc}

+

+

+
+ + + +
+
+ +

+
at line 25
+ public Boolean + isAudio() +

+
+

Returns true if the stream is an audio stream.

+

+

+
+ +

Return Value

+ + + + + + +
Boolean +
+ + + +
+
+ +

+
at line 35
+ public Boolean + isVideo() +

+
+

Returns true if the stream is a video stream.

+

+

+
+ +

Return Value

+ + + + + + +
Boolean +
+ + + +
+
+ +

+
at line 48
+ public Dimension + getDimensions() +

+
+

Returns the dimension of the video stream.

+

+

+
+ +

Return Value

+ + + + + + +
Dimension +
+ + +

Exceptions

+ + + + + + + + + + +
LogicExceptionIn case the stream is not a video stream.
RuntimeExceptionIn case the dimensions can not be extracted.
+ + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/DataMapping/StreamCollection.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/DataMapping/StreamCollection.html new file mode 100644 index 0000000000..47fccb9fdb --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/DataMapping/StreamCollection.html @@ -0,0 +1,329 @@ + + + + + + FFMpeg\FFProbe\DataMapping\StreamCollection | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\FFProbe\DataMapping\StreamCollection

+
+
+

class + StreamCollection implements + Countable, IteratorAggregate

+ + + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + __construct(array $streams = array()) +

+

+
+ null|Stream + + first() +

Returns the first stream of the collection, null if the collection is empty.

+
+ StreamCollection + + add(Stream $stream) +

Adds a stream to the collection.

+
+ StreamCollection + + videos() +

Returns a new StreamCollection with only video streams.

+
+ StreamCollection + + audios() +

Returns a new StreamCollection with only audio streams.

+
+ + + count() +

{@inheritdoc}

+
+ array + + all() +

Returns the array of contained streams.

+
+ + + getIterator() +

{@inheritdoc}

+
+ + +

Details

+ +

+
at line 18
+ public + __construct(array $streams = array()) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
array$streams +
+ + + + +
+
+ +

+
at line 29
+ public null|Stream + first() +

+
+

Returns the first stream of the collection, null if the collection is empty.

+

+

+
+ +

Return Value

+ + + + + + +
null|Stream +
+ + + +
+
+ +

+
at line 43
+ public StreamCollection + add(Stream $stream) +

+
+

Adds a stream to the collection.

+

+

+
+

Parameters

+ + + + + + + +
Stream$stream +
+ + +

Return Value

+ + + + + + +
StreamCollection +
+ + + +
+
+ +

+
at line 55
+ public StreamCollection + videos() +

+
+

Returns a new StreamCollection with only video streams.

+

+

+
+ +

Return Value

+ + + + + + +
StreamCollection +
+ + + +
+
+ +

+
at line 67
+ public StreamCollection + audios() +

+
+

Returns a new StreamCollection with only audio streams.

+

+

+
+ +

Return Value

+ + + + + + +
StreamCollection +
+ + + +
+
+ +

+
at line 77
+ public + count() +

+
+

{@inheritdoc}

+

+

+
+ + + +
+
+ +

+
at line 87
+ public array + all() +

+
+

Returns the array of contained streams.

+

+

+
+ +

Return Value

+ + + + + + +
array +
+ + + +
+
+ +

+
at line 95
+ public + getIterator() +

+
+

{@inheritdoc}

+

+

+
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/DataMapping/namespace-frame.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/DataMapping/namespace-frame.html new file mode 100644 index 0000000000..94be66ed1a --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/DataMapping/namespace-frame.html @@ -0,0 +1,9 @@ + + + + + + FFMpeg\FFProbe\DataMapping | PHP-FFMpeg API + + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/Mapper.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/Mapper.html new file mode 100644 index 0000000000..514093173c --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/Mapper.html @@ -0,0 +1,107 @@ + + + + + + FFMpeg\FFProbe\Mapper | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\FFProbe\Mapper

+
+
+

class + Mapper implements + MapperInterface

+ + + + +

Methods

+ + + + + + + +
+ Format|Stream + + map(string $type, string $data) +

Maps data given its type.

+
+ + +

Details

+ +

+
at line 25
+ public Format|Stream + map(string $type, string $data) +

+
+

Maps data given its type.

+

+

+
+

Parameters

+ + + + + + + + + + + + +
string$typeOne of FFProbe::TYPE_* constant
string$dataThe data
+ + +

Return Value

+ + + + + + +
Format|Stream +
+ + +

Exceptions

+ + + + + + +
InvalidArgumentExceptionIn case the type is not supported
+ + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/MapperInterface.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/MapperInterface.html new file mode 100644 index 0000000000..7bc428d014 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/MapperInterface.html @@ -0,0 +1,106 @@ + + + + + + FFMpeg\FFProbe\MapperInterface | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Interface
+

FFMpeg\FFProbe\MapperInterface

+
+
+

interface + MapperInterface

+ + + + +

Methods

+ + + + + + + +
+ Format|Stream + + map(string $type, string $data) +

Maps data given its type.

+
+ + +

Details

+ +

+
at line 26
+ public Format|Stream + map(string $type, string $data) +

+
+

Maps data given its type.

+

+

+
+

Parameters

+ + + + + + + + + + + + +
string$typeOne of FFProbe::TYPE_* constant
string$dataThe data
+ + +

Return Value

+ + + + + + +
Format|Stream +
+ + +

Exceptions

+ + + + + + +
InvalidArgumentExceptionIn case the type is not supported
+ + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/OptionsTester.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/OptionsTester.html new file mode 100644 index 0000000000..63c5bd2ada --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/OptionsTester.html @@ -0,0 +1,139 @@ + + + + + + FFMpeg\FFProbe\OptionsTester | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\FFProbe\OptionsTester

+
+
+

class + OptionsTester implements + OptionsTesterInterface

+ + + + +

Methods

+ + + + + + + + + + + + +
+ + + __construct(FFProbeDriver $ffprobe, Cache $cache) +

+

+
+ Boolean + + has(string $name) +

Tells if the given option is supported by ffprobe.

+
+ + +

Details

+ +

+
at line 26
+ public + __construct(FFProbeDriver $ffprobe, Cache $cache) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + + + + + + +
FFProbeDriver$ffprobe +
Cache$cache +
+ + + + +
+
+ +

+
at line 35
+ public Boolean + has(string $name) +

+
+

Tells if the given option is supported by ffprobe.

+

+

+
+

Parameters

+ + + + + + + +
string$name +
+ + +

Return Value

+ + + + + + +
Boolean +
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/OptionsTesterInterface.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/OptionsTesterInterface.html new file mode 100644 index 0000000000..05daf8ffdd --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/OptionsTesterInterface.html @@ -0,0 +1,93 @@ + + + + + + FFMpeg\FFProbe\OptionsTesterInterface | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Interface
+

FFMpeg\FFProbe\OptionsTesterInterface

+
+
+

interface + OptionsTesterInterface

+ + + + +

Methods

+ + + + + + + +
+ Boolean + + has(string $name) +

Tells if the given option is supported by ffprobe.

+
+ + +

Details

+ +

+
at line 23
+ public Boolean + has(string $name) +

+
+

Tells if the given option is supported by ffprobe.

+

+

+
+

Parameters

+ + + + + + + +
string$name +
+ + +

Return Value

+ + + + + + +
Boolean +
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/OutputParser.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/OutputParser.html new file mode 100644 index 0000000000..bd52767a8f --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/OutputParser.html @@ -0,0 +1,107 @@ + + + + + + FFMpeg\FFProbe\OutputParser | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\FFProbe\OutputParser

+
+
+

class + OutputParser implements + OutputParserInterface

+ + + + +

Methods

+ + + + + + + +
+ array + + parse(string $type, string $data) +

Parses ffprobe raw output.

+
+ + +

Details

+ +

+
at line 22
+ public array + parse(string $type, string $data) +

+
+

Parses ffprobe raw output.

+

+

+
+

Parameters

+ + + + + + + + + + + + +
string$typeOne of FFProbe::TYPE_* constant
string$dataThe data
+ + +

Return Value

+ + + + + + +
array +
+ + +

Exceptions

+ + + + + + +
InvalidArgumentExceptionIn case the type is not supported
+ + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/OutputParserInterface.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/OutputParserInterface.html new file mode 100644 index 0000000000..f7e9b0fe8a --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/OutputParserInterface.html @@ -0,0 +1,106 @@ + + + + + + FFMpeg\FFProbe\OutputParserInterface | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Interface
+

FFMpeg\FFProbe\OutputParserInterface

+
+
+

interface + OutputParserInterface

+ + + + +

Methods

+ + + + + + + +
+ array + + parse(string $type, string $data) +

Parses ffprobe raw output.

+
+ + +

Details

+ +

+
at line 26
+ public array + parse(string $type, string $data) +

+
+

Parses ffprobe raw output.

+

+

+
+

Parameters

+ + + + + + + + + + + + +
string$typeOne of FFProbe::TYPE_* constant
string$dataThe data
+ + +

Return Value

+ + + + + + +
array +
+ + +

Exceptions

+ + + + + + +
InvalidArgumentExceptionIn case the type is not supported
+ + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/namespace-frame.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/namespace-frame.html new file mode 100644 index 0000000000..e28747e438 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/FFProbe/namespace-frame.html @@ -0,0 +1,9 @@ + + + + + + FFMpeg\FFProbe | PHP-FFMpeg API + + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters.html new file mode 100644 index 0000000000..ef7e868031 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters.html @@ -0,0 +1,48 @@ + + + + + + FFMpeg\Filters | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Namespace
+

FFMpeg\Filters

+
+
+ + + + + +
FiltersCollection +
+ +

Interfaces

+ + + + + +
FilterInterface +
+ +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Audio.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Audio.html new file mode 100644 index 0000000000..cdd2c6096c --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Audio.html @@ -0,0 +1,58 @@ + + + + + + FFMpeg\Filters\Audio | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Namespace
+

FFMpeg\Filters\Audio

+
+
+ + + + + + + + + + + + + +
AudioFilters +
AudioResamplableFilter +
SimpleFilter +
+ +

Interfaces

+ + + + + +
AudioFilterInterface +
+ +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Audio/AudioFilterInterface.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Audio/AudioFilterInterface.html new file mode 100644 index 0000000000..0914570895 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Audio/AudioFilterInterface.html @@ -0,0 +1,135 @@ + + + + + + FFMpeg\Filters\Audio\AudioFilterInterface | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Interface
+

FFMpeg\Filters\Audio\AudioFilterInterface

+
+
+

interface + AudioFilterInterface implements + FilterInterface

+ + + + +

Methods

+ + + + + + + + + + + + +
+ integer + + getPriority() +

Returns the priority of the filter.

+
from FilterInterface
+ array + + apply(Audio $audio, AudioInterface $format) +

Applies the filter on the the Audio media given an format.

+
+ + +

Details

+ +

+
in FilterInterface at line 21
+ public integer + getPriority() +

+
+

Returns the priority of the filter.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
at line 28
+ public array + apply(Audio $audio, AudioInterface $format) +

+
+

Applies the filter on the the Audio media given an format.

+

+

+
+

Parameters

+ + + + + + + + + + + + +
Audio$audio +
AudioInterface$format +
+ + +

Return Value

+ + + + + + +
arrayAn array of arguments
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Audio/AudioFilters.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Audio/AudioFilters.html new file mode 100644 index 0000000000..fe079c24ce --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Audio/AudioFilters.html @@ -0,0 +1,132 @@ + + + + + + FFMpeg\Filters\Audio\AudioFilters | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Filters\Audio\AudioFilters

+
+
+

class + AudioFilters

+ + + + +

Methods

+ + + + + + + + + + + + +
+ + + __construct(Audio $media) +

+

+
+ AudioFilters + + resample(Integer $rate) +

Resamples the audio file.

+
+ + +

Details

+ +

+
at line 11
+ public + __construct(Audio $media) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
Audio$media +
+ + + + +
+
+ +

+
at line 23
+ public AudioFilters + resample(Integer $rate) +

+
+

Resamples the audio file.

+

+

+
+

Parameters

+ + + + + + + +
Integer$rate +
+ + +

Return Value

+ + + + + + +
AudioFilters +
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Audio/AudioResamplableFilter.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Audio/AudioResamplableFilter.html new file mode 100644 index 0000000000..62589a219f --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Audio/AudioResamplableFilter.html @@ -0,0 +1,218 @@ + + + + + + FFMpeg\Filters\Audio\AudioResamplableFilter | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Filters\Audio\AudioResamplableFilter

+
+
+

class + AudioResamplableFilter implements + AudioFilterInterface

+ + + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + +
+ + + __construct($rate, $priority) +

+

+
+ integer + + getPriority() +

Returns the priority of the filter.

+
+ Integer + + getRate() +

+

+
+ array + + apply(Audio $audio, AudioInterface $format) +

Applies the filter on the the Audio media given an format.

+
+ + +

Details

+ +

+
at line 24
+ public + __construct($rate, $priority) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + + + + + + +
$rate +
$priority +
+ + + + +
+
+ +

+
at line 33
+ public integer + getPriority() +

+
+

Returns the priority of the filter.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
at line 42
+ public Integer + getRate() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
Integer +
+ + + +
+
+ +

+
at line 50
+ public array + apply(Audio $audio, AudioInterface $format) +

+
+

Applies the filter on the the Audio media given an format.

+

+

+
+

Parameters

+ + + + + + + + + + + + +
Audio$audio +
AudioInterface$format +
+ + +

Return Value

+ + + + + + +
arrayAn array of arguments
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Audio/SimpleFilter.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Audio/SimpleFilter.html new file mode 100644 index 0000000000..03bf5c1704 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Audio/SimpleFilter.html @@ -0,0 +1,180 @@ + + + + + + FFMpeg\Filters\Audio\SimpleFilter | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Filters\Audio\SimpleFilter

+
+
+

class + SimpleFilter implements + AudioFilterInterface

+ + + + +

Methods

+ + + + + + + + + + + + + + + + + +
+ + + __construct(array $params, $priority) +

+

+
+ integer + + getPriority() +

Returns the priority of the filter.

+
+ array + + apply(Audio $audio, AudioInterface $format) +

Applies the filter on the the Audio media given an format.

+
+ + +

Details

+ +

+
at line 13
+ public + __construct(array $params, $priority) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + + + + + + +
array$params +
$priority +
+ + + + +
+
+ +

+
at line 22
+ public integer + getPriority() +

+
+

Returns the priority of the filter.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
at line 30
+ public array + apply(Audio $audio, AudioInterface $format) +

+
+

Applies the filter on the the Audio media given an format.

+

+

+
+

Parameters

+ + + + + + + + + + + + +
Audio$audio +
AudioInterface$format +
+ + +

Return Value

+ + + + + + +
arrayAn array of arguments
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Audio/namespace-frame.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Audio/namespace-frame.html new file mode 100644 index 0000000000..c68aec4515 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Audio/namespace-frame.html @@ -0,0 +1,9 @@ + + + + + + FFMpeg\Filters\Audio | PHP-FFMpeg API + + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/FilterInterface.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/FilterInterface.html new file mode 100644 index 0000000000..abc5eaae3e --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/FilterInterface.html @@ -0,0 +1,82 @@ + + + + + + FFMpeg\Filters\FilterInterface | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Interface
+

FFMpeg\Filters\FilterInterface

+
+
+

interface + FilterInterface

+ + + + +

Methods

+ + + + + + + +
+ integer + + getPriority() +

Returns the priority of the filter.

+
+ + +

Details

+ +

+
at line 21
+ public integer + getPriority() +

+
+

Returns the priority of the filter.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/FiltersCollection.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/FiltersCollection.html new file mode 100644 index 0000000000..65e07399b8 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/FiltersCollection.html @@ -0,0 +1,148 @@ + + + + + + FFMpeg\Filters\FiltersCollection | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Filters\FiltersCollection

+
+
+

class + FiltersCollection implements + Countable, IteratorAggregate

+ + + + +

Methods

+ + + + + + + + + + + + + + + + + +
+ FiltersCollection + + add(FilterInterface $filter) +

+

+
+ + + count() +

{@inheritdoc}

+
+ + + getIterator() +

{@inheritdoc}

+
+ + +

Details

+ +

+
at line 24
+ public FiltersCollection + add(FilterInterface $filter) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
FilterInterface$filter +
+ + +

Return Value

+ + + + + + +
FiltersCollection +
+ + + +
+
+ +

+
at line 35
+ public + count() +

+
+

{@inheritdoc}

+

+

+
+ + + +
+
+ +

+
at line 47
+ public + getIterator() +

+
+

{@inheritdoc}

+

+

+
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Frame.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Frame.html new file mode 100644 index 0000000000..2c997c8577 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Frame.html @@ -0,0 +1,53 @@ + + + + + + FFMpeg\Filters\Frame | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Namespace
+

FFMpeg\Filters\Frame

+
+
+ + + + + + + + + +
DisplayRatioFixerFilter +
FrameFilters +
+ +

Interfaces

+ + + + + +
FrameFilterInterface +
+ +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Frame/DisplayRatioFixerFilter.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Frame/DisplayRatioFixerFilter.html new file mode 100644 index 0000000000..7be0e1b445 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Frame/DisplayRatioFixerFilter.html @@ -0,0 +1,161 @@ + + + + + + FFMpeg\Filters\Frame\DisplayRatioFixerFilter | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Filters\Frame\DisplayRatioFixerFilter

+
+
+

class + DisplayRatioFixerFilter implements + FrameFilterInterface

+ + + + +

Methods

+ + + + + + + + + + + + + + + + + +
+ + + __construct($priority) +

+

+
+ integer + + getPriority() +

Returns the priority of the filter.

+
+ + + apply(Frame $frame) +

+

+
+ + +

Details

+ +

+
at line 22
+ public + __construct($priority) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
$priority +
+ + + + +
+
+ +

+
at line 30
+ public integer + getPriority() +

+
+

Returns the priority of the filter.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
at line 38
+ public + apply(Frame $frame) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
Frame$frame +
+ + + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Frame/FrameFilterInterface.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Frame/FrameFilterInterface.html new file mode 100644 index 0000000000..627361570b --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Frame/FrameFilterInterface.html @@ -0,0 +1,122 @@ + + + + + + FFMpeg\Filters\Frame\FrameFilterInterface | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Interface
+

FFMpeg\Filters\Frame\FrameFilterInterface

+
+
+

interface + FrameFilterInterface implements + FilterInterface

+ + + + +

Methods

+ + + + + + + + + + + + +
+ integer + + getPriority() +

Returns the priority of the filter.

+
from FilterInterface
+ + + apply(Frame $frame) +

+

+
+ + +

Details

+ +

+
in FilterInterface at line 21
+ public integer + getPriority() +

+
+

Returns the priority of the filter.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
at line 19
+ public + apply(Frame $frame) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
Frame$frame +
+ + + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Frame/FrameFilters.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Frame/FrameFilters.html new file mode 100644 index 0000000000..41ea37523f --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Frame/FrameFilters.html @@ -0,0 +1,121 @@ + + + + + + FFMpeg\Filters\Frame\FrameFilters | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Filters\Frame\FrameFilters

+
+
+

class + FrameFilters

+ + + + +

Methods

+ + + + + + + + + + + + +
+ + + __construct(Frame $frame) +

+

+
+ FrameFilters + + fixDisplayRatio() +

Fixes the display ratio of the output frame.

+
+ + +

Details

+ +

+
at line 20
+ public + __construct(Frame $frame) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
Frame$frame +
+ + + + +
+
+ +

+
at line 33
+ public FrameFilters + fixDisplayRatio() +

+
+

Fixes the display ratio of the output frame.

+

In case the sample ratio and display ratio are different, image may be +anamorphozed. This filter fixes this by specifying the output size.

+
+ +

Return Value

+ + + + + + +
FrameFilters +
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Frame/namespace-frame.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Frame/namespace-frame.html new file mode 100644 index 0000000000..7e41e23f64 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Frame/namespace-frame.html @@ -0,0 +1,9 @@ + + + + + + FFMpeg\Filters\Frame | PHP-FFMpeg API + + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Video.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Video.html new file mode 100644 index 0000000000..c474efec1c --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Video.html @@ -0,0 +1,82 @@ + + + + + + FFMpeg\Filters\Video | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Namespace
+

FFMpeg\Filters\Video

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ClipFilter +
CustomFilter +
FrameRateFilter +
ResizeFilter +
RotateFilter +
SynchronizeFilterSynchronizes audio and video in case of desynchronized movies.
VideoFilters +
WatermarkFilter +
+ +

Interfaces

+ + + + + +
VideoFilterInterface +
+ +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Video/ClipFilter.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Video/ClipFilter.html new file mode 100644 index 0000000000..ae86587079 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Video/ClipFilter.html @@ -0,0 +1,262 @@ + + + + + + FFMpeg\Filters\Video\ClipFilter | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Filters\Video\ClipFilter

+
+
+

class + ClipFilter implements + VideoFilterInterface

+ + + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + __construct(TimeCode $start, TimeCode $duration = null, $priority) +

+

+
+ integer + + getPriority() +

Returns the priority of the filter.

+
+ TimeCode + + getStart() +

+

+
+ TimeCode + + getDuration() +

+

+
+ array + + apply(Video $video, VideoInterface $format) +

Applies the filter on the the Video media given an format.

+
+ + +

Details

+ +

+
at line 27
+ public + __construct(TimeCode $start, TimeCode $duration = null, $priority) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + + + + + + + + + + + +
TimeCode$start +
TimeCode$duration +
$priority +
+ + + + +
+
+ +

+
at line 37
+ public integer + getPriority() +

+
+

Returns the priority of the filter.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
at line 45
+ public TimeCode + getStart() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
TimeCode +
+ + + +
+
+ +

+
at line 53
+ public TimeCode + getDuration() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
TimeCode +
+ + + +
+
+ +

+
at line 61
+ public array + apply(Video $video, VideoInterface $format) +

+
+

Applies the filter on the the Video media given an format.

+

+

+
+

Parameters

+ + + + + + + + + + + + +
Video$video +
VideoInterface$format +
+ + +

Return Value

+ + + + + + +
arrayAn array of arguments
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Video/CustomFilter.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Video/CustomFilter.html new file mode 100644 index 0000000000..141c4ffab7 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Video/CustomFilter.html @@ -0,0 +1,178 @@ + + + + + + FFMpeg\Filters\Video\CustomFilter | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Filters\Video\CustomFilter

+
+
+

class + CustomFilter implements + VideoFilterInterface

+ + + + +

Methods

+ + + + + + + + + + + + + + + + + +
+ + + __construct(string $filter, int $priority) +

A custom filter, useful if you want to build complex filters

+
+ integer + + getPriority() +

Returns the priority of the filter.

+
+ array + + apply(Video $video, VideoInterface $format) +

Applies the filter on the the Video media given an format.

+
+ + +

Details

+ +

+
at line 29
+ public + __construct(string $filter, int $priority) +

+
+

A custom filter, useful if you want to build complex filters

+

+

+
+

Parameters

+ + + + + + + + + + + + +
string$filter +
int$priority +
+ + + + +
+
+ +

+
at line 38
+ public integer + getPriority() +

+
+

Returns the priority of the filter.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
at line 46
+ public array + apply(Video $video, VideoInterface $format) +

+
+

Applies the filter on the the Video media given an format.

+

+

+
+

Parameters

+ + + + + + + + + + + + +
Video$video +
VideoInterface$format +
+ + +

Return Value

+ + + + + + +
arrayAn array of arguments
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Video/FrameRateFilter.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Video/FrameRateFilter.html new file mode 100644 index 0000000000..fb9dcfcb77 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Video/FrameRateFilter.html @@ -0,0 +1,267 @@ + + + + + + FFMpeg\Filters\Video\FrameRateFilter | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Filters\Video\FrameRateFilter

+
+
+

class + FrameRateFilter implements + VideoFilterInterface

+ + + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + __construct(FrameRate $rate, $gop, $priority) +

+

+
+ integer + + getPriority() +

Returns the priority of the filter.

+
+ FrameRate + + getFrameRate() +

Returns the frame rate.

+
+ Integer + + getGOP() +

Returns the GOP size.

+
+ array + + apply(Video $video, VideoInterface $format) +

Applies the filter on the the Video media given an format.

+
+ + +

Details

+ +

+
at line 24
+ public + __construct(FrameRate $rate, $gop, $priority) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + + + + + + + + + + + +
FrameRate$rate +
$gop +
$priority +
+ + + + +
+
+ +

+
at line 34
+ public integer + getPriority() +

+
+

Returns the priority of the filter.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
at line 44
+ public FrameRate + getFrameRate() +

+
+

Returns the frame rate.

+

+

+
+ +

Return Value

+ + + + + + +
FrameRate +
+ + + +
+
+ +

+
at line 56
+ public Integer + getGOP() +

+
+

Returns the GOP size.

+

+

+
+ +

Return Value

+ + + + + + +
Integer +
+ + + +

See also

+ + + + + + +
https://wikipedia.org/wiki/Group_of_pictures
+ +
+
+ +

+
at line 64
+ public array + apply(Video $video, VideoInterface $format) +

+
+

Applies the filter on the the Video media given an format.

+

+

+
+

Parameters

+ + + + + + + + + + + + +
Video$video +
VideoInterface$format +
+ + +

Return Value

+ + + + + + +
arrayAn array of arguments
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Video/ResizeFilter.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Video/ResizeFilter.html new file mode 100644 index 0000000000..f57c54120f --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Video/ResizeFilter.html @@ -0,0 +1,343 @@ + + + + + + FFMpeg\Filters\Video\ResizeFilter | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Filters\Video\ResizeFilter

+
+
+

class + ResizeFilter implements + VideoFilterInterface

+ + +

Constants

+ + + + + + + + + + + + + + + + + + +
RESIZEMODE_FIT +

fits to the dimensions, might introduce anamorphosis

+

+

+
RESIZEMODE_INSET +

resizes the video inside the given dimension, no anamorphosis

+

+

+
RESIZEMODE_SCALE_WIDTH +

resizes the video to fit the dimension width, no anamorphosis

+

+

+
RESIZEMODE_SCALE_HEIGHT +

resizes the video to fit the dimension height, no anamorphosis

+

+

+
+ + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + __construct(Dimension $dimension, $mode = self::RESIZEMODE_FIT, $forceStandards = true, $priority) +

+

+
+ integer + + getPriority() +

Returns the priority of the filter.

+
+ Dimension + + getDimension() +

+

+
+ string + + getMode() +

+

+
+ Boolean + + areStandardsForced() +

+

+
+ array + + apply(Video $video, VideoInterface $format) +

Applies the filter on the the Video media given an format.

+
+ + +

Details

+ +

+
at line 39
+ public + __construct(Dimension $dimension, $mode = self::RESIZEMODE_FIT, $forceStandards = true, $priority) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + +
Dimension$dimension +
$mode +
$forceStandards +
$priority +
+ + + + +
+
+ +

+
at line 50
+ public integer + getPriority() +

+
+

Returns the priority of the filter.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
at line 58
+ public Dimension + getDimension() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
Dimension +
+ + + +
+
+ +

+
at line 66
+ public string + getMode() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
at line 74
+ public Boolean + areStandardsForced() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
Boolean +
+ + + +
+
+ +

+
at line 82
+ public array + apply(Video $video, VideoInterface $format) +

+
+

Applies the filter on the the Video media given an format.

+

+

+
+

Parameters

+ + + + + + + + + + + + +
Video$video +
VideoInterface$format +
+ + +

Return Value

+ + + + + + +
arrayAn array of arguments
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Video/RotateFilter.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Video/RotateFilter.html new file mode 100644 index 0000000000..819e3ca57c --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Video/RotateFilter.html @@ -0,0 +1,250 @@ + + + + + + FFMpeg\Filters\Video\RotateFilter | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Filters\Video\RotateFilter

+
+
+

class + RotateFilter implements + VideoFilterInterface

+ + +

Constants

+ + + + + + + + + + + + + + +
ROTATE_90 +

+

+

+

+
ROTATE_180 +

+

+

+

+
ROTATE_270 +

+

+

+

+
+ + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + +
+ + + __construct($angle, $priority) +

+

+
+ integer + + getPriority() +

Returns the priority of the filter.

+
+ Dimension + + getAngle() +

+

+
+ array + + apply(Video $video, VideoInterface $format) +

Applies the filter on the the Video media given an format.

+
+ + +

Details

+ +

+
at line 30
+ public + __construct($angle, $priority) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + + + + + + +
$angle +
$priority +
+ + + + +
+
+ +

+
at line 39
+ public integer + getPriority() +

+
+

Returns the priority of the filter.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
at line 47
+ public Dimension + getAngle() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
Dimension +
+ + + +
+
+ +

+
at line 55
+ public array + apply(Video $video, VideoInterface $format) +

+
+

Applies the filter on the the Video media given an format.

+

+

+
+

Parameters

+ + + + + + + + + + + + +
Video$video +
VideoInterface$format +
+ + +

Return Value

+ + + + + + +
arrayAn array of arguments
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Video/SynchronizeFilter.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Video/SynchronizeFilter.html new file mode 100644 index 0000000000..e6549e53f3 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Video/SynchronizeFilter.html @@ -0,0 +1,179 @@ + + + + + + FFMpeg\Filters\Video\SynchronizeFilter | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Filters\Video\SynchronizeFilter

+
+
+

class + SynchronizeFilter implements + VideoFilterInterface

+ +
+

Synchronizes audio and video in case of desynchronized movies.

+

+

+
+ + + +

Methods

+ + + + + + + + + + + + + + + + + +
+ + + __construct($priority = 12) +

+

+
+ integer + + getPriority() +

Returns the priority of the filter.

+
+ array + + apply(Video $video, VideoInterface $format) +

Applies the filter on the the Video media given an format.

+
+ + +

Details

+ +

+
at line 24
+ public + __construct($priority = 12) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
$priority +
+ + + + +
+
+ +

+
at line 32
+ public integer + getPriority() +

+
+

Returns the priority of the filter.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
at line 40
+ public array + apply(Video $video, VideoInterface $format) +

+
+

Applies the filter on the the Video media given an format.

+

+

+
+

Parameters

+ + + + + + + + + + + + +
Video$video +
VideoInterface$format +
+ + +

Return Value

+ + + + + + +
arrayAn array of arguments
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Video/VideoFilterInterface.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Video/VideoFilterInterface.html new file mode 100644 index 0000000000..41bd0d4843 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Video/VideoFilterInterface.html @@ -0,0 +1,135 @@ + + + + + + FFMpeg\Filters\Video\VideoFilterInterface | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Interface
+

FFMpeg\Filters\Video\VideoFilterInterface

+
+
+

interface + VideoFilterInterface implements + FilterInterface

+ + + + +

Methods

+ + + + + + + + + + + + +
+ integer + + getPriority() +

Returns the priority of the filter.

+
from FilterInterface
+ array + + apply(Video $video, VideoInterface $format) +

Applies the filter on the the Video media given an format.

+
+ + +

Details

+ +

+
in FilterInterface at line 21
+ public integer + getPriority() +

+
+

Returns the priority of the filter.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
at line 28
+ public array + apply(Video $video, VideoInterface $format) +

+
+

Applies the filter on the the Video media given an format.

+

+

+
+

Parameters

+ + + + + + + + + + + + +
Video$video +
VideoInterface$format +
+ + +

Return Value

+ + + + + + +
arrayAn array of arguments
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Video/VideoFilters.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Video/VideoFilters.html new file mode 100644 index 0000000000..21b2669021 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Video/VideoFilters.html @@ -0,0 +1,474 @@ + + + + + + FFMpeg\Filters\Video\VideoFilters | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Filters\Video\VideoFilters

+
+
+

class + VideoFilters extends AudioFilters

+ + + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + __construct(Video $media) +

+

+
+ AudioFilters + + resample(Integer $rate) +

Resamples the audio file.

+
from AudioFilters
+ VideoFilters + + resize(Dimension $dimension, string $mode = ResizeFilter::RESIZEMODE_FIT, Boolean $forceStandards = true) +

Resizes a video to a given dimension.

+
+ VideoFilters + + framerate(FrameRate $framerate, type $gop) +

Changes the video framerate.

+
+ VideoFilters + + synchronize() +

Synchronizes audio and video.

+
+ VideoFilters + + clip(TimeCode $start, TimeCode $duration = null) +

Clips (cuts) the video.

+
+ AudioFilters + + audioResample(Integer $rate) +

Resamples the audio file.

+
+ + + rotate($angle) +

+

+
+ $this + + watermark(string $imagePath, array $coordinates = array()) +

+

+
+ + +

Details

+ +

+
at line 23
+ public + __construct(Video $media) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
Video$media +
+ + + + +
+
+ +

+
in AudioFilters at line 23
+ public AudioFilters + resample(Integer $rate) +

+
+

Resamples the audio file.

+

+

+
+

Parameters

+ + + + + + + +
Integer$rate +
+ + +

Return Value

+ + + + + + +
AudioFilters +
+ + + +
+
+ +

+
at line 37
+ public VideoFilters + resize(Dimension $dimension, string $mode = ResizeFilter::RESIZEMODE_FIT, Boolean $forceStandards = true) +

+
+

Resizes a video to a given dimension.

+

+

+
+

Parameters

+ + + + + + + + + + + + + + + + + +
Dimension$dimension +
string$mode +
Boolean$forceStandards +
+ + +

Return Value

+ + + + + + +
VideoFilters +
+ + + +
+
+ +

+
at line 52
+ public VideoFilters + framerate(FrameRate $framerate, type $gop) +

+
+

Changes the video framerate.

+

+

+
+

Parameters

+ + + + + + + + + + + + +
FrameRate$framerate +
type$gop +
+ + +

Return Value

+ + + + + + +
VideoFilters +
+ + + +
+
+ +

+
at line 64
+ public VideoFilters + synchronize() +

+
+

Synchronizes audio and video.

+

+

+
+ +

Return Value

+ + + + + + +
VideoFilters +
+ + + +
+
+ +

+
at line 79
+ public VideoFilters + clip(TimeCode $start, TimeCode $duration = null) +

+
+

Clips (cuts) the video.

+

+

+
+

Parameters

+ + + + + + + + + + + + +
TimeCode$start +
TimeCode$duration +
+ + +

Return Value

+ + + + + + +
VideoFilters +
+ + + +
+
+ +

+
at line 93
+ public AudioFilters + audioResample(Integer $rate) +

+
+

Resamples the audio file.

+

+

+
+

Parameters

+ + + + + + + +
Integer$rate +
+ + +

Return Value

+ + + + + + +
AudioFilters +
+ + + +
+
+ +

+
at line 100
+ public + rotate($angle) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
$angle +
+ + + + +
+
+ +

+
at line 113
+ public $this + watermark(string $imagePath, array $coordinates = array()) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + + + + + + +
string$imagePath +
array$coordinates +
+ + +

Return Value

+ + + + + + +
$this +
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Video/WatermarkFilter.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Video/WatermarkFilter.html new file mode 100644 index 0000000000..4f97f5c14f --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Video/WatermarkFilter.html @@ -0,0 +1,186 @@ + + + + + + FFMpeg\Filters\Video\WatermarkFilter | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Filters\Video\WatermarkFilter

+
+
+

class + WatermarkFilter implements + VideoFilterInterface

+ + + + +

Methods

+ + + + + + + + + + + + + + + + + +
+ + + __construct($watermarkPath, array $coordinates = array(), $priority) +

+

+
+ integer + + getPriority() +

Returns the priority of the filter.

+
+ array + + apply(Video $video, VideoInterface $format) +

Applies the filter on the the Video media given an format.

+
+ + +

Details

+ +

+
at line 26
+ public + __construct($watermarkPath, array $coordinates = array(), $priority) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + + + + + + + + + + + +
$watermarkPath +
array$coordinates +
$priority +
+ + + + +
+
+ +

+
at line 36
+ public integer + getPriority() +

+
+

Returns the priority of the filter.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
at line 44
+ public array + apply(Video $video, VideoInterface $format) +

+
+

Applies the filter on the the Video media given an format.

+

+

+
+

Parameters

+ + + + + + + + + + + + +
Video$video +
VideoInterface$format +
+ + +

Return Value

+ + + + + + +
arrayAn array of arguments
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Video/namespace-frame.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Video/namespace-frame.html new file mode 100644 index 0000000000..25db4f1900 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/Video/namespace-frame.html @@ -0,0 +1,9 @@ + + + + + + FFMpeg\Filters\Video | PHP-FFMpeg API + + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/namespace-frame.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/namespace-frame.html new file mode 100644 index 0000000000..dd37384226 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Filters/namespace-frame.html @@ -0,0 +1,9 @@ + + + + + + FFMpeg\Filters | PHP-FFMpeg API + + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format.html new file mode 100644 index 0000000000..8198a1f7e1 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format.html @@ -0,0 +1,61 @@ + + + + + + FFMpeg\Format | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Namespace
+

FFMpeg\Format

+
+
+ +

Interfaces

+ + + + + + + + + + + + + + + + + + + + + +
AudioInterface +
FormatInterface +
FrameInterface +
ProgressableInterface +
VideoInterface +
+ +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Audio.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Audio.html new file mode 100644 index 0000000000..a9fa753553 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Audio.html @@ -0,0 +1,60 @@ + + + + + + FFMpeg\Format\Audio | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Namespace
+

FFMpeg\Format\Audio

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
AacThe AAC audio format
DefaultAudio +
FlacThe Flac audio format
Mp3The MP3 audio format
VorbisThe Vorbis audio format
WavThe WAV audio format
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Audio/Aac.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Audio/Aac.html new file mode 100644 index 0000000000..abe6b07aeb --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Audio/Aac.html @@ -0,0 +1,498 @@ + + + + + + FFMpeg\Format\Audio\Aac | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Format\Audio\Aac

+
+
+

class + Aac extends DefaultAudio

+ +
+

The AAC audio format

+

+

+
+ + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ array() + + getExtraParams() +

Returns an array of extra parameters to add to ffmpeg commandline.

+
from DefaultAudio
+ string + + getAudioCodec() +

Returns the audio codec.

+
from DefaultAudio
+ + + setAudioCodec(string $audioCodec) +

Sets the audio codec, Should be in the available ones, otherwise an exception is thrown.

+
from DefaultAudio
+ integer + + getAudioKiloBitrate() +

Gets the audio kiloBitrate value.

+
from DefaultAudio
+ + + setAudioKiloBitrate(integer $kiloBitrate) +

Sets the kiloBitrate value.

+
from DefaultAudio
+ integer + + getAudioChannels() +

Gets the audio channels value.

+
from DefaultAudio
+ + + setAudioChannels(integer $channels) +

Sets the channels value.

+
from DefaultAudio
+ array + + createProgressListener(MediaTypeInterface $media, FFProbe $ffprobe, Integer $pass, Integer $total) +

Creates the progress listener.

+
from DefaultAudio
+ string + + getPasses() +

Returns the number of passes.

+
from DefaultAudio
+ + + __construct() +

+

+
+ array + + getAvailableAudioCodecs() +

Returns the list of available audio codecs for this format.

+
+ + +

Details

+ +

+
in DefaultAudio at line 36
+ public array() + getExtraParams() +

+
+

Returns an array of extra parameters to add to ffmpeg commandline.

+

+

+
+ +

Return Value

+ + + + + + +
array() +
+ + + +
+
+ +

+
in DefaultAudio at line 44
+ public string + getAudioCodec() +

+
+

Returns the audio codec.

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
in DefaultAudio at line 57
+ public + setAudioCodec(string $audioCodec) +

+
+

Sets the audio codec, Should be in the available ones, otherwise an exception is thrown.

+

+

+
+

Parameters

+ + + + + + + +
string$audioCodec +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultAudio at line 74
+ public integer + getAudioKiloBitrate() +

+
+

Gets the audio kiloBitrate value.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
in DefaultAudio at line 85
+ public + setAudioKiloBitrate(integer $kiloBitrate) +

+
+

Sets the kiloBitrate value.

+

+

+
+

Parameters

+ + + + + + + +
integer$kiloBitrate +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultAudio at line 99
+ public integer + getAudioChannels() +

+
+

Gets the audio channels value.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
in DefaultAudio at line 110
+ public + setAudioChannels(integer $channels) +

+
+

Sets the channels value.

+

+

+
+

Parameters

+ + + + + + + +
integer$channels +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultAudio at line 124
+ public array + createProgressListener(MediaTypeInterface $media, FFProbe $ffprobe, Integer $pass, Integer $total) +

+
+

Creates the progress listener.

+

+

+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + +
MediaTypeInterface$media +
FFProbe$ffprobe +
Integer$passThe current pas snumber
Integer$totalThe total pass number
+ + +

Return Value

+ + + + + + +
arrayAn array of listeners
+ + + +
+
+ +

+
in DefaultAudio at line 138
+ public string + getPasses() +

+
+

Returns the number of passes.

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
at line 19
+ public + __construct() +

+
+

+

+

+

+
+ + + +
+
+ +

+
at line 27
+ public array + getAvailableAudioCodecs() +

+
+

Returns the list of available audio codecs for this format.

+

+

+
+ +

Return Value

+ + + + + + +
array +
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Audio/DefaultAudio.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Audio/DefaultAudio.html new file mode 100644 index 0000000000..5cbc856534 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Audio/DefaultAudio.html @@ -0,0 +1,430 @@ + + + + + + FFMpeg\Format\Audio\DefaultAudio | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Format\Audio\DefaultAudio

+
+
+

abstract class + DefaultAudio extends EventEmitter implements + AudioInterface, ProgressableInterface

+ + + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ array() + + getExtraParams() +

Returns an array of extra parameters to add to ffmpeg commandline.

+
+ string + + getAudioCodec() +

Returns the audio codec.

+
+ + + setAudioCodec(string $audioCodec) +

Sets the audio codec, Should be in the available ones, otherwise an exception is thrown.

+
+ integer + + getAudioKiloBitrate() +

Gets the audio kiloBitrate value.

+
+ + + setAudioKiloBitrate(integer $kiloBitrate) +

Sets the kiloBitrate value.

+
+ integer + + getAudioChannels() +

Gets the audio channels value.

+
+ + + setAudioChannels(integer $channels) +

Sets the channels value.

+
+ array + + createProgressListener(MediaTypeInterface $media, FFProbe $ffprobe, Integer $pass, Integer $total) +

Creates the progress listener.

+
+ string + + getPasses() +

Returns the number of passes.

+
+ + +

Details

+ +

+
at line 36
+ public array() + getExtraParams() +

+
+

Returns an array of extra parameters to add to ffmpeg commandline.

+

+

+
+ +

Return Value

+ + + + + + +
array() +
+ + + +
+
+ +

+
at line 44
+ public string + getAudioCodec() +

+
+

Returns the audio codec.

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
at line 57
+ public + setAudioCodec(string $audioCodec) +

+
+

Sets the audio codec, Should be in the available ones, otherwise an exception is thrown.

+

+

+
+

Parameters

+ + + + + + + +
string$audioCodec +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
at line 74
+ public integer + getAudioKiloBitrate() +

+
+

Gets the audio kiloBitrate value.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
at line 85
+ public + setAudioKiloBitrate(integer $kiloBitrate) +

+
+

Sets the kiloBitrate value.

+

+

+
+

Parameters

+ + + + + + + +
integer$kiloBitrate +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
at line 99
+ public integer + getAudioChannels() +

+
+

Gets the audio channels value.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
at line 110
+ public + setAudioChannels(integer $channels) +

+
+

Sets the channels value.

+

+

+
+

Parameters

+ + + + + + + +
integer$channels +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
at line 124
+ public array + createProgressListener(MediaTypeInterface $media, FFProbe $ffprobe, Integer $pass, Integer $total) +

+
+

Creates the progress listener.

+

+

+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + +
MediaTypeInterface$media +
FFProbe$ffprobe +
Integer$passThe current pas snumber
Integer$totalThe total pass number
+ + +

Return Value

+ + + + + + +
arrayAn array of listeners
+ + + +
+
+ +

+
at line 138
+ public string + getPasses() +

+
+

Returns the number of passes.

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Audio/Flac.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Audio/Flac.html new file mode 100644 index 0000000000..51d67eecc6 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Audio/Flac.html @@ -0,0 +1,498 @@ + + + + + + FFMpeg\Format\Audio\Flac | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Format\Audio\Flac

+
+
+

class + Flac extends DefaultAudio

+ +
+

The Flac audio format

+

+

+
+ + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ array() + + getExtraParams() +

Returns an array of extra parameters to add to ffmpeg commandline.

+
from DefaultAudio
+ string + + getAudioCodec() +

Returns the audio codec.

+
from DefaultAudio
+ + + setAudioCodec(string $audioCodec) +

Sets the audio codec, Should be in the available ones, otherwise an exception is thrown.

+
from DefaultAudio
+ integer + + getAudioKiloBitrate() +

Gets the audio kiloBitrate value.

+
from DefaultAudio
+ + + setAudioKiloBitrate(integer $kiloBitrate) +

Sets the kiloBitrate value.

+
from DefaultAudio
+ integer + + getAudioChannels() +

Gets the audio channels value.

+
from DefaultAudio
+ + + setAudioChannels(integer $channels) +

Sets the channels value.

+
from DefaultAudio
+ array + + createProgressListener(MediaTypeInterface $media, FFProbe $ffprobe, Integer $pass, Integer $total) +

Creates the progress listener.

+
from DefaultAudio
+ string + + getPasses() +

Returns the number of passes.

+
from DefaultAudio
+ + + __construct() +

+

+
+ array + + getAvailableAudioCodecs() +

Returns the list of available audio codecs for this format.

+
+ + +

Details

+ +

+
in DefaultAudio at line 36
+ public array() + getExtraParams() +

+
+

Returns an array of extra parameters to add to ffmpeg commandline.

+

+

+
+ +

Return Value

+ + + + + + +
array() +
+ + + +
+
+ +

+
in DefaultAudio at line 44
+ public string + getAudioCodec() +

+
+

Returns the audio codec.

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
in DefaultAudio at line 57
+ public + setAudioCodec(string $audioCodec) +

+
+

Sets the audio codec, Should be in the available ones, otherwise an exception is thrown.

+

+

+
+

Parameters

+ + + + + + + +
string$audioCodec +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultAudio at line 74
+ public integer + getAudioKiloBitrate() +

+
+

Gets the audio kiloBitrate value.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
in DefaultAudio at line 85
+ public + setAudioKiloBitrate(integer $kiloBitrate) +

+
+

Sets the kiloBitrate value.

+

+

+
+

Parameters

+ + + + + + + +
integer$kiloBitrate +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultAudio at line 99
+ public integer + getAudioChannels() +

+
+

Gets the audio channels value.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
in DefaultAudio at line 110
+ public + setAudioChannels(integer $channels) +

+
+

Sets the channels value.

+

+

+
+

Parameters

+ + + + + + + +
integer$channels +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultAudio at line 124
+ public array + createProgressListener(MediaTypeInterface $media, FFProbe $ffprobe, Integer $pass, Integer $total) +

+
+

Creates the progress listener.

+

+

+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + +
MediaTypeInterface$media +
FFProbe$ffprobe +
Integer$passThe current pas snumber
Integer$totalThe total pass number
+ + +

Return Value

+ + + + + + +
arrayAn array of listeners
+ + + +
+
+ +

+
in DefaultAudio at line 138
+ public string + getPasses() +

+
+

Returns the number of passes.

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
at line 19
+ public + __construct() +

+
+

+

+

+

+
+ + + +
+
+ +

+
at line 27
+ public array + getAvailableAudioCodecs() +

+
+

Returns the list of available audio codecs for this format.

+

+

+
+ +

Return Value

+ + + + + + +
array +
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Audio/Mp3.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Audio/Mp3.html new file mode 100644 index 0000000000..4a86cfc063 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Audio/Mp3.html @@ -0,0 +1,498 @@ + + + + + + FFMpeg\Format\Audio\Mp3 | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Format\Audio\Mp3

+
+
+

class + Mp3 extends DefaultAudio

+ +
+

The MP3 audio format

+

+

+
+ + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ array() + + getExtraParams() +

Returns an array of extra parameters to add to ffmpeg commandline.

+
from DefaultAudio
+ string + + getAudioCodec() +

Returns the audio codec.

+
from DefaultAudio
+ + + setAudioCodec(string $audioCodec) +

Sets the audio codec, Should be in the available ones, otherwise an exception is thrown.

+
from DefaultAudio
+ integer + + getAudioKiloBitrate() +

Gets the audio kiloBitrate value.

+
from DefaultAudio
+ + + setAudioKiloBitrate(integer $kiloBitrate) +

Sets the kiloBitrate value.

+
from DefaultAudio
+ integer + + getAudioChannels() +

Gets the audio channels value.

+
from DefaultAudio
+ + + setAudioChannels(integer $channels) +

Sets the channels value.

+
from DefaultAudio
+ array + + createProgressListener(MediaTypeInterface $media, FFProbe $ffprobe, Integer $pass, Integer $total) +

Creates the progress listener.

+
from DefaultAudio
+ string + + getPasses() +

Returns the number of passes.

+
from DefaultAudio
+ + + __construct() +

+

+
+ array + + getAvailableAudioCodecs() +

Returns the list of available audio codecs for this format.

+
+ + +

Details

+ +

+
in DefaultAudio at line 36
+ public array() + getExtraParams() +

+
+

Returns an array of extra parameters to add to ffmpeg commandline.

+

+

+
+ +

Return Value

+ + + + + + +
array() +
+ + + +
+
+ +

+
in DefaultAudio at line 44
+ public string + getAudioCodec() +

+
+

Returns the audio codec.

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
in DefaultAudio at line 57
+ public + setAudioCodec(string $audioCodec) +

+
+

Sets the audio codec, Should be in the available ones, otherwise an exception is thrown.

+

+

+
+

Parameters

+ + + + + + + +
string$audioCodec +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultAudio at line 74
+ public integer + getAudioKiloBitrate() +

+
+

Gets the audio kiloBitrate value.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
in DefaultAudio at line 85
+ public + setAudioKiloBitrate(integer $kiloBitrate) +

+
+

Sets the kiloBitrate value.

+

+

+
+

Parameters

+ + + + + + + +
integer$kiloBitrate +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultAudio at line 99
+ public integer + getAudioChannels() +

+
+

Gets the audio channels value.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
in DefaultAudio at line 110
+ public + setAudioChannels(integer $channels) +

+
+

Sets the channels value.

+

+

+
+

Parameters

+ + + + + + + +
integer$channels +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultAudio at line 124
+ public array + createProgressListener(MediaTypeInterface $media, FFProbe $ffprobe, Integer $pass, Integer $total) +

+
+

Creates the progress listener.

+

+

+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + +
MediaTypeInterface$media +
FFProbe$ffprobe +
Integer$passThe current pas snumber
Integer$totalThe total pass number
+ + +

Return Value

+ + + + + + +
arrayAn array of listeners
+ + + +
+
+ +

+
in DefaultAudio at line 138
+ public string + getPasses() +

+
+

Returns the number of passes.

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
at line 19
+ public + __construct() +

+
+

+

+

+

+
+ + + +
+
+ +

+
at line 27
+ public array + getAvailableAudioCodecs() +

+
+

Returns the list of available audio codecs for this format.

+

+

+
+ +

Return Value

+ + + + + + +
array +
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Audio/Vorbis.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Audio/Vorbis.html new file mode 100644 index 0000000000..d9964ae2fe --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Audio/Vorbis.html @@ -0,0 +1,498 @@ + + + + + + FFMpeg\Format\Audio\Vorbis | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Format\Audio\Vorbis

+
+
+

class + Vorbis extends DefaultAudio

+ +
+

The Vorbis audio format

+

+

+
+ + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ array() + + getExtraParams() +

Returns an array of extra parameters to add to ffmpeg commandline.

+
+ string + + getAudioCodec() +

Returns the audio codec.

+
from DefaultAudio
+ + + setAudioCodec(string $audioCodec) +

Sets the audio codec, Should be in the available ones, otherwise an exception is thrown.

+
from DefaultAudio
+ integer + + getAudioKiloBitrate() +

Gets the audio kiloBitrate value.

+
from DefaultAudio
+ + + setAudioKiloBitrate(integer $kiloBitrate) +

Sets the kiloBitrate value.

+
from DefaultAudio
+ integer + + getAudioChannels() +

Gets the audio channels value.

+
from DefaultAudio
+ + + setAudioChannels(integer $channels) +

Sets the channels value.

+
from DefaultAudio
+ array + + createProgressListener(MediaTypeInterface $media, FFProbe $ffprobe, Integer $pass, Integer $total) +

Creates the progress listener.

+
from DefaultAudio
+ string + + getPasses() +

Returns the number of passes.

+
from DefaultAudio
+ + + __construct() +

+

+
+ array + + getAvailableAudioCodecs() +

Returns the list of available audio codecs for this format.

+
+ + +

Details

+ +

+
at line 27
+ public array() + getExtraParams() +

+
+

Returns an array of extra parameters to add to ffmpeg commandline.

+

+

+
+ +

Return Value

+ + + + + + +
array() +
+ + + +
+
+ +

+
in DefaultAudio at line 44
+ public string + getAudioCodec() +

+
+

Returns the audio codec.

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
in DefaultAudio at line 57
+ public + setAudioCodec(string $audioCodec) +

+
+

Sets the audio codec, Should be in the available ones, otherwise an exception is thrown.

+

+

+
+

Parameters

+ + + + + + + +
string$audioCodec +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultAudio at line 74
+ public integer + getAudioKiloBitrate() +

+
+

Gets the audio kiloBitrate value.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
in DefaultAudio at line 85
+ public + setAudioKiloBitrate(integer $kiloBitrate) +

+
+

Sets the kiloBitrate value.

+

+

+
+

Parameters

+ + + + + + + +
integer$kiloBitrate +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultAudio at line 99
+ public integer + getAudioChannels() +

+
+

Gets the audio channels value.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
in DefaultAudio at line 110
+ public + setAudioChannels(integer $channels) +

+
+

Sets the channels value.

+

+

+
+

Parameters

+ + + + + + + +
integer$channels +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultAudio at line 124
+ public array + createProgressListener(MediaTypeInterface $media, FFProbe $ffprobe, Integer $pass, Integer $total) +

+
+

Creates the progress listener.

+

+

+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + +
MediaTypeInterface$media +
FFProbe$ffprobe +
Integer$passThe current pas snumber
Integer$totalThe total pass number
+ + +

Return Value

+ + + + + + +
arrayAn array of listeners
+ + + +
+
+ +

+
in DefaultAudio at line 138
+ public string + getPasses() +

+
+

Returns the number of passes.

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
at line 19
+ public + __construct() +

+
+

+

+

+

+
+ + + +
+
+ +

+
at line 35
+ public array + getAvailableAudioCodecs() +

+
+

Returns the list of available audio codecs for this format.

+

+

+
+ +

Return Value

+ + + + + + +
array +
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Audio/Wav.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Audio/Wav.html new file mode 100644 index 0000000000..01bcef31ca --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Audio/Wav.html @@ -0,0 +1,498 @@ + + + + + + FFMpeg\Format\Audio\Wav | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Format\Audio\Wav

+
+
+

class + Wav extends DefaultAudio

+ +
+

The WAV audio format

+

+

+
+ + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ array() + + getExtraParams() +

Returns an array of extra parameters to add to ffmpeg commandline.

+
from DefaultAudio
+ string + + getAudioCodec() +

Returns the audio codec.

+
from DefaultAudio
+ + + setAudioCodec(string $audioCodec) +

Sets the audio codec, Should be in the available ones, otherwise an exception is thrown.

+
from DefaultAudio
+ integer + + getAudioKiloBitrate() +

Gets the audio kiloBitrate value.

+
from DefaultAudio
+ + + setAudioKiloBitrate(integer $kiloBitrate) +

Sets the kiloBitrate value.

+
from DefaultAudio
+ integer + + getAudioChannels() +

Gets the audio channels value.

+
from DefaultAudio
+ + + setAudioChannels(integer $channels) +

Sets the channels value.

+
from DefaultAudio
+ array + + createProgressListener(MediaTypeInterface $media, FFProbe $ffprobe, Integer $pass, Integer $total) +

Creates the progress listener.

+
from DefaultAudio
+ string + + getPasses() +

Returns the number of passes.

+
from DefaultAudio
+ + + __construct() +

+

+
+ array + + getAvailableAudioCodecs() +

Returns the list of available audio codecs for this format.

+
+ + +

Details

+ +

+
in DefaultAudio at line 36
+ public array() + getExtraParams() +

+
+

Returns an array of extra parameters to add to ffmpeg commandline.

+

+

+
+ +

Return Value

+ + + + + + +
array() +
+ + + +
+
+ +

+
in DefaultAudio at line 44
+ public string + getAudioCodec() +

+
+

Returns the audio codec.

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
in DefaultAudio at line 57
+ public + setAudioCodec(string $audioCodec) +

+
+

Sets the audio codec, Should be in the available ones, otherwise an exception is thrown.

+

+

+
+

Parameters

+ + + + + + + +
string$audioCodec +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultAudio at line 74
+ public integer + getAudioKiloBitrate() +

+
+

Gets the audio kiloBitrate value.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
in DefaultAudio at line 85
+ public + setAudioKiloBitrate(integer $kiloBitrate) +

+
+

Sets the kiloBitrate value.

+

+

+
+

Parameters

+ + + + + + + +
integer$kiloBitrate +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultAudio at line 99
+ public integer + getAudioChannels() +

+
+

Gets the audio channels value.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
in DefaultAudio at line 110
+ public + setAudioChannels(integer $channels) +

+
+

Sets the channels value.

+

+

+
+

Parameters

+ + + + + + + +
integer$channels +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultAudio at line 124
+ public array + createProgressListener(MediaTypeInterface $media, FFProbe $ffprobe, Integer $pass, Integer $total) +

+
+

Creates the progress listener.

+

+

+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + +
MediaTypeInterface$media +
FFProbe$ffprobe +
Integer$passThe current pas snumber
Integer$totalThe total pass number
+ + +

Return Value

+ + + + + + +
arrayAn array of listeners
+ + + +
+
+ +

+
in DefaultAudio at line 138
+ public string + getPasses() +

+
+

Returns the number of passes.

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
at line 19
+ public + __construct() +

+
+

+

+

+

+
+ + + +
+
+ +

+
at line 27
+ public array + getAvailableAudioCodecs() +

+
+

Returns the list of available audio codecs for this format.

+

+

+
+ +

Return Value

+ + + + + + +
array +
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Audio/namespace-frame.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Audio/namespace-frame.html new file mode 100644 index 0000000000..f4b09eefb3 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Audio/namespace-frame.html @@ -0,0 +1,9 @@ + + + + + + FFMpeg\Format\Audio | PHP-FFMpeg API + + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/AudioInterface.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/AudioInterface.html new file mode 100644 index 0000000000..2414fd0cdc --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/AudioInterface.html @@ -0,0 +1,263 @@ + + + + + + FFMpeg\Format\AudioInterface | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Interface
+

FFMpeg\Format\AudioInterface

+
+
+

interface + AudioInterface implements + FormatInterface

+ + + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ string + + getPasses() +

Returns the number of passes.

+
from FormatInterface
+ array() + + getExtraParams() +

Returns an array of extra parameters to add to ffmpeg commandline.

+
from FormatInterface
+ integer + + getAudioKiloBitrate() +

Gets the audio kiloBitrate value.

+
+ integer + + getAudioChannels() +

Gets the audio channels value.

+
+ string + + getAudioCodec() +

Returns the audio codec.

+
+ array + + getAvailableAudioCodecs() +

Returns the list of available audio codecs for this format.

+
+ + +

Details

+ +

+
in FormatInterface at line 20
+ public string + getPasses() +

+
+

Returns the number of passes.

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
in FormatInterface at line 27
+ public array() + getExtraParams() +

+
+

Returns an array of extra parameters to add to ffmpeg commandline.

+

+

+
+ +

Return Value

+ + + + + + +
array() +
+ + + +
+
+ +

+
at line 20
+ public integer + getAudioKiloBitrate() +

+
+

Gets the audio kiloBitrate value.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
at line 27
+ public integer + getAudioChannels() +

+
+

Gets the audio channels value.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
at line 34
+ public string + getAudioCodec() +

+
+

Returns the audio codec.

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
at line 41
+ public array + getAvailableAudioCodecs() +

+
+

Returns the list of available audio codecs for this format.

+

+

+
+ +

Return Value

+ + + + + + +
array +
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/FormatInterface.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/FormatInterface.html new file mode 100644 index 0000000000..965ca386e0 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/FormatInterface.html @@ -0,0 +1,118 @@ + + + + + + FFMpeg\Format\FormatInterface | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Interface
+

FFMpeg\Format\FormatInterface

+
+
+

interface + FormatInterface

+ + + + +

Methods

+ + + + + + + + + + + + +
+ string + + getPasses() +

Returns the number of passes.

+
+ array() + + getExtraParams() +

Returns an array of extra parameters to add to ffmpeg commandline.

+
+ + +

Details

+ +

+
at line 20
+ public string + getPasses() +

+
+

Returns the number of passes.

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
at line 27
+ public array() + getExtraParams() +

+
+

Returns an array of extra parameters to add to ffmpeg commandline.

+

+

+
+ +

Return Value

+ + + + + + +
array() +
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/FrameInterface.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/FrameInterface.html new file mode 100644 index 0000000000..0b5e7c56ba --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/FrameInterface.html @@ -0,0 +1,119 @@ + + + + + + FFMpeg\Format\FrameInterface | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Interface
+

FFMpeg\Format\FrameInterface

+
+
+

interface + FrameInterface implements + FormatInterface

+ + + + +

Methods

+ + + + + + + + + + + + +
+ string + + getPasses() +

Returns the number of passes.

+
from FormatInterface
+ array() + + getExtraParams() +

Returns an array of extra parameters to add to ffmpeg commandline.

+
from FormatInterface
+ + +

Details

+ +

+
in FormatInterface at line 20
+ public string + getPasses() +

+
+

Returns the number of passes.

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
in FormatInterface at line 27
+ public array() + getExtraParams() +

+
+

Returns an array of extra parameters to add to ffmpeg commandline.

+

+

+
+ +

Return Value

+ + + + + + +
array() +
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/ProgressListener.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/ProgressListener.html new file mode 100644 index 0000000000..33f886a3ce --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/ProgressListener.html @@ -0,0 +1,48 @@ + + + + + + FFMpeg\Format\ProgressListener | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Namespace
+

FFMpeg\Format\ProgressListener

+
+
+ + + + + + + + + + + + + +
AbstractProgressListener +
AudioProgressListenerParses ffmpeg stderr progress information.
VideoProgressListenerParses ffmpeg stderr progress information for video files.
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/ProgressListener/AbstractProgressListener.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/ProgressListener/AbstractProgressListener.html new file mode 100644 index 0000000000..3870e2eaff --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/ProgressListener/AbstractProgressListener.html @@ -0,0 +1,333 @@ + + + + + + FFMpeg\Format\ProgressListener\AbstractProgressListener | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Format\ProgressListener\AbstractProgressListener

+
+
+

abstract class + AbstractProgressListener extends EventEmitter implements + ListenerInterface

+ + + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + __construct(FFProbe $ffprobe, string $pathfile, integer $currentPass, integer $totalPass) +

+

+
+ FFProbe + + getFFProbe() +

+

+
+ string + + getPathfile() +

+

+
+ integer + + getCurrentPass() +

+

+
+ integer + + getTotalPass() +

+

+
+ + + handle($type, $data) +

{@inheritdoc}

+
+ + + forwardedEvents() +

{@inheritdoc}

+
+ + +

Details

+ +

+
at line 83
+ public + __construct(FFProbe $ffprobe, string $pathfile, integer $currentPass, integer $totalPass) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + +
FFProbe$ffprobe +
string$pathfile +
integer$currentPassThe cureent pass number
integer$totalPassThe total number of passes
+ + + +

Exceptions

+ + + + + + +
RuntimeException +
+ + +
+
+ +

+
at line 94
+ public FFProbe + getFFProbe() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
FFProbe +
+ + + +
+
+ +

+
at line 102
+ public string + getPathfile() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
at line 110
+ public integer + getCurrentPass() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
at line 118
+ public integer + getTotalPass() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
at line 126
+ public + handle($type, $data) +

+
+

{@inheritdoc}

+

+

+
+

Parameters

+ + + + + + + + + + + + +
$type +
$data +
+ + + + +
+
+ +

+
at line 136
+ public + forwardedEvents() +

+
+

{@inheritdoc}

+

+

+
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/ProgressListener/AudioProgressListener.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/ProgressListener/AudioProgressListener.html new file mode 100644 index 0000000000..004efbf905 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/ProgressListener/AudioProgressListener.html @@ -0,0 +1,369 @@ + + + + + + FFMpeg\Format\ProgressListener\AudioProgressListener | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Format\ProgressListener\AudioProgressListener

+
+
+

class + AudioProgressListener extends AbstractProgressListener

+ +
+

Parses ffmpeg stderr progress information.

+

An example:

+ +
+      size=    3552kB time=00:03:47.29 bitrate= 128.0kbits/s
+
+

+
+ + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + __construct(FFProbe $ffprobe, string $pathfile, integer $currentPass, integer $totalPass) +

+

+
from AbstractProgressListener
+ FFProbe + + getFFProbe() +

+

+
from AbstractProgressListener
+ string + + getPathfile() +

+

+
from AbstractProgressListener
+ integer + + getCurrentPass() +

+

+
from AbstractProgressListener
+ integer + + getTotalPass() +

+

+
from AbstractProgressListener
+ + + handle($type, $data) +

{@inheritdoc}

+
from AbstractProgressListener
+ + + forwardedEvents() +

{@inheritdoc}

+
from AbstractProgressListener
+ + + getPattern() +

+

+
+ + +

Details

+ +

+ + public + __construct(FFProbe $ffprobe, string $pathfile, integer $currentPass, integer $totalPass) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + +
FFProbe$ffprobe +
string$pathfile +
integer$currentPassThe cureent pass number
integer$totalPassThe total number of passes
+ + + +

Exceptions

+ + + + + + +
RuntimeException +
+ + +
+
+ +

+ + public FFProbe + getFFProbe() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
FFProbe +
+ + + +
+
+ +

+ + public string + getPathfile() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+ + public integer + getCurrentPass() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+ + public integer + getTotalPass() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+ + public + handle($type, $data) +

+
+

{@inheritdoc}

+

+

+
+

Parameters

+ + + + + + + + + + + + +
$type +
$data +
+ + + + +
+
+ +

+ + public + forwardedEvents() +

+
+

{@inheritdoc}

+

+

+
+ + + +
+
+ +

+
at line 25
+ public + getPattern() +

+
+

+

+

+

+
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/ProgressListener/VideoProgressListener.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/ProgressListener/VideoProgressListener.html new file mode 100644 index 0000000000..14761b8207 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/ProgressListener/VideoProgressListener.html @@ -0,0 +1,369 @@ + + + + + + FFMpeg\Format\ProgressListener\VideoProgressListener | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Format\ProgressListener\VideoProgressListener

+
+
+

class + VideoProgressListener extends AbstractProgressListener

+ +
+

Parses ffmpeg stderr progress information for video files.

+

An example:

+ +
+      frame=  171 fps=0.0 q=10.0 size=      18kB time=00:00:05.72 bitrate=  26.4kbits/s dup=8 drop=0
+
+

+
+ + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + __construct(FFProbe $ffprobe, string $pathfile, integer $currentPass, integer $totalPass) +

+

+
from AbstractProgressListener
+ FFProbe + + getFFProbe() +

+

+
from AbstractProgressListener
+ string + + getPathfile() +

+

+
from AbstractProgressListener
+ integer + + getCurrentPass() +

+

+
from AbstractProgressListener
+ integer + + getTotalPass() +

+

+
from AbstractProgressListener
+ + + handle($type, $data) +

{@inheritdoc}

+
from AbstractProgressListener
+ + + forwardedEvents() +

{@inheritdoc}

+
from AbstractProgressListener
+ + + getPattern() +

+

+
+ + +

Details

+ +

+ + public + __construct(FFProbe $ffprobe, string $pathfile, integer $currentPass, integer $totalPass) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + +
FFProbe$ffprobe +
string$pathfile +
integer$currentPassThe cureent pass number
integer$totalPassThe total number of passes
+ + + +

Exceptions

+ + + + + + +
RuntimeException +
+ + +
+
+ +

+ + public FFProbe + getFFProbe() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
FFProbe +
+ + + +
+
+ +

+ + public string + getPathfile() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+ + public integer + getCurrentPass() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+ + public integer + getTotalPass() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+ + public + handle($type, $data) +

+
+

{@inheritdoc}

+

+

+
+

Parameters

+ + + + + + + + + + + + +
$type +
$data +
+ + + + +
+
+ +

+ + public + forwardedEvents() +

+
+

{@inheritdoc}

+

+

+
+ + + +
+
+ +

+
at line 25
+ public + getPattern() +

+
+

+

+

+

+
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/ProgressListener/namespace-frame.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/ProgressListener/namespace-frame.html new file mode 100644 index 0000000000..751cbbef94 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/ProgressListener/namespace-frame.html @@ -0,0 +1,9 @@ + + + + + + FFMpeg\Format\ProgressListener | PHP-FFMpeg API + + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/ProgressableInterface.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/ProgressableInterface.html new file mode 100644 index 0000000000..c1e26b4dd8 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/ProgressableInterface.html @@ -0,0 +1,109 @@ + + + + + + FFMpeg\Format\ProgressableInterface | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Interface
+

FFMpeg\Format\ProgressableInterface

+
+
+

interface + ProgressableInterface implements + EventEmitterInterface

+ + + + +

Methods

+ + + + + + + +
+ array + + createProgressListener(MediaTypeInterface $media, FFProbe $ffprobe, Integer $pass, Integer $total) +

Creates the progress listener.

+
+ + +

Details

+ +

+
at line 30
+ public array + createProgressListener(MediaTypeInterface $media, FFProbe $ffprobe, Integer $pass, Integer $total) +

+
+

Creates the progress listener.

+

+

+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + +
MediaTypeInterface$media +
FFProbe$ffprobe +
Integer$passThe current pas snumber
Integer$totalThe total pass number
+ + +

Return Value

+ + + + + + +
arrayAn array of listeners
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Video.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Video.html new file mode 100644 index 0000000000..a98c230a4d --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Video.html @@ -0,0 +1,59 @@ + + + + + + FFMpeg\Format\Video | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Namespace
+

FFMpeg\Format\Video

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
DefaultVideoThe abstract default Video format
OggThe Ogg video format
WMVThe WMV video format
WMV3The WMV video format
WebMThe WebM video format
X264The X264 video format
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Video/DefaultVideo.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Video/DefaultVideo.html new file mode 100644 index 0000000000..f80fbd3515 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Video/DefaultVideo.html @@ -0,0 +1,639 @@ + + + + + + FFMpeg\Format\Video\DefaultVideo | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Format\Video\DefaultVideo

+
+
+

abstract class + DefaultVideo extends DefaultAudio implements + VideoInterface

+ +
+

The abstract default Video format

+

+

+
+ + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ array() + + getExtraParams() +

Returns an array of extra parameters to add to ffmpeg commandline.

+
from DefaultAudio
+ string + + getAudioCodec() +

Returns the audio codec.

+
from DefaultAudio
+ + + setAudioCodec(string $audioCodec) +

Sets the audio codec, Should be in the available ones, otherwise an exception is thrown.

+
from DefaultAudio
+ integer + + getAudioKiloBitrate() +

Gets the audio kiloBitrate value.

+
from DefaultAudio
+ + + setAudioKiloBitrate(integer $kiloBitrate) +

Sets the kiloBitrate value.

+
from DefaultAudio
+ integer + + getAudioChannels() +

Gets the audio channels value.

+
from DefaultAudio
+ + + setAudioChannels(integer $channels) +

Sets the channels value.

+
from DefaultAudio
+ array + + createProgressListener(MediaTypeInterface $media, FFProbe $ffprobe, Integer $pass, Integer $total) +

Creates the progress listener.

+
+ string + + getPasses() +

Returns the number of passes.

+
from DefaultAudio
+ integer + + getKiloBitrate() +

Gets the kiloBitrate value.

+
+ + + setKiloBitrate(integer $kiloBitrate) +

Sets the kiloBitrate value.

+
+ string + + getVideoCodec() +

Returns the video codec.

+
+ + + setVideoCodec(string $videoCodec) +

Sets the video codec, Should be in the available ones, otherwise an exception is thrown.

+
+ integer + + getModulus() +

+

+
+ + +

Details

+ +

+
in DefaultAudio at line 36
+ public array() + getExtraParams() +

+
+

Returns an array of extra parameters to add to ffmpeg commandline.

+

+

+
+ +

Return Value

+ + + + + + +
array() +
+ + + +
+
+ +

+
in DefaultAudio at line 44
+ public string + getAudioCodec() +

+
+

Returns the audio codec.

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
in DefaultAudio at line 57
+ public + setAudioCodec(string $audioCodec) +

+
+

Sets the audio codec, Should be in the available ones, otherwise an exception is thrown.

+

+

+
+

Parameters

+ + + + + + + +
string$audioCodec +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultAudio at line 74
+ public integer + getAudioKiloBitrate() +

+
+

Gets the audio kiloBitrate value.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
in DefaultAudio at line 85
+ public + setAudioKiloBitrate(integer $kiloBitrate) +

+
+

Sets the kiloBitrate value.

+

+

+
+

Parameters

+ + + + + + + +
integer$kiloBitrate +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultAudio at line 99
+ public integer + getAudioChannels() +

+
+

Gets the audio channels value.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
in DefaultAudio at line 110
+ public + setAudioChannels(integer $channels) +

+
+

Sets the channels value.

+

+

+
+

Parameters

+ + + + + + + +
integer$channels +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
at line 100
+ public array + createProgressListener(MediaTypeInterface $media, FFProbe $ffprobe, Integer $pass, Integer $total) +

+
+

Creates the progress listener.

+

+

+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + +
MediaTypeInterface$media +
FFProbe$ffprobe +
Integer$passThe current pas snumber
Integer$totalThe total pass number
+ + +

Return Value

+ + + + + + +
arrayAn array of listeners
+ + + +
+
+ +

+
in DefaultAudio at line 138
+ public string + getPasses() +

+
+

Returns the number of passes.

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
at line 38
+ public integer + getKiloBitrate() +

+
+

Gets the kiloBitrate value.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
at line 49
+ public + setKiloBitrate(integer $kiloBitrate) +

+
+

Sets the kiloBitrate value.

+

+

+
+

Parameters

+ + + + + + + +
integer$kiloBitrate +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
at line 63
+ public string + getVideoCodec() +

+
+

Returns the video codec.

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
at line 75
+ public + setVideoCodec(string $videoCodec) +

+
+

Sets the video codec, Should be in the available ones, otherwise an exception is thrown.

+

+

+
+

Parameters

+ + + + + + + +
string$videoCodec +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
at line 92
+ public integer + getModulus() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Video/Ogg.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Video/Ogg.html new file mode 100644 index 0000000000..f7acf6e13a --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Video/Ogg.html @@ -0,0 +1,791 @@ + + + + + + FFMpeg\Format\Video\Ogg | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Format\Video\Ogg

+
+
+

class + Ogg extends DefaultVideo

+ +
+

The Ogg video format

+

+

+
+ + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ array() + + getExtraParams() +

Returns an array of extra parameters to add to ffmpeg commandline.

+
from DefaultAudio
+ string + + getAudioCodec() +

Returns the audio codec.

+
from DefaultAudio
+ + + setAudioCodec(string $audioCodec) +

Sets the audio codec, Should be in the available ones, otherwise an exception is thrown.

+
from DefaultAudio
+ integer + + getAudioKiloBitrate() +

Gets the audio kiloBitrate value.

+
from DefaultAudio
+ + + setAudioKiloBitrate(integer $kiloBitrate) +

Sets the kiloBitrate value.

+
from DefaultAudio
+ integer + + getAudioChannels() +

Gets the audio channels value.

+
from DefaultAudio
+ + + setAudioChannels(integer $channels) +

Sets the channels value.

+
from DefaultAudio
+ array + + createProgressListener(MediaTypeInterface $media, FFProbe $ffprobe, Integer $pass, Integer $total) +

Creates the progress listener.

+
from DefaultVideo
+ string + + getPasses() +

Returns the number of passes.

+
from DefaultAudio
+ integer + + getKiloBitrate() +

Gets the kiloBitrate value.

+
from DefaultVideo
+ + + setKiloBitrate(integer $kiloBitrate) +

Sets the kiloBitrate value.

+
from DefaultVideo
+ string + + getVideoCodec() +

Returns the video codec.

+
from DefaultVideo
+ + + setVideoCodec(string $videoCodec) +

Sets the video codec, Should be in the available ones, otherwise an exception is thrown.

+
from DefaultVideo
+ integer + + getModulus() +

+

+
from DefaultVideo
+ + + __construct($audioCodec = 'libvorbis', $videoCodec = 'libtheora') +

+

+
+ Boolean + + supportBFrames() +

Returns true if the current format supports B-Frames.

+
+ array + + getAvailableAudioCodecs() +

Returns the list of available audio codecs for this format.

+
+ array + + getAvailableVideoCodecs() +

Returns the list of available video codecs for this format.

+
+ + +

Details

+ +

+
in DefaultAudio at line 36
+ public array() + getExtraParams() +

+
+

Returns an array of extra parameters to add to ffmpeg commandline.

+

+

+
+ +

Return Value

+ + + + + + +
array() +
+ + + +
+
+ +

+
in DefaultAudio at line 44
+ public string + getAudioCodec() +

+
+

Returns the audio codec.

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
in DefaultAudio at line 57
+ public + setAudioCodec(string $audioCodec) +

+
+

Sets the audio codec, Should be in the available ones, otherwise an exception is thrown.

+

+

+
+

Parameters

+ + + + + + + +
string$audioCodec +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultAudio at line 74
+ public integer + getAudioKiloBitrate() +

+
+

Gets the audio kiloBitrate value.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
in DefaultAudio at line 85
+ public + setAudioKiloBitrate(integer $kiloBitrate) +

+
+

Sets the kiloBitrate value.

+

+

+
+

Parameters

+ + + + + + + +
integer$kiloBitrate +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultAudio at line 99
+ public integer + getAudioChannels() +

+
+

Gets the audio channels value.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
in DefaultAudio at line 110
+ public + setAudioChannels(integer $channels) +

+
+

Sets the channels value.

+

+

+
+

Parameters

+ + + + + + + +
integer$channels +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultVideo at line 100
+ public array + createProgressListener(MediaTypeInterface $media, FFProbe $ffprobe, Integer $pass, Integer $total) +

+
+

Creates the progress listener.

+

+

+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + +
MediaTypeInterface$media +
FFProbe$ffprobe +
Integer$passThe current pas snumber
Integer$totalThe total pass number
+ + +

Return Value

+ + + + + + +
arrayAn array of listeners
+ + + +
+
+ +

+
in DefaultAudio at line 138
+ public string + getPasses() +

+
+

Returns the number of passes.

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
in DefaultVideo at line 38
+ public integer + getKiloBitrate() +

+
+

Gets the kiloBitrate value.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
in DefaultVideo at line 49
+ public + setKiloBitrate(integer $kiloBitrate) +

+
+

Sets the kiloBitrate value.

+

+

+
+

Parameters

+ + + + + + + +
integer$kiloBitrate +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultVideo at line 63
+ public string + getVideoCodec() +

+
+

Returns the video codec.

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
in DefaultVideo at line 75
+ public + setVideoCodec(string $videoCodec) +

+
+

Sets the video codec, Should be in the available ones, otherwise an exception is thrown.

+

+

+
+

Parameters

+ + + + + + + +
string$videoCodec +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultVideo at line 92
+ public integer + getModulus() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
at line 19
+ public + __construct($audioCodec = 'libvorbis', $videoCodec = 'libtheora') +

+
+

+

+

+

+
+

Parameters

+ + + + + + + + + + + + +
$audioCodec +
$videoCodec +
+ + + + +
+
+ +

+
at line 29
+ public Boolean + supportBFrames() +

+
+

Returns true if the current format supports B-Frames.

+

+

+
+ +

Return Value

+ + + + + + +
Boolean +
+ + + +
+
+ +

+
at line 37
+ public array + getAvailableAudioCodecs() +

+
+

Returns the list of available audio codecs for this format.

+

+

+
+ +

Return Value

+ + + + + + +
array +
+ + + +
+
+ +

+
at line 45
+ public array + getAvailableVideoCodecs() +

+
+

Returns the list of available video codecs for this format.

+

+

+
+ +

Return Value

+ + + + + + +
array +
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Video/WMV.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Video/WMV.html new file mode 100644 index 0000000000..d1d6f1eacc --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Video/WMV.html @@ -0,0 +1,791 @@ + + + + + + FFMpeg\Format\Video\WMV | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Format\Video\WMV

+
+
+

class + WMV extends DefaultVideo

+ +
+

The WMV video format

+

+

+
+ + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ array() + + getExtraParams() +

Returns an array of extra parameters to add to ffmpeg commandline.

+
from DefaultAudio
+ string + + getAudioCodec() +

Returns the audio codec.

+
from DefaultAudio
+ + + setAudioCodec(string $audioCodec) +

Sets the audio codec, Should be in the available ones, otherwise an exception is thrown.

+
from DefaultAudio
+ integer + + getAudioKiloBitrate() +

Gets the audio kiloBitrate value.

+
from DefaultAudio
+ + + setAudioKiloBitrate(integer $kiloBitrate) +

Sets the kiloBitrate value.

+
from DefaultAudio
+ integer + + getAudioChannels() +

Gets the audio channels value.

+
from DefaultAudio
+ + + setAudioChannels(integer $channels) +

Sets the channels value.

+
from DefaultAudio
+ array + + createProgressListener(MediaTypeInterface $media, FFProbe $ffprobe, Integer $pass, Integer $total) +

Creates the progress listener.

+
from DefaultVideo
+ string + + getPasses() +

Returns the number of passes.

+
from DefaultAudio
+ integer + + getKiloBitrate() +

Gets the kiloBitrate value.

+
from DefaultVideo
+ + + setKiloBitrate(integer $kiloBitrate) +

Sets the kiloBitrate value.

+
from DefaultVideo
+ string + + getVideoCodec() +

Returns the video codec.

+
from DefaultVideo
+ + + setVideoCodec(string $videoCodec) +

Sets the video codec, Should be in the available ones, otherwise an exception is thrown.

+
from DefaultVideo
+ integer + + getModulus() +

+

+
from DefaultVideo
+ + + __construct($audioCodec = 'wmav2', $videoCodec = 'wmv2') +

+

+
+ Boolean + + supportBFrames() +

Returns true if the current format supports B-Frames.

+
+ array + + getAvailableAudioCodecs() +

Returns the list of available audio codecs for this format.

+
+ array + + getAvailableVideoCodecs() +

Returns the list of available video codecs for this format.

+
+ + +

Details

+ +

+
in DefaultAudio at line 36
+ public array() + getExtraParams() +

+
+

Returns an array of extra parameters to add to ffmpeg commandline.

+

+

+
+ +

Return Value

+ + + + + + +
array() +
+ + + +
+
+ +

+
in DefaultAudio at line 44
+ public string + getAudioCodec() +

+
+

Returns the audio codec.

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
in DefaultAudio at line 57
+ public + setAudioCodec(string $audioCodec) +

+
+

Sets the audio codec, Should be in the available ones, otherwise an exception is thrown.

+

+

+
+

Parameters

+ + + + + + + +
string$audioCodec +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultAudio at line 74
+ public integer + getAudioKiloBitrate() +

+
+

Gets the audio kiloBitrate value.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
in DefaultAudio at line 85
+ public + setAudioKiloBitrate(integer $kiloBitrate) +

+
+

Sets the kiloBitrate value.

+

+

+
+

Parameters

+ + + + + + + +
integer$kiloBitrate +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultAudio at line 99
+ public integer + getAudioChannels() +

+
+

Gets the audio channels value.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
in DefaultAudio at line 110
+ public + setAudioChannels(integer $channels) +

+
+

Sets the channels value.

+

+

+
+

Parameters

+ + + + + + + +
integer$channels +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultVideo at line 100
+ public array + createProgressListener(MediaTypeInterface $media, FFProbe $ffprobe, Integer $pass, Integer $total) +

+
+

Creates the progress listener.

+

+

+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + +
MediaTypeInterface$media +
FFProbe$ffprobe +
Integer$passThe current pas snumber
Integer$totalThe total pass number
+ + +

Return Value

+ + + + + + +
arrayAn array of listeners
+ + + +
+
+ +

+
in DefaultAudio at line 138
+ public string + getPasses() +

+
+

Returns the number of passes.

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
in DefaultVideo at line 38
+ public integer + getKiloBitrate() +

+
+

Gets the kiloBitrate value.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
in DefaultVideo at line 49
+ public + setKiloBitrate(integer $kiloBitrate) +

+
+

Sets the kiloBitrate value.

+

+

+
+

Parameters

+ + + + + + + +
integer$kiloBitrate +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultVideo at line 63
+ public string + getVideoCodec() +

+
+

Returns the video codec.

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
in DefaultVideo at line 75
+ public + setVideoCodec(string $videoCodec) +

+
+

Sets the video codec, Should be in the available ones, otherwise an exception is thrown.

+

+

+
+

Parameters

+ + + + + + + +
string$videoCodec +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultVideo at line 92
+ public integer + getModulus() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
at line 19
+ public + __construct($audioCodec = 'wmav2', $videoCodec = 'wmv2') +

+
+

+

+

+

+
+

Parameters

+ + + + + + + + + + + + +
$audioCodec +
$videoCodec +
+ + + + +
+
+ +

+
at line 29
+ public Boolean + supportBFrames() +

+
+

Returns true if the current format supports B-Frames.

+

+

+
+ +

Return Value

+ + + + + + +
Boolean +
+ + + +
+
+ +

+
at line 37
+ public array + getAvailableAudioCodecs() +

+
+

Returns the list of available audio codecs for this format.

+

+

+
+ +

Return Value

+ + + + + + +
array +
+ + + +
+
+ +

+
at line 45
+ public array + getAvailableVideoCodecs() +

+
+

Returns the list of available video codecs for this format.

+

+

+
+ +

Return Value

+ + + + + + +
array +
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Video/WMV3.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Video/WMV3.html new file mode 100644 index 0000000000..326a2b205a --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Video/WMV3.html @@ -0,0 +1,791 @@ + + + + + + FFMpeg\Format\Video\WMV3 | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Format\Video\WMV3

+
+
+

class + WMV3 extends DefaultVideo

+ +
+

The WMV video format

+

+

+
+ + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ array() + + getExtraParams() +

Returns an array of extra parameters to add to ffmpeg commandline.

+
from DefaultAudio
+ string + + getAudioCodec() +

Returns the audio codec.

+
from DefaultAudio
+ + + setAudioCodec(string $audioCodec) +

Sets the audio codec, Should be in the available ones, otherwise an exception is thrown.

+
from DefaultAudio
+ integer + + getAudioKiloBitrate() +

Gets the audio kiloBitrate value.

+
from DefaultAudio
+ + + setAudioKiloBitrate(integer $kiloBitrate) +

Sets the kiloBitrate value.

+
from DefaultAudio
+ integer + + getAudioChannels() +

Gets the audio channels value.

+
from DefaultAudio
+ + + setAudioChannels(integer $channels) +

Sets the channels value.

+
from DefaultAudio
+ array + + createProgressListener(MediaTypeInterface $media, FFProbe $ffprobe, Integer $pass, Integer $total) +

Creates the progress listener.

+
from DefaultVideo
+ string + + getPasses() +

Returns the number of passes.

+
from DefaultAudio
+ integer + + getKiloBitrate() +

Gets the kiloBitrate value.

+
from DefaultVideo
+ + + setKiloBitrate(integer $kiloBitrate) +

Sets the kiloBitrate value.

+
from DefaultVideo
+ string + + getVideoCodec() +

Returns the video codec.

+
from DefaultVideo
+ + + setVideoCodec(string $videoCodec) +

Sets the video codec, Should be in the available ones, otherwise an exception is thrown.

+
from DefaultVideo
+ integer + + getModulus() +

+

+
from DefaultVideo
+ + + __construct($audioCodec = 'wmav3', $videoCodec = 'wmv3') +

+

+
+ Boolean + + supportBFrames() +

Returns true if the current format supports B-Frames.

+
+ array + + getAvailableAudioCodecs() +

Returns the list of available audio codecs for this format.

+
+ array + + getAvailableVideoCodecs() +

Returns the list of available video codecs for this format.

+
+ + +

Details

+ +

+
in DefaultAudio at line 36
+ public array() + getExtraParams() +

+
+

Returns an array of extra parameters to add to ffmpeg commandline.

+

+

+
+ +

Return Value

+ + + + + + +
array() +
+ + + +
+
+ +

+
in DefaultAudio at line 44
+ public string + getAudioCodec() +

+
+

Returns the audio codec.

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
in DefaultAudio at line 57
+ public + setAudioCodec(string $audioCodec) +

+
+

Sets the audio codec, Should be in the available ones, otherwise an exception is thrown.

+

+

+
+

Parameters

+ + + + + + + +
string$audioCodec +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultAudio at line 74
+ public integer + getAudioKiloBitrate() +

+
+

Gets the audio kiloBitrate value.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
in DefaultAudio at line 85
+ public + setAudioKiloBitrate(integer $kiloBitrate) +

+
+

Sets the kiloBitrate value.

+

+

+
+

Parameters

+ + + + + + + +
integer$kiloBitrate +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultAudio at line 99
+ public integer + getAudioChannels() +

+
+

Gets the audio channels value.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
in DefaultAudio at line 110
+ public + setAudioChannels(integer $channels) +

+
+

Sets the channels value.

+

+

+
+

Parameters

+ + + + + + + +
integer$channels +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultVideo at line 100
+ public array + createProgressListener(MediaTypeInterface $media, FFProbe $ffprobe, Integer $pass, Integer $total) +

+
+

Creates the progress listener.

+

+

+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + +
MediaTypeInterface$media +
FFProbe$ffprobe +
Integer$passThe current pas snumber
Integer$totalThe total pass number
+ + +

Return Value

+ + + + + + +
arrayAn array of listeners
+ + + +
+
+ +

+
in DefaultAudio at line 138
+ public string + getPasses() +

+
+

Returns the number of passes.

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
in DefaultVideo at line 38
+ public integer + getKiloBitrate() +

+
+

Gets the kiloBitrate value.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
in DefaultVideo at line 49
+ public + setKiloBitrate(integer $kiloBitrate) +

+
+

Sets the kiloBitrate value.

+

+

+
+

Parameters

+ + + + + + + +
integer$kiloBitrate +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultVideo at line 63
+ public string + getVideoCodec() +

+
+

Returns the video codec.

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
in DefaultVideo at line 75
+ public + setVideoCodec(string $videoCodec) +

+
+

Sets the video codec, Should be in the available ones, otherwise an exception is thrown.

+

+

+
+

Parameters

+ + + + + + + +
string$videoCodec +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultVideo at line 92
+ public integer + getModulus() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
at line 19
+ public + __construct($audioCodec = 'wmav3', $videoCodec = 'wmv3') +

+
+

+

+

+

+
+

Parameters

+ + + + + + + + + + + + +
$audioCodec +
$videoCodec +
+ + + + +
+
+ +

+
at line 29
+ public Boolean + supportBFrames() +

+
+

Returns true if the current format supports B-Frames.

+

+

+
+ +

Return Value

+ + + + + + +
Boolean +
+ + + +
+
+ +

+
at line 37
+ public array + getAvailableAudioCodecs() +

+
+

Returns the list of available audio codecs for this format.

+

+

+
+ +

Return Value

+ + + + + + +
array +
+ + + +
+
+ +

+
at line 45
+ public array + getAvailableVideoCodecs() +

+
+

Returns the list of available video codecs for this format.

+

+

+
+ +

Return Value

+ + + + + + +
array +
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Video/WebM.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Video/WebM.html new file mode 100644 index 0000000000..e274c362a3 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Video/WebM.html @@ -0,0 +1,791 @@ + + + + + + FFMpeg\Format\Video\WebM | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Format\Video\WebM

+
+
+

class + WebM extends DefaultVideo

+ +
+

The WebM video format

+

+

+
+ + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ array() + + getExtraParams() +

Returns an array of extra parameters to add to ffmpeg commandline.

+
+ string + + getAudioCodec() +

Returns the audio codec.

+
from DefaultAudio
+ + + setAudioCodec(string $audioCodec) +

Sets the audio codec, Should be in the available ones, otherwise an exception is thrown.

+
from DefaultAudio
+ integer + + getAudioKiloBitrate() +

Gets the audio kiloBitrate value.

+
from DefaultAudio
+ + + setAudioKiloBitrate(integer $kiloBitrate) +

Sets the kiloBitrate value.

+
from DefaultAudio
+ integer + + getAudioChannels() +

Gets the audio channels value.

+
from DefaultAudio
+ + + setAudioChannels(integer $channels) +

Sets the channels value.

+
from DefaultAudio
+ array + + createProgressListener(MediaTypeInterface $media, FFProbe $ffprobe, Integer $pass, Integer $total) +

Creates the progress listener.

+
from DefaultVideo
+ string + + getPasses() +

Returns the number of passes.

+
from DefaultAudio
+ integer + + getKiloBitrate() +

Gets the kiloBitrate value.

+
from DefaultVideo
+ + + setKiloBitrate(integer $kiloBitrate) +

Sets the kiloBitrate value.

+
from DefaultVideo
+ string + + getVideoCodec() +

Returns the video codec.

+
from DefaultVideo
+ + + setVideoCodec(string $videoCodec) +

Sets the video codec, Should be in the available ones, otherwise an exception is thrown.

+
from DefaultVideo
+ integer + + getModulus() +

+

+
from DefaultVideo
+ + + __construct($audioCodec = 'libvorbis', $videoCodec = 'libvpx') +

+

+
+ Boolean + + supportBFrames() +

Returns true if the current format supports B-Frames.

+
+ array + + getAvailableAudioCodecs() +

Returns the list of available audio codecs for this format.

+
+ array + + getAvailableVideoCodecs() +

Returns the list of available video codecs for this format.

+
+ + +

Details

+ +

+
at line 37
+ public array() + getExtraParams() +

+
+

Returns an array of extra parameters to add to ffmpeg commandline.

+

+

+
+ +

Return Value

+ + + + + + +
array() +
+ + + +
+
+ +

+
in DefaultAudio at line 44
+ public string + getAudioCodec() +

+
+

Returns the audio codec.

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
in DefaultAudio at line 57
+ public + setAudioCodec(string $audioCodec) +

+
+

Sets the audio codec, Should be in the available ones, otherwise an exception is thrown.

+

+

+
+

Parameters

+ + + + + + + +
string$audioCodec +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultAudio at line 74
+ public integer + getAudioKiloBitrate() +

+
+

Gets the audio kiloBitrate value.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
in DefaultAudio at line 85
+ public + setAudioKiloBitrate(integer $kiloBitrate) +

+
+

Sets the kiloBitrate value.

+

+

+
+

Parameters

+ + + + + + + +
integer$kiloBitrate +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultAudio at line 99
+ public integer + getAudioChannels() +

+
+

Gets the audio channels value.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
in DefaultAudio at line 110
+ public + setAudioChannels(integer $channels) +

+
+

Sets the channels value.

+

+

+
+

Parameters

+ + + + + + + +
integer$channels +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultVideo at line 100
+ public array + createProgressListener(MediaTypeInterface $media, FFProbe $ffprobe, Integer $pass, Integer $total) +

+
+

Creates the progress listener.

+

+

+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + +
MediaTypeInterface$media +
FFProbe$ffprobe +
Integer$passThe current pas snumber
Integer$totalThe total pass number
+ + +

Return Value

+ + + + + + +
arrayAn array of listeners
+ + + +
+
+ +

+
in DefaultAudio at line 138
+ public string + getPasses() +

+
+

Returns the number of passes.

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
in DefaultVideo at line 38
+ public integer + getKiloBitrate() +

+
+

Gets the kiloBitrate value.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
in DefaultVideo at line 49
+ public + setKiloBitrate(integer $kiloBitrate) +

+
+

Sets the kiloBitrate value.

+

+

+
+

Parameters

+ + + + + + + +
integer$kiloBitrate +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultVideo at line 63
+ public string + getVideoCodec() +

+
+

Returns the video codec.

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
in DefaultVideo at line 75
+ public + setVideoCodec(string $videoCodec) +

+
+

Sets the video codec, Should be in the available ones, otherwise an exception is thrown.

+

+

+
+

Parameters

+ + + + + + + +
string$videoCodec +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultVideo at line 92
+ public integer + getModulus() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
at line 19
+ public + __construct($audioCodec = 'libvorbis', $videoCodec = 'libvpx') +

+
+

+

+

+

+
+

Parameters

+ + + + + + + + + + + + +
$audioCodec +
$videoCodec +
+ + + + +
+
+ +

+
at line 29
+ public Boolean + supportBFrames() +

+
+

Returns true if the current format supports B-Frames.

+

+

+
+ +

Return Value

+ + + + + + +
Boolean +
+ + + +
+
+ +

+
at line 45
+ public array + getAvailableAudioCodecs() +

+
+

Returns the list of available audio codecs for this format.

+

+

+
+ +

Return Value

+ + + + + + +
array +
+ + + +
+
+ +

+
at line 53
+ public array + getAvailableVideoCodecs() +

+
+

Returns the list of available video codecs for this format.

+

+

+
+ +

Return Value

+ + + + + + +
array +
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Video/X264.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Video/X264.html new file mode 100644 index 0000000000..bcf7d527f6 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Video/X264.html @@ -0,0 +1,875 @@ + + + + + + FFMpeg\Format\Video\X264 | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Format\Video\X264

+
+
+

class + X264 extends DefaultVideo

+ +
+

The X264 video format

+

+

+
+ + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ array() + + getExtraParams() +

Returns an array of extra parameters to add to ffmpeg commandline.

+
from DefaultAudio
+ string + + getAudioCodec() +

Returns the audio codec.

+
from DefaultAudio
+ + + setAudioCodec(string $audioCodec) +

Sets the audio codec, Should be in the available ones, otherwise an exception is thrown.

+
from DefaultAudio
+ integer + + getAudioKiloBitrate() +

Gets the audio kiloBitrate value.

+
from DefaultAudio
+ + + setAudioKiloBitrate(integer $kiloBitrate) +

Sets the kiloBitrate value.

+
from DefaultAudio
+ integer + + getAudioChannels() +

Gets the audio channels value.

+
from DefaultAudio
+ + + setAudioChannels(integer $channels) +

Sets the channels value.

+
from DefaultAudio
+ array + + createProgressListener(MediaTypeInterface $media, FFProbe $ffprobe, Integer $pass, Integer $total) +

Creates the progress listener.

+
from DefaultVideo
+ integer + + setPasses(integer $passes) +

Sets the number of passes.

+
+ integer + + getPasses() +

Returns the number of passes.

+
+ integer + + getKiloBitrate() +

Gets the kiloBitrate value.

+
from DefaultVideo
+ + + setKiloBitrate(integer $kiloBitrate) +

Sets the kiloBitrate value.

+
from DefaultVideo
+ string + + getVideoCodec() +

Returns the video codec.

+
from DefaultVideo
+ + + setVideoCodec(string $videoCodec) +

Sets the video codec, Should be in the available ones, otherwise an exception is thrown.

+
from DefaultVideo
+ int + + getModulus() +

+

+
+ + + __construct($audioCodec = 'libfaac', $videoCodec = 'libx264') +

+

+
+ Boolean + + supportBFrames() +

Returns true if the current format supports B-Frames.

+
+ X264 + + setBFramesSupport($support $support) +

+

+
+ array + + getAvailableAudioCodecs() +

Returns the list of available audio codecs for this format.

+
+ array + + getAvailableVideoCodecs() +

Returns the list of available video codecs for this format.

+
+ + +

Details

+ +

+
in DefaultAudio at line 36
+ public array() + getExtraParams() +

+
+

Returns an array of extra parameters to add to ffmpeg commandline.

+

+

+
+ +

Return Value

+ + + + + + +
array() +
+ + + +
+
+ +

+
in DefaultAudio at line 44
+ public string + getAudioCodec() +

+
+

Returns the audio codec.

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
in DefaultAudio at line 57
+ public + setAudioCodec(string $audioCodec) +

+
+

Sets the audio codec, Should be in the available ones, otherwise an exception is thrown.

+

+

+
+

Parameters

+ + + + + + + +
string$audioCodec +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultAudio at line 74
+ public integer + getAudioKiloBitrate() +

+
+

Gets the audio kiloBitrate value.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
in DefaultAudio at line 85
+ public + setAudioKiloBitrate(integer $kiloBitrate) +

+
+

Sets the kiloBitrate value.

+

+

+
+

Parameters

+ + + + + + + +
integer$kiloBitrate +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultAudio at line 99
+ public integer + getAudioChannels() +

+
+

Gets the audio channels value.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
in DefaultAudio at line 110
+ public + setAudioChannels(integer $channels) +

+
+

Sets the channels value.

+

+

+
+

Parameters

+ + + + + + + +
integer$channels +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultVideo at line 100
+ public array + createProgressListener(MediaTypeInterface $media, FFProbe $ffprobe, Integer $pass, Integer $total) +

+
+

Creates the progress listener.

+

+

+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + +
MediaTypeInterface$media +
FFProbe$ffprobe +
Integer$passThe current pas snumber
Integer$totalThe total pass number
+ + +

Return Value

+ + + + + + +
arrayAn array of listeners
+ + + +
+
+ +

+
in X264 at line 68
+ public integer + setPasses(integer $passes) +

+
+

Sets the number of passes.

+

+

+
+ +

Parameters

+ + + + + + +
integer$passes
+ + + +
+
+ +

+
in X264 at line 79
+ public integer + getPasses() +

+
+

Returns the number of passes.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
in DefaultVideo at line 38
+ public integer + getKiloBitrate() +

+
+

Gets the kiloBitrate value.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
in DefaultVideo at line 49
+ public + setKiloBitrate(integer $kiloBitrate) +

+
+

Sets the kiloBitrate value.

+

+

+
+

Parameters

+ + + + + + + +
integer$kiloBitrate +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
in DefaultVideo at line 63
+ public string + getVideoCodec() +

+
+

Returns the video codec.

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
in DefaultVideo at line 75
+ public + setVideoCodec(string $videoCodec) +

+
+

Sets the video codec, Should be in the available ones, otherwise an exception is thrown.

+

+

+
+

Parameters

+ + + + + + + +
string$videoCodec +
+ + + +

Exceptions

+ + + + + + +
InvalidArgumentException +
+ + +
+
+ +

+
at line 76
+ public int + getModulus() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
int +
+ + + +
+
+ +

+
at line 22
+ public + __construct($audioCodec = 'libfaac', $videoCodec = 'libx264') +

+
+

+

+

+

+
+

Parameters

+ + + + + + + + + + + + +
$audioCodec +
$videoCodec +
+ + + + +
+
+ +

+
at line 32
+ public Boolean + supportBFrames() +

+
+

Returns true if the current format supports B-Frames.

+

+

+
+ +

Return Value

+ + + + + + +
Boolean +
+ + + +
+
+ +

+
at line 42
+ public X264 + setBFramesSupport($support $support) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
$support$support +
+ + +

Return Value

+ + + + + + +
X264 +
+ + + +
+
+ +

+
at line 52
+ public array + getAvailableAudioCodecs() +

+
+

Returns the list of available audio codecs for this format.

+

+

+
+ +

Return Value

+ + + + + + +
array +
+ + + +
+
+ +

+
at line 60
+ public array + getAvailableVideoCodecs() +

+
+

Returns the list of available video codecs for this format.

+

+

+
+ +

Return Value

+ + + + + + +
array +
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Video/namespace-frame.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Video/namespace-frame.html new file mode 100644 index 0000000000..a70a0ed371 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/Video/namespace-frame.html @@ -0,0 +1,9 @@ + + + + + + FFMpeg\Format\Video | PHP-FFMpeg API + + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/VideoInterface.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/VideoInterface.html new file mode 100644 index 0000000000..a1e06245bf --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/VideoInterface.html @@ -0,0 +1,461 @@ + + + + + + FFMpeg\Format\VideoInterface | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Interface
+

FFMpeg\Format\VideoInterface

+
+
+

interface + VideoInterface implements + AudioInterface

+ + + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ string + + getPasses() +

Returns the number of passes.

+
from FormatInterface
+ array() + + getExtraParams() +

Returns an array of extra parameters to add to ffmpeg commandline.

+
from FormatInterface
+ integer + + getAudioKiloBitrate() +

Gets the audio kiloBitrate value.

+
from AudioInterface
+ integer + + getAudioChannels() +

Gets the audio channels value.

+
from AudioInterface
+ string + + getAudioCodec() +

Returns the audio codec.

+
from AudioInterface
+ array + + getAvailableAudioCodecs() +

Returns the list of available audio codecs for this format.

+
from AudioInterface
+ integer + + getKiloBitrate() +

Gets the kiloBitrate value.

+
+ integer + + getModulus() +

Returns the modulus used by the Resizable video.

+
+ string + + getVideoCodec() +

Returns the video codec.

+
+ Boolean + + supportBFrames() +

Returns true if the current format supports B-Frames.

+
+ array + + getAvailableVideoCodecs() +

Returns the list of available video codecs for this format.

+
+ + +

Details

+ +

+
in FormatInterface at line 20
+ public string + getPasses() +

+
+

Returns the number of passes.

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
in FormatInterface at line 27
+ public array() + getExtraParams() +

+
+

Returns an array of extra parameters to add to ffmpeg commandline.

+

+

+
+ +

Return Value

+ + + + + + +
array() +
+ + + +
+
+ +

+
in AudioInterface at line 20
+ public integer + getAudioKiloBitrate() +

+
+

Gets the audio kiloBitrate value.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
in AudioInterface at line 27
+ public integer + getAudioChannels() +

+
+

Gets the audio channels value.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
in AudioInterface at line 34
+ public string + getAudioCodec() +

+
+

Returns the audio codec.

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
in AudioInterface at line 41
+ public array + getAvailableAudioCodecs() +

+
+

Returns the list of available audio codecs for this format.

+

+

+
+ +

Return Value

+ + + + + + +
array +
+ + + +
+
+ +

+
at line 21
+ public integer + getKiloBitrate() +

+
+

Gets the kiloBitrate value.

+

+

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +
+
+ +

+
at line 33
+ public integer + getModulus() +

+
+

Returns the modulus used by the Resizable video.

+

This used to calculate the target dimensions while maintaining the best +aspect ratio.

+
+ +

Return Value

+ + + + + + +
integer +
+ + + +

See also

+ + + + + + +
http://www.undeadborn.net/tools/rescalculator.php
+ +
+
+ +

+
at line 40
+ public string + getVideoCodec() +

+
+

Returns the video codec.

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
at line 49
+ public Boolean + supportBFrames() +

+
+

Returns true if the current format supports B-Frames.

+

+

+
+ +

Return Value

+ + + + + + +
Boolean +
+ + + +

See also

+ + + + + + +
https://wikipedia.org/wiki/Video_compression_picture_types
+ +
+
+ +

+
at line 56
+ public array + getAvailableVideoCodecs() +

+
+

Returns the list of available video codecs for this format.

+

+

+
+ +

Return Value

+ + + + + + +
array +
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/namespace-frame.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/namespace-frame.html new file mode 100644 index 0000000000..2b65b23d47 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Format/namespace-frame.html @@ -0,0 +1,9 @@ + + + + + + FFMpeg\Format | PHP-FFMpeg API + + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Media.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Media.html new file mode 100644 index 0000000000..4db13bc7bd --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Media.html @@ -0,0 +1,68 @@ + + + + + + FFMpeg\Media | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Namespace
+

FFMpeg\Media

+
+
+ + + + + + + + + + + + + + + + + + + + + +
AbstractMediaType +
AbstractStreamableMedia +
Audio +
Frame +
Video +
+ +

Interfaces

+ + + + + +
MediaTypeInterface +
+ +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Media/AbstractMediaType.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Media/AbstractMediaType.html new file mode 100644 index 0000000000..cd83d5a80c --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Media/AbstractMediaType.html @@ -0,0 +1,397 @@ + + + + + + FFMpeg\Media\AbstractMediaType | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Media\AbstractMediaType

+
+
+

abstract class + AbstractMediaType implements + MediaTypeInterface

+ + + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + __construct($pathfile, FFMpegDriver $driver, FFProbe $ffprobe) +

+

+
+ FFMpegDriver + + getFFMpegDriver() +

+

+
+ MediaTypeInterface + + setFFMpegDriver(FFMpegDriver $driver) +

+

+
+ FFProbe + + getFFProbe() +

+

+
+ MediaTypeInterface + + setFFProbe(FFProbe $ffprobe) +

+

+
+ string + + getPathfile() +

+

+
+ MediaTypeInterface + + setFiltersCollection(FiltersCollection $filters) +

+

+
+ MediaTypeInterface + + getFiltersCollection() +

+

+
+ + +

Details

+ +

+
at line 29
+ public + __construct($pathfile, FFMpegDriver $driver, FFProbe $ffprobe) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + + + + + + + + + + + +
$pathfile +
FFMpegDriver$driver +
FFProbe$ffprobe +
+ + + + +
+
+ +

+
at line 40
+ public FFMpegDriver + getFFMpegDriver() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
FFMpegDriver +
+ + + +
+
+ +

+
at line 50
+ public MediaTypeInterface + setFFMpegDriver(FFMpegDriver $driver) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
FFMpegDriver$driver +
+ + +

Return Value

+ + + + + + +
MediaTypeInterface +
+ + + +
+
+ +

+
at line 60
+ public FFProbe + getFFProbe() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
FFProbe +
+ + + +
+
+ +

+
at line 70
+ public MediaTypeInterface + setFFProbe(FFProbe $ffprobe) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
FFProbe$ffprobe +
+ + +

Return Value

+ + + + + + +
MediaTypeInterface +
+ + + +
+
+ +

+
at line 80
+ public string + getPathfile() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
at line 90
+ public MediaTypeInterface + setFiltersCollection(FiltersCollection $filters) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
FiltersCollection$filters +
+ + +

Return Value

+ + + + + + +
MediaTypeInterface +
+ + + +
+
+ +

+
at line 100
+ public MediaTypeInterface + getFiltersCollection() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
MediaTypeInterface +
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Media/AbstractStreamableMedia.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Media/AbstractStreamableMedia.html new file mode 100644 index 0000000000..2957ac4dad --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Media/AbstractStreamableMedia.html @@ -0,0 +1,472 @@ + + + + + + FFMpeg\Media\AbstractStreamableMedia | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Media\AbstractStreamableMedia

+
+
+

abstract class + AbstractStreamableMedia extends AbstractMediaType

+ + + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + __construct($pathfile, FFMpegDriver $driver, FFProbe $ffprobe) +

+

+
from AbstractMediaType
+ FFMpegDriver + + getFFMpegDriver() +

+

+
from AbstractMediaType
+ MediaTypeInterface + + setFFMpegDriver(FFMpegDriver $driver) +

+

+
from AbstractMediaType
+ FFProbe + + getFFProbe() +

+

+
from AbstractMediaType
+ MediaTypeInterface + + setFFProbe(FFProbe $ffprobe) +

+

+
from AbstractMediaType
+ string + + getPathfile() +

+

+
from AbstractMediaType
+ MediaTypeInterface + + setFiltersCollection(FiltersCollection $filters) +

+

+
from AbstractMediaType
+ MediaTypeInterface + + getFiltersCollection() +

+

+
from AbstractMediaType
+ StreamCollection + + getStreams() +

+

+
+ Stream + + getFormat() +

+

+
+ + +

Details

+ +

+
in AbstractMediaType at line 29
+ public + __construct($pathfile, FFMpegDriver $driver, FFProbe $ffprobe) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + + + + + + + + + + + +
$pathfile +
FFMpegDriver$driver +
FFProbe$ffprobe +
+ + + + +
+
+ +

+
in AbstractMediaType at line 40
+ public FFMpegDriver + getFFMpegDriver() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
FFMpegDriver +
+ + + +
+
+ +

+
in AbstractMediaType at line 50
+ public MediaTypeInterface + setFFMpegDriver(FFMpegDriver $driver) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
FFMpegDriver$driver +
+ + +

Return Value

+ + + + + + +
MediaTypeInterface +
+ + + +
+
+ +

+
in AbstractMediaType at line 60
+ public FFProbe + getFFProbe() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
FFProbe +
+ + + +
+
+ +

+
in AbstractMediaType at line 70
+ public MediaTypeInterface + setFFProbe(FFProbe $ffprobe) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
FFProbe$ffprobe +
+ + +

Return Value

+ + + + + + +
MediaTypeInterface +
+ + + +
+
+ +

+
in AbstractMediaType at line 80
+ public string + getPathfile() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
in AbstractMediaType at line 90
+ public MediaTypeInterface + setFiltersCollection(FiltersCollection $filters) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
FiltersCollection$filters +
+ + +

Return Value

+ + + + + + +
MediaTypeInterface +
+ + + +
+
+ +

+
in AbstractMediaType at line 100
+ public MediaTypeInterface + getFiltersCollection() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
MediaTypeInterface +
+ + + +
+
+ +

+
at line 24
+ public StreamCollection + getStreams() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
StreamCollection +
+ + + +
+
+ +

+
at line 36
+ public Stream + getFormat() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
Stream +
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Media/Audio.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Media/Audio.html new file mode 100644 index 0000000000..afdb3fe81a --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Media/Audio.html @@ -0,0 +1,681 @@ + + + + + + FFMpeg\Media\Audio | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Media\Audio

+
+
+

class + Audio extends AbstractStreamableMedia

+ + + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + __construct($pathfile, FFMpegDriver $driver, FFProbe $ffprobe) +

+

+
from AbstractMediaType
+ FFMpegDriver + + getFFMpegDriver() +

+

+
from AbstractMediaType
+ MediaTypeInterface + + setFFMpegDriver(FFMpegDriver $driver) +

+

+
from AbstractMediaType
+ FFProbe + + getFFProbe() +

+

+
from AbstractMediaType
+ MediaTypeInterface + + setFFProbe(FFProbe $ffprobe) +

+

+
from AbstractMediaType
+ string + + getPathfile() +

+

+
from AbstractMediaType
+ MediaTypeInterface + + setFiltersCollection(FiltersCollection $filters) +

+

+
from AbstractMediaType
+ MediaTypeInterface + + getFiltersCollection() +

+

+
from AbstractMediaType
+ StreamCollection + + getStreams() +

+

+
from AbstractStreamableMedia
+ Stream + + getFormat() +

+

+
from AbstractStreamableMedia
+ AudioFilters + + filters() +

Returns the available filters.

+
+ Audio + + addFilter(FilterInterface $filter) +

{@inheritdoc}

+
+ Audio + + save(FormatInterface $format, string $outputPathfile) +

Exports the audio in the desired format, applies registered filters.

+
+ Audio + + waveform(integer $width, integer $height) +

Generates an image file representing the waveform of the audio file.

+
+ + +

Details

+ +

+
in AbstractMediaType at line 29
+ public + __construct($pathfile, FFMpegDriver $driver, FFProbe $ffprobe) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + + + + + + + + + + + +
$pathfile +
FFMpegDriver$driver +
FFProbe$ffprobe +
+ + + + +
+
+ +

+
in AbstractMediaType at line 40
+ public FFMpegDriver + getFFMpegDriver() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
FFMpegDriver +
+ + + +
+
+ +

+
in AbstractMediaType at line 50
+ public MediaTypeInterface + setFFMpegDriver(FFMpegDriver $driver) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
FFMpegDriver$driver +
+ + +

Return Value

+ + + + + + +
MediaTypeInterface +
+ + + +
+
+ +

+
in AbstractMediaType at line 60
+ public FFProbe + getFFProbe() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
FFProbe +
+ + + +
+
+ +

+
in AbstractMediaType at line 70
+ public MediaTypeInterface + setFFProbe(FFProbe $ffprobe) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
FFProbe$ffprobe +
+ + +

Return Value

+ + + + + + +
MediaTypeInterface +
+ + + +
+
+ +

+
in AbstractMediaType at line 80
+ public string + getPathfile() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
in AbstractMediaType at line 90
+ public MediaTypeInterface + setFiltersCollection(FiltersCollection $filters) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
FiltersCollection$filters +
+ + +

Return Value

+ + + + + + +
MediaTypeInterface +
+ + + +
+
+ +

+
in AbstractMediaType at line 100
+ public MediaTypeInterface + getFiltersCollection() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
MediaTypeInterface +
+ + + +
+
+ +

+ + public StreamCollection + getStreams() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
StreamCollection +
+ + + +
+
+ +

+ + public Stream + getFormat() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
Stream +
+ + + +
+
+ +

+
at line 31
+ public AudioFilters + filters() +

+
+

Returns the available filters.

+

+

+
+ +

Return Value

+ + + + + + +
AudioFilters +
+ + + +
+
+ +

+
at line 41
+ public Audio + addFilter(FilterInterface $filter) +

+
+

{@inheritdoc}

+

+

+
+

Parameters

+ + + + + + + +
FilterInterface$filter +
+ + +

Return Value

+ + + + + + +
Audio +
+ + + +
+
+ +

+
at line 62
+ public Audio + save(FormatInterface $format, string $outputPathfile) +

+
+

Exports the audio in the desired format, applies registered filters.

+

+

+
+

Parameters

+ + + + + + + + + + + + +
FormatInterface$format +
string$outputPathfile +
+ + +

Return Value

+ + + + + + +
Audio +
+ + +

Exceptions

+ + + + + + +
RuntimeException +
+ + +
+
+ +

+
at line 113
+ public Audio + save(FormatInterface $format, string $outputPathfile) +

+
+

Exports the audio in the desired format, applies registered filters.

+

+

+
+

Parameters

+ + + + + + + + + + + + +
FormatInterface$format +
string$outputPathfile +
+ + +

Return Value

+ + + + + + +
Audio +
+ + +

Exceptions

+ + + + + + +
RuntimeException +
+ + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Media/Frame.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Media/Frame.html new file mode 100644 index 0000000000..ec94835591 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Media/Frame.html @@ -0,0 +1,621 @@ + + + + + + FFMpeg\Media\Frame | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Media\Frame

+
+
+

class + Frame extends AbstractMediaType

+ + + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + __construct(Video $video, FFMpegDriver $driver, FFProbe $ffprobe, TimeCode $timecode) +

+

+
+ FFMpegDriver + + getFFMpegDriver() +

+

+
from AbstractMediaType
+ MediaTypeInterface + + setFFMpegDriver(FFMpegDriver $driver) +

+

+
from AbstractMediaType
+ FFProbe + + getFFProbe() +

+

+
from AbstractMediaType
+ MediaTypeInterface + + setFFProbe(FFProbe $ffprobe) +

+

+
from AbstractMediaType
+ string + + getPathfile() +

+

+
from AbstractMediaType
+ MediaTypeInterface + + setFiltersCollection(FiltersCollection $filters) +

+

+
from AbstractMediaType
+ MediaTypeInterface + + getFiltersCollection() +

+

+
from AbstractMediaType
+ Video + + getVideo() +

Returns the video related to the frame.

+
+ FrameFilters + + filters() +

Returns the available filters.

+
+ Frame + + addFilter(FrameFilterInterface $filter) +

{@inheritdoc}

+
+ TimeCode + + getTimeCode() +

+

+
+ Frame + + save(string $pathfile, Boolean $accurate = false) +

Saves the frame in the given filename.

+
+ + +

Details

+ +

+
at line 29
+ public + __construct(Video $video, FFMpegDriver $driver, FFProbe $ffprobe, TimeCode $timecode) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + +
Video$video +
FFMpegDriver$driver +
FFProbe$ffprobe +
TimeCode$timecode +
+ + + + +
+
+ +

+
in AbstractMediaType at line 40
+ public FFMpegDriver + getFFMpegDriver() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
FFMpegDriver +
+ + + +
+
+ +

+
in AbstractMediaType at line 50
+ public MediaTypeInterface + setFFMpegDriver(FFMpegDriver $driver) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
FFMpegDriver$driver +
+ + +

Return Value

+ + + + + + +
MediaTypeInterface +
+ + + +
+
+ +

+
in AbstractMediaType at line 60
+ public FFProbe + getFFProbe() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
FFProbe +
+ + + +
+
+ +

+
in AbstractMediaType at line 70
+ public MediaTypeInterface + setFFProbe(FFProbe $ffprobe) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
FFProbe$ffprobe +
+ + +

Return Value

+ + + + + + +
MediaTypeInterface +
+ + + +
+
+ +

+
in AbstractMediaType at line 80
+ public string + getPathfile() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
in AbstractMediaType at line 90
+ public MediaTypeInterface + setFiltersCollection(FiltersCollection $filters) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
FiltersCollection$filters +
+ + +

Return Value

+ + + + + + +
MediaTypeInterface +
+ + + +
+
+ +

+
in AbstractMediaType at line 100
+ public MediaTypeInterface + getFiltersCollection() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
MediaTypeInterface +
+ + + +
+
+ +

+
at line 41
+ public Video + getVideo() +

+
+

Returns the video related to the frame.

+

+

+
+ +

Return Value

+ + + + + + +
Video +
+ + + +
+
+ +

+
at line 51
+ public FrameFilters + filters() +

+
+

Returns the available filters.

+

+

+
+ +

Return Value

+ + + + + + +
FrameFilters +
+ + + +
+
+ +

+
at line 61
+ public Frame + addFilter(FrameFilterInterface $filter) +

+
+

{@inheritdoc}

+

+

+
+

Parameters

+ + + + + + + +
FrameFilterInterface$filter +
+ + +

Return Value

+ + + + + + +
Frame +
+ + + +
+
+ +

+
at line 71
+ public TimeCode + getTimeCode() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
TimeCode +
+ + + +
+
+ +

+
at line 88
+ public Frame + save(string $pathfile, Boolean $accurate = false) +

+
+

Saves the frame in the given filename.

+

Uses the unaccurate method by default.

+
+

Parameters

+ + + + + + + + + + + + +
string$pathfile +
Boolean$accurate +
+ + +

Return Value

+ + + + + + +
Frame +
+ + +

Exceptions

+ + + + + + +
RuntimeException +
+ + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Media/MediaTypeInterface.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Media/MediaTypeInterface.html new file mode 100644 index 0000000000..40e5f6f070 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Media/MediaTypeInterface.html @@ -0,0 +1,110 @@ + + + + + + FFMpeg\Media\MediaTypeInterface | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Interface
+

FFMpeg\Media\MediaTypeInterface

+
+
+

interface + MediaTypeInterface

+ + + + +

Methods

+ + + + + + + + + + + + +
+ + + filters() +

Returns the available filters.

+
+ string + + getPathfile() +

+

+
+ + +

Details

+ +

+
at line 19
+ public + filters() +

+
+

Returns the available filters.

+

+

+
+ + + +
+
+ +

+
at line 24
+ public string + getPathfile() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Media/Video.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Media/Video.html new file mode 100644 index 0000000000..ede67050d1 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Media/Video.html @@ -0,0 +1,665 @@ + + + + + + FFMpeg\Media\Video | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Media\Video

+
+
+

class + Video extends Audio

+ + + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + __construct($pathfile, FFMpegDriver $driver, FFProbe $ffprobe) +

+

+
from AbstractMediaType
+ FFMpegDriver + + getFFMpegDriver() +

+

+
from AbstractMediaType
+ MediaTypeInterface + + setFFMpegDriver(FFMpegDriver $driver) +

+

+
from AbstractMediaType
+ FFProbe + + getFFProbe() +

+

+
from AbstractMediaType
+ MediaTypeInterface + + setFFProbe(FFProbe $ffprobe) +

+

+
from AbstractMediaType
+ string + + getPathfile() +

+

+
from AbstractMediaType
+ MediaTypeInterface + + setFiltersCollection(FiltersCollection $filters) +

+

+
from AbstractMediaType
+ MediaTypeInterface + + getFiltersCollection() +

+

+
from AbstractMediaType
+ StreamCollection + + getStreams() +

+

+
from AbstractStreamableMedia
+ Stream + + getFormat() +

+

+
from AbstractStreamableMedia
+ VideoFilters + + filters() +

Returns the available filters.

+
+ Video + + addFilter(FilterInterface $filter) +

{@inheritdoc}

+
+ Video + + save(FormatInterface $format, string $outputPathfile) +

Exports the video in the desired format, applies registered filters.

+
+ Frame + + frame(TimeCode $at) +

Gets the frame at timecode.

+
+ + +

Details

+ +

+
in AbstractMediaType at line 29
+ public + __construct($pathfile, FFMpegDriver $driver, FFProbe $ffprobe) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + + + + + + + + + + + +
$pathfile +
FFMpegDriver$driver +
FFProbe$ffprobe +
+ + + + +
+
+ +

+
in AbstractMediaType at line 40
+ public FFMpegDriver + getFFMpegDriver() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
FFMpegDriver +
+ + + +
+
+ +

+
in AbstractMediaType at line 50
+ public MediaTypeInterface + setFFMpegDriver(FFMpegDriver $driver) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
FFMpegDriver$driver +
+ + +

Return Value

+ + + + + + +
MediaTypeInterface +
+ + + +
+
+ +

+
in AbstractMediaType at line 60
+ public FFProbe + getFFProbe() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
FFProbe +
+ + + +
+
+ +

+
in AbstractMediaType at line 70
+ public MediaTypeInterface + setFFProbe(FFProbe $ffprobe) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
FFProbe$ffprobe +
+ + +

Return Value

+ + + + + + +
MediaTypeInterface +
+ + + +
+
+ +

+
in AbstractMediaType at line 80
+ public string + getPathfile() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
in AbstractMediaType at line 90
+ public MediaTypeInterface + setFiltersCollection(FiltersCollection $filters) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
FiltersCollection$filters +
+ + +

Return Value

+ + + + + + +
MediaTypeInterface +
+ + + +
+
+ +

+
in AbstractMediaType at line 100
+ public MediaTypeInterface + getFiltersCollection() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
MediaTypeInterface +
+ + + +
+
+ +

+ + public StreamCollection + getStreams() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
StreamCollection +
+ + + +
+
+ +

+ + public Stream + getFormat() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
Stream +
+ + + +
+
+ +

+
at line 34
+ public VideoFilters + filters() +

+
+

Returns the available filters.

+

+

+
+ +

Return Value

+ + + + + + +
VideoFilters +
+ + + +
+
+ +

+
at line 44
+ public Video + addFilter(FilterInterface $filter) +

+
+

{@inheritdoc}

+

+

+
+

Parameters

+ + + + + + + +
FilterInterface$filter +
+ + +

Return Value

+ + + + + + +
Video +
+ + + +
+
+ +

+
at line 61
+ public Video + save(FormatInterface $format, string $outputPathfile) +

+
+

Exports the video in the desired format, applies registered filters.

+

+

+
+

Parameters

+ + + + + + + + + + + + +
FormatInterface$format +
string$outputPathfile +
+ + +

Return Value

+ + + + + + +
Video +
+ + +

Exceptions

+ + + + + + +
RuntimeException +
+ + +
+
+ +

+
at line 180
+ public Frame + frame(TimeCode $at) +

+
+

Gets the frame at timecode.

+

+

+
+

Parameters

+ + + + + + + +
TimeCode$at +
+ + +

Return Value

+ + + + + + +
Frame +
+ + + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Media/Waveform.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Media/Waveform.html new file mode 100644 index 0000000000..ec94835591 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Media/Waveform.html @@ -0,0 +1,621 @@ + + + + + + FFMpeg\Media\Frame | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Class
+

FFMpeg\Media\Frame

+
+
+

class + Frame extends AbstractMediaType

+ + + + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + __construct(Video $video, FFMpegDriver $driver, FFProbe $ffprobe, TimeCode $timecode) +

+

+
+ FFMpegDriver + + getFFMpegDriver() +

+

+
from AbstractMediaType
+ MediaTypeInterface + + setFFMpegDriver(FFMpegDriver $driver) +

+

+
from AbstractMediaType
+ FFProbe + + getFFProbe() +

+

+
from AbstractMediaType
+ MediaTypeInterface + + setFFProbe(FFProbe $ffprobe) +

+

+
from AbstractMediaType
+ string + + getPathfile() +

+

+
from AbstractMediaType
+ MediaTypeInterface + + setFiltersCollection(FiltersCollection $filters) +

+

+
from AbstractMediaType
+ MediaTypeInterface + + getFiltersCollection() +

+

+
from AbstractMediaType
+ Video + + getVideo() +

Returns the video related to the frame.

+
+ FrameFilters + + filters() +

Returns the available filters.

+
+ Frame + + addFilter(FrameFilterInterface $filter) +

{@inheritdoc}

+
+ TimeCode + + getTimeCode() +

+

+
+ Frame + + save(string $pathfile, Boolean $accurate = false) +

Saves the frame in the given filename.

+
+ + +

Details

+ +

+
at line 29
+ public + __construct(Video $video, FFMpegDriver $driver, FFProbe $ffprobe, TimeCode $timecode) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + +
Video$video +
FFMpegDriver$driver +
FFProbe$ffprobe +
TimeCode$timecode +
+ + + + +
+
+ +

+
in AbstractMediaType at line 40
+ public FFMpegDriver + getFFMpegDriver() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
FFMpegDriver +
+ + + +
+
+ +

+
in AbstractMediaType at line 50
+ public MediaTypeInterface + setFFMpegDriver(FFMpegDriver $driver) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
FFMpegDriver$driver +
+ + +

Return Value

+ + + + + + +
MediaTypeInterface +
+ + + +
+
+ +

+
in AbstractMediaType at line 60
+ public FFProbe + getFFProbe() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
FFProbe +
+ + + +
+
+ +

+
in AbstractMediaType at line 70
+ public MediaTypeInterface + setFFProbe(FFProbe $ffprobe) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
FFProbe$ffprobe +
+ + +

Return Value

+ + + + + + +
MediaTypeInterface +
+ + + +
+
+ +

+
in AbstractMediaType at line 80
+ public string + getPathfile() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
string +
+ + + +
+
+ +

+
in AbstractMediaType at line 90
+ public MediaTypeInterface + setFiltersCollection(FiltersCollection $filters) +

+
+

+

+

+

+
+

Parameters

+ + + + + + + +
FiltersCollection$filters +
+ + +

Return Value

+ + + + + + +
MediaTypeInterface +
+ + + +
+
+ +

+
in AbstractMediaType at line 100
+ public MediaTypeInterface + getFiltersCollection() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
MediaTypeInterface +
+ + + +
+
+ +

+
at line 41
+ public Video + getVideo() +

+
+

Returns the video related to the frame.

+

+

+
+ +

Return Value

+ + + + + + +
Video +
+ + + +
+
+ +

+
at line 51
+ public FrameFilters + filters() +

+
+

Returns the available filters.

+

+

+
+ +

Return Value

+ + + + + + +
FrameFilters +
+ + + +
+
+ +

+
at line 61
+ public Frame + addFilter(FrameFilterInterface $filter) +

+
+

{@inheritdoc}

+

+

+
+

Parameters

+ + + + + + + +
FrameFilterInterface$filter +
+ + +

Return Value

+ + + + + + +
Frame +
+ + + +
+
+ +

+
at line 71
+ public TimeCode + getTimeCode() +

+
+

+

+

+

+
+ +

Return Value

+ + + + + + +
TimeCode +
+ + + +
+
+ +

+
at line 88
+ public Frame + save(string $pathfile, Boolean $accurate = false) +

+
+

Saves the frame in the given filename.

+

Uses the unaccurate method by default.

+
+

Parameters

+ + + + + + + + + + + + +
string$pathfile +
Boolean$accurate +
+ + +

Return Value

+ + + + + + +
Frame +
+ + +

Exceptions

+ + + + + + +
RuntimeException +
+ + +
+
+ + +
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Media/namespace-frame.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Media/namespace-frame.html new file mode 100644 index 0000000000..c51cf487ba --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/Media/namespace-frame.html @@ -0,0 +1,9 @@ + + + + + + FFMpeg\Media | PHP-FFMpeg API + + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/namespace-frame.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/namespace-frame.html new file mode 100644 index 0000000000..906615153b --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/FFMpeg/namespace-frame.html @@ -0,0 +1,9 @@ + + + + + + FFMpeg | PHP-FFMpeg API + + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/PROJECT_VERSION b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/PROJECT_VERSION new file mode 100644 index 0000000000..8b25206ff9 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/PROJECT_VERSION @@ -0,0 +1 @@ +master \ No newline at end of file diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/SAMI_VERSION b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/SAMI_VERSION new file mode 100644 index 0000000000..5502090864 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/SAMI_VERSION @@ -0,0 +1 @@ +1.4-DEV \ No newline at end of file diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/classes-frame.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/classes-frame.html new file mode 100644 index 0000000000..8257872bef --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/classes-frame.html @@ -0,0 +1,9 @@ + + + + + + All Classes | PHP-FFMpeg API + + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/classes.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/classes.html new file mode 100644 index 0000000000..7e87425708 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/classes.html @@ -0,0 +1,638 @@ + + + + + + Classes | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +

Classes

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ FFMpeg\Coordinate\AspectRatio + + + +
+ FFMpeg\Coordinate\Dimension + + Dimension object, used for manipulating width and height couples +
+ FFMpeg\Coordinate\FrameRate + + + +
+ FFMpeg\Coordinate\Point + + + +
+ FFMpeg\Coordinate\TimeCode + + + +
+ FFMpeg\Driver\FFMpegDriver + + + +
+ FFMpeg\Driver\FFProbeDriver + + + +
+ FFMpeg\Exception\ExceptionInterface + + + +
+ FFMpeg\Exception\ExecutableNotFoundException + + + +
+ FFMpeg\Exception\InvalidArgumentException + + + +
+ FFMpeg\Exception\LogicException + + + +
+ FFMpeg\Exception\RuntimeException + + + +
+ FFMpeg\FFMpeg + + + +
+ FFMpeg\FFMpegServiceProvider + + + +
+ FFMpeg\FFProbe + + + +
+ FFMpeg\FFProbe\DataMapping\AbstractData + + + +
+ FFMpeg\FFProbe\DataMapping\Format + + + +
+ FFMpeg\FFProbe\DataMapping\Stream + + + +
+ FFMpeg\FFProbe\DataMapping\StreamCollection + + + +
+ FFMpeg\FFProbe\Mapper + + + +
+ FFMpeg\FFProbe\MapperInterface + + + +
+ FFMpeg\FFProbe\OptionsTester + + + +
+ FFMpeg\FFProbe\OptionsTesterInterface + + + +
+ FFMpeg\FFProbe\OutputParser + + + +
+ FFMpeg\FFProbe\OutputParserInterface + + + +
+ FFMpeg\Filters\Audio\AudioFilterInterface + + + +
+ FFMpeg\Filters\Audio\AudioFilters + + + +
+ FFMpeg\Filters\Audio\AudioResamplableFilter + + + +
+ FFMpeg\Filters\Audio\SimpleFilter + + + +
+ FFMpeg\Filters\FilterInterface + + + +
+ FFMpeg\Filters\FiltersCollection + + + +
+ FFMpeg\Filters\Frame\DisplayRatioFixerFilter + + + +
+ FFMpeg\Filters\Frame\FrameFilterInterface + + + +
+ FFMpeg\Filters\Frame\FrameFilters + + + +
+ FFMpeg\Filters\Video\ClipFilter + + + +
+ FFMpeg\Filters\Video\CustomFilter + + + +
+ FFMpeg\Filters\Video\FrameRateFilter + + + +
+ FFMpeg\Filters\Video\ResizeFilter + + + +
+ FFMpeg\Filters\Video\RotateFilter + + + +
+ FFMpeg\Filters\Video\SynchronizeFilter + + Synchronizes audio and video in case of desynchronized movies. +
+ FFMpeg\Filters\Video\VideoFilterInterface + + + +
+ FFMpeg\Filters\Video\VideoFilters + + + +
+ FFMpeg\Filters\Video\WatermarkFilter + + + +
+ FFMpeg\Format\AudioInterface + + + +
+ FFMpeg\Format\Audio\Aac + + The AAC audio format +
+ FFMpeg\Format\Audio\DefaultAudio + + + +
+ FFMpeg\Format\Audio\Flac + + The Flac audio format +
+ FFMpeg\Format\Audio\Mp3 + + The MP3 audio format +
+ FFMpeg\Format\Audio\Vorbis + + The Vorbis audio format +
+ FFMpeg\Format\Audio\Wav + + The WAV audio format +
+ FFMpeg\Format\FormatInterface + + + +
+ FFMpeg\Format\FrameInterface + + + +
+ FFMpeg\Format\ProgressListener\AbstractProgressListener + + + +
+ FFMpeg\Format\ProgressListener\AudioProgressListener + + Parses ffmpeg stderr progress information. +
+ FFMpeg\Format\ProgressListener\VideoProgressListener + + Parses ffmpeg stderr progress information for video files. +
+ FFMpeg\Format\ProgressableInterface + + + +
+ FFMpeg\Format\VideoInterface + + + +
+ FFMpeg\Format\Video\DefaultVideo + + The abstract default Video format +
+ FFMpeg\Format\Video\Ogg + + The Ogg video format +
+ FFMpeg\Format\Video\WMV + + The WMV video format +
+ FFMpeg\Format\Video\WMV3 + + The WMV video format +
+ FFMpeg\Format\Video\WebM + + The WebM video format +
+ FFMpeg\Format\Video\X264 + + The X264 video format +
+ FFMpeg\Media\AbstractMediaType + + + +
+ FFMpeg\Media\AbstractStreamableMedia + + + +
+ FFMpeg\Media\Audio + + + +
+ FFMpeg\Media\Frame + + + +
+ FFMpeg\Media\MediaTypeInterface + + + +
+ FFMpeg\Media\Video + + + +
+
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/css/main.css b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/css/main.css new file mode 100644 index 0000000000..17608f6067 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/css/main.css @@ -0,0 +1,214 @@ +/* +Copyright (c) 2009 Vladimir Kolesnikov + +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. +*/ + +a { + color: #00F; + text-decoration: none; +} + +a:hover { + color: #77F; + text-decoration: underline; +} + +body, td, p { + font-family: "Bitstream Vera Sans", Verdana, Arial, Helvetica, sans-serif; + background: #FFF; + color: #000; + margin: 0px; + font-size: small; +} + +p { + margin-top: 0.5em; + margin-bottom: 0.5em; +} + +#content { + margin: 2em; + margin-left: 3.5em; + margin-right: 3.5em; +} + +#description p { + margin-bottom: 0.5em; +} + +.sectiontitle { + margin-top: 1em; + margin-bottom: 1em; + padding: 0.5em; + padding-left: 2em; + background: #005; + color: #FFF; + font-weight: bold; +} + +.attr-rw { + padding-left: 1em; + padding-right: 1em; + text-align: center; + color: #055; +} + +.attr-name { + font-weight: bold; +} + +.attr-desc { +} + +.attr-desc p { + margin-top: 0; +} + +.attr-value { + font-family: monospace; +} + +.file-title-prefix { + font-size: large; +} + +.file-title { + font-size: large; + font-weight: bold; + background: #005; + color: #FFF; +} + +.banner { + background: #005; + color: #FFF; + border: 1px solid black; + padding: 1em; +} + +.banner td { + background: transparent; + color: #FFF; +} + +h1 a, h2 a, .sectiontitle a, .banner a { + color: #FF0; +} + +h1 a:hover, h2 a:hover, .sectiontitle a:hover, .banner a:hover { + color: #FF7; +} + +.dyn-source { + display: none; + background: #fffde8; + color: #000; + border: #ffe0bb dotted 1px; + margin: 0.5em 2em 0.5em 2em; + padding: 0.5em; +} + +.dyn-source .cmt { + color: #00F; + font-style: italic; +} + +.dyn-source .kw { + color: #070; + font-weight: bold; +} + +.method { + margin-left: 1em; + margin-right: 1em; + margin-bottom: 1em; +} + +.description pre { + padding: 0.5em; + border: #ffe0bb dotted 1px; + background: #fffde8; +} + +.method .title { + font-family: monospace; + font-size: large; + border-bottom: 1px dashed black; + margin-bottom: 0.3em; + padding-bottom: 0.1em; +} + +.method .description, .method .sourcecode { + margin-left: 1em; +} + +.description p, .sourcecode p { + margin-bottom: 0.5em; +} + +.method .sourcecode p.source-link { + text-indent: 0em; + margin-top: 0.5em; +} + +.method .aka { + margin-top: 0.3em; + margin-left: 1em; + font-style: italic; + text-indent: 2em; +} + +h1 { + padding: 1em; + margin-left: -1.5em; + font-size: x-large; + font-weight: bold; + color: #FFF; + background: #007; +} + +h2 { + padding: 0.5em 1em 0.5em 1em; + margin-left: -1.5em; + font-size: large; + font-weight: bold; + color: #FFF; + background: #009; +} + +h3, h4, h5, h6 { + color: #220088; + border-bottom: #5522bb solid 1px; +} + +.sourcecode > pre { + padding: 0.5em; + border: 1px dotted black; + background: #FFE; +} + +dt { + font-weight: bold +} + +dd { + margin-bottom: 0.7em; +} \ No newline at end of file diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/css/panel.css b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/css/panel.css new file mode 100644 index 0000000000..b7565b2f69 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/css/panel.css @@ -0,0 +1,427 @@ +/* +Copyright (c) 2009 Vladimir Kolesnikov + +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. +*/ + +/* Panel (begin) */ + .panel + { + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + background: #FFF; + z-index: 2; + font-family: "Helvetica Neue", "Arial", sans-serif; + //zoom: 1; + } + + .panel_tree .results, + .panel_results .tree + { + display: none; + } + + /* Header with search box (begin) */ + .panel .header + { + width: 100%; + height: 59px; + border-bottom: 1px solid #666; + position: relative; + left: 0; top: 0; + background: #e8e8e8; + } + + .panel .header div.nav + { + padding-top: 7px; + margin: 0 7px; + } + + .panel .header table + { + height: 29px; + width: 100%; + } + + .panel .header table td + { + vertical-align: middle; + text-align: middle; + } + + .panel .header form + { + float: right; + text-align: bottom; + } + + .panel .header h1 + { + float: left; + font-size: 14px; + font-weight: normal; + color: #777; + text-align: bottom; + } + + .panel .header input + { + width: 100%; + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + display: inline-block; + -webkit-appearance: searchfield; + height: 22px; + //height: auto; + } + + /* Header with search box (end) */ + + + /* Results (begin) */ + .panel .result + { + position: absolute; + top: 60px; + bottom: 0; + left: 0; + width: 100%; + //height: expression((this.parentNode.offsetHeight - 31)); + overflow-y: scroll; + overflow-x: hidden; + -overflow-y: hidden; + background: #EDF3FE url(../i/results_bg.png); + z-index: 2; + //zoom:1; + } + + .panel .result ul + { + font-size: 0.8em; + width: 100%; + background: #EDF3FE url(../i/results_bg.png); + //zoom:1; + } + + .panel .result ul li + { + height: 46px; + -height: 50px; + //display: inline; + //width: 100%; + //zoom: 1; + overflow: hidden; + padding: 4px 10px 0 10px; + cursor: pointer; + } + + .panel .result ul li h1 + { + font-size: 13px; + font-weight: normal; + color: #333; + margin-bottom: 2px; + white-space: nowrap; + } + + .panel .result ul li p + { + font-size: 11px; + color: #333; + margin-bottom: 2px; + white-space: nowrap; + } + + .panel .result ul li h1 i, + .panel .result ul li p.snippet + { + color: #999; + } + + .panel .result ul li b + { + color: #000; + } + + .panel .result ul li.current + { + background: #3875D7; + } + + .panel .result ul li.current h1, + .panel .result ul li.current p + { + color: #DDD; + } + + .panel .result ul li.current h1 i, + .panel .result ul li.current p.snippet + { + color: #AAA; + } + + .panel .result ul li.current b + { + color: #FFF; + } + + + .panel .result ul li:hover, + .panel .result ul li.selected + { + background: #d0d0d0; + } + + .panel .result ul li.current:hover + { + background: #2965C0; + } + + .panel .result ul li .badge + { + margin-right: 0.4em; + margin-left: -0.2em; + padding: 0 0.2em; + color: #000; + } + + .panel .result ul li .badge_1 + { + background: #ACDBF4; + } + + .panel .result ul li.current .badge_1 + { + background: #97BFD7; + } + + .panel .result ul li .badge_2 + { + background: #ACF3C3; + } + + .panel .result ul li.current .badge_2 + { + background: #98D7AC; + } + + .panel .result ul li .badge_3 + { + background: #E0F3AC; + } + + .panel .result ul li.current .badge_3 + { + background: #C4D798; + } + + .panel .result ul li .badge_4 + { + background: #D7CA98; + } + + .panel .result ul li.current .badge_4 + { + background: #A6B0AC; + } + + .panel .result ul li .badge_5 + { + background: #F3C8AC; + } + + .panel .result ul li.current .badge_5 + { + background: #D7B198; + } + + .panel .result ul li .badge_6 + { + background: #F3ACC3; + } + + .panel .result ul li.current .badge_6 + { + background: #D798AB; + } + + /* Results (end) */ + + /* Tree (begin) */ /**/ + .panel .tree + { + position: absolute; + top: 60px; + bottom: 0; + left: 0; + width: 100%; + //zoom: 1; + //height: expression((this.parentNode.offsetHeight - 31)); + overflow-y: scroll; + overflow-x: hidden; + -overflow-y: hidden; + background: #EDF3FE url(../i/tree_bg.png); + z-index: 30; + } + + .panel .tree ul + { + background: #EDF3FE url(../i/tree_bg.png); + } + + .panel .tree li + { + cursor: pointer; + overflow: hidden; + //height: 23px; + //display: inline; + //zoom: 1; + //width: 100%; + } + + + .panel .tree li .content + { + padding-left: 18px; + padding-top: 5px; + height: 18px; + overflow: hidden; + position: relative; + } + + .panel .tree li .icon + { + width: 10px; + height: 9px; + background: url(../i/arrows.png); + background-position: 0 -9px; + position: absolute; + left: 1px; + top: 8px; + cursor: default; + } + + .panel .tree li.closed .icon + { + background-position: 0 0; + } + + .panel .tree ul li h1 + { + font-size: 13px; + font-weight: normal; + color: #000; + margin-bottom: 2px; + white-space: nowrap; + } + + .panel .tree ul li p + { + font-size: 11px; + color: #666; + margin-bottom: 2px; + white-space: nowrap; + } + + .panel .tree ul li h1 i + { + color: #999; + font-style: normal; + } + + .panel .tree ul li.empty + { + cursor: text; + } + + .panel .tree ul li.empty h1, + .panel .tree ul li.empty p + { + color: #666; + font-style: italic; + } + + .panel .tree ul li.current + { + background: #3875D7; + } + + .panel .tree ul li.current .icon + { + background-position: -10px -9px; + } + + .panel .tree ul li.current.closed .icon + { + background-position: -10px 0; + } + + .panel .tree ul li.current h1 + { + color: #FFF; + } + + .panel .tree ul li.current p + { + color: #CCC; + } + + .panel .tree ul li.current.empty h1, + .panel .tree ul li.current.empty p + { + color: #999; + } + + .panel .tree ul li:hover + { + background: #d0d0d0; + } + + .panel .tree ul li.current:hover + { + background: #2965C0; + } + + .panel .tree .stopper + { + display: none; + } + /* Tree (end) */ /**/ + +/* Panel (end) */ + + +.panel .loader +{ + text-align: center; + margin-top: 2px; + width: 100%; + height: 59px; +} + +.panel .loader img +{ + vertical-align: middle; +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/css/reset.css b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/css/reset.css new file mode 100644 index 0000000000..13f8e0a14c --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/css/reset.css @@ -0,0 +1,53 @@ +/* http://meyerweb.com/eric/tools/css/reset/ */ +/* v1.0 | 20080212 */ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, font, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td { + margin: 0; + padding: 0; + border: 0; + outline: 0; + font-size: 100%; + vertical-align: baseline; + background: transparent; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} + +/* remember to define focus styles! */ +:focus { + outline: 0; +} + +/* remember to highlight inserts somehow! */ +ins { + text-decoration: none; +} +del { + text-decoration: line-through; +} + +/* tables still need 'cellspacing="0"' in the markup */ +table { + border-collapse: collapse; + border-spacing: 0; +} \ No newline at end of file diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/doc-index.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/doc-index.html new file mode 100644 index 0000000000..3fbc8d1ca1 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/doc-index.html @@ -0,0 +1,511 @@ + + + + + + Index | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +
Index
+ + A + B + C + D + E + F + G + H + I + J + K + L + M + N + O + P + Q + R + S + T + U + V + W + X + Y + Z +
+
+

A

+
AspectRatioClass in namespace FFMpeg\Coordinate
+
+
AbstractDataClass in namespace FFMpeg\FFProbe\DataMapping
+
+
AbstractData::all() — Method in class AbstractData
+
Returns all properties and their values.
StreamCollection::add() — Method in class StreamCollection
+
Adds a stream to the collection.
StreamCollection::audios() — Method in class StreamCollection
+
Returns a new StreamCollection with only audio streams.
StreamCollection::all() — Method in class StreamCollection
+
Returns the array of contained streams.
AudioFilterInterfaceClass in namespace FFMpeg\Filters\Audio
+
+
AudioFilterInterface::apply() — Method in class AudioFilterInterface
+
Applies the filter on the the Audio media given an format.
AudioFiltersClass in namespace FFMpeg\Filters\Audio
+
+
AudioResamplableFilterClass in namespace FFMpeg\Filters\Audio
+
+
AudioResamplableFilter::apply() — Method in class AudioResamplableFilter
+
Applies the filter on the the Audio media given an format.
SimpleFilter::apply() — Method in class SimpleFilter
+
Applies the filter on the the Audio media given an format.
FiltersCollection::add() — Method in class FiltersCollection
+
+
DisplayRatioFixerFilter::apply() — Method in class DisplayRatioFixerFilter
+
+
FrameFilterInterface::apply() — Method in class FrameFilterInterface
+
+
ClipFilter::apply() — Method in class ClipFilter
+
Applies the filter on the the Video media given an format.
CustomFilter::apply() — Method in class CustomFilter
+
Applies the filter on the the Video media given an format.
FrameRateFilter::apply() — Method in class FrameRateFilter
+
Applies the filter on the the Video media given an format.
ResizeFilter::areStandardsForced() — Method in class ResizeFilter
+
+
ResizeFilter::apply() — Method in class ResizeFilter
+
Applies the filter on the the Video media given an format.
RotateFilter::apply() — Method in class RotateFilter
+
Applies the filter on the the Video media given an format.
SynchronizeFilter::apply() — Method in class SynchronizeFilter
+
Applies the filter on the the Video media given an format.
VideoFilterInterface::apply() — Method in class VideoFilterInterface
+
Applies the filter on the the Video media given an format.
VideoFilters::audioResample() — Method in class VideoFilters
+
Resamples the audio file.
WatermarkFilter::apply() — Method in class WatermarkFilter
+
Applies the filter on the the Video media given an format.
AudioInterfaceClass in namespace FFMpeg\Format
+
+
AacClass in namespace FFMpeg\Format\Audio
+
The AAC audio format
AbstractProgressListenerClass in namespace FFMpeg\Format\ProgressListener
+
+
AudioProgressListenerClass in namespace FFMpeg\Format\ProgressListener
+
Parses ffmpeg stderr progress information.
AbstractMediaTypeClass in namespace FFMpeg\Media
+
+
AbstractStreamableMediaClass in namespace FFMpeg\Media
+
+
AudioClass in namespace FFMpeg\Media
+
+
Audio::addFilter() — Method in class Audio
+
{@inheritdoc}
Frame::addFilter() — Method in class Frame
+
{@inheritdoc}
Video::addFilter() — Method in class Video
+
{@inheritdoc}

B

+
FFMpegServiceProvider::boot() — Method in class FFMpegServiceProvider
+
+

C

+
AspectRatio::calculateWidth() — Method in class AspectRatio
+
Computes the best width for given height and modulus.
AspectRatio::calculateHeight() — Method in class AspectRatio
+
Computes the best height for given width and modulus.
AspectRatio::create() — Method in class AspectRatio
+
Creates a ratio based on Dimension.
FFMpegDriver::create() — Method in class FFMpegDriver
+
Creates an FFMpegDriver.
FFProbeDriver::create() — Method in class FFProbeDriver
+
Creates an FFProbeDriver.
FFMpeg::create() — Method in class FFMpeg
+
Creates a new FFMpeg instance.
FFProbe::create() — Method in class FFProbe
+
+
AbstractData::count() — Method in class AbstractData
+
{@inheritdoc}
StreamCollection::count() — Method in class StreamCollection
+
{@inheritdoc}
FiltersCollection::count() — Method in class FiltersCollection
+
{@inheritdoc}
ClipFilterClass in namespace FFMpeg\Filters\Video
+
+
CustomFilterClass in namespace FFMpeg\Filters\Video
+
+
VideoFilters::clip() — Method in class VideoFilters
+
Clips (cuts) the video.
DefaultAudio::createProgressListener() — Method in class DefaultAudio
+
Creates the progress listener.
ProgressableInterface::createProgressListener() — Method in class ProgressableInterface
+
Creates the progress listener.
DefaultVideo::createProgressListener() — Method in class DefaultVideo
+
Creates the progress listener.

D

+
DimensionClass in namespace FFMpeg\Coordinate
+
Dimension object, used for manipulating width and height couples
DisplayRatioFixerFilterClass in namespace FFMpeg\Filters\Frame
+
+
DefaultAudioClass in namespace FFMpeg\Format\Audio
+
+
DefaultVideoClass in namespace FFMpeg\Format\Video
+
The abstract default Video format

E

+
ExceptionInterfaceClass in namespace FFMpeg\Exception
+
+
ExecutableNotFoundExceptionClass in namespace FFMpeg\Exception
+
+

F

+
FrameRateClass in namespace FFMpeg\Coordinate
+
+
TimeCode::fromString() — Method in class TimeCode
+
Creates timecode from string.
TimeCode::fromSeconds() — Method in class TimeCode
+
Creates timecode from number of seconds.
FFMpegDriverClass in namespace FFMpeg\Driver
+
+
FFProbeDriverClass in namespace FFMpeg\Driver
+
+
FFMpegClass in namespace FFMpeg
+
+
FFMpegServiceProviderClass in namespace FFMpeg
+
+
FFProbeClass in namespace FFMpeg
+
+
FFProbe::format() — Method in class FFProbe
+
+
FormatClass in namespace FFMpeg\FFProbe\DataMapping
+
+
StreamCollection::first() — Method in class StreamCollection
+
Returns the first stream of the collection, null if the collection is empty.
FilterInterfaceClass in namespace FFMpeg\Filters
+
+
FiltersCollectionClass in namespace FFMpeg\Filters
+
+
FrameFilterInterfaceClass in namespace FFMpeg\Filters\Frame
+
+
FrameFiltersClass in namespace FFMpeg\Filters\Frame
+
+
FrameFilters::fixDisplayRatio() — Method in class FrameFilters
+
Fixes the display ratio of the output frame.
FrameRateFilterClass in namespace FFMpeg\Filters\Video
+
+
VideoFilters::framerate() — Method in class VideoFilters
+
Changes the video framerate.
FlacClass in namespace FFMpeg\Format\Audio
+
The Flac audio format
FormatInterfaceClass in namespace FFMpeg\Format
+
+
FrameInterfaceClass in namespace FFMpeg\Format
+
+
AbstractProgressListener::forwardedEvents() — Method in class AbstractProgressListener
+
{@inheritdoc}
Audio::filters() — Method in class Audio
+
Returns the available filters.
FrameClass in namespace FFMpeg\Media
+
+
Frame::filters() — Method in class Frame
+
Returns the available filters.
MediaTypeInterface::filters() — Method in class MediaTypeInterface
+
Returns the available filters.
Video::filters() — Method in class Video
+
Returns the available filters.
Video::frame() — Method in class Video
+
Gets the frame at timecode.

G

+
AspectRatio::getValue() — Method in class AspectRatio
+
Returns the value of the ratio.
Dimension::getWidth() — Method in class Dimension
+
Returns width.
Dimension::getHeight() — Method in class Dimension
+
Returns height.
Dimension::getRatio() — Method in class Dimension
+
Returns the ratio.
FrameRate::getValue() — Method in class FrameRate
+
+
Point::getX() — Method in class Point
+
+
Point::getY() — Method in class Point
+
+
FFMpegDriver::getName() — Method in class FFMpegDriver
+
{@inheritdoc}
FFProbeDriver::getName() — Method in class FFProbeDriver
+
{@inheritdoc}
FFMpeg::getFFProbe() — Method in class FFMpeg
+
Gets FFProbe.
FFMpeg::getFFMpegDriver() — Method in class FFMpeg
+
Gets the ffmpeg driver.
FFProbe::getParser() — Method in class FFProbe
+
+
FFProbe::getFFProbeDriver() — Method in class FFProbe
+
+
FFProbe::getOptionsTester() — Method in class FFProbe
+
+
FFProbe::getCache() — Method in class FFProbe
+
+
FFProbe::getMapper() — Method in class FFProbe
+
+
AbstractData::get() — Method in class AbstractData
+
Returns the property value given its name.
Stream::getDimensions() — Method in class Stream
+
Returns the dimension of the video stream.
StreamCollection::getIterator() — Method in class StreamCollection
+
{@inheritdoc}
AudioResamplableFilter::getPriority() — Method in class AudioResamplableFilter
+
Returns the priority of the filter.
AudioResamplableFilter::getRate() — Method in class AudioResamplableFilter
+
+
SimpleFilter::getPriority() — Method in class SimpleFilter
+
Returns the priority of the filter.
FilterInterface::getPriority() — Method in class FilterInterface
+
Returns the priority of the filter.
FiltersCollection::getIterator() — Method in class FiltersCollection
+
{@inheritdoc}
DisplayRatioFixerFilter::getPriority() — Method in class DisplayRatioFixerFilter
+
Returns the priority of the filter.
ClipFilter::getPriority() — Method in class ClipFilter
+
Returns the priority of the filter.
ClipFilter::getStart() — Method in class ClipFilter
+
+
ClipFilter::getDuration() — Method in class ClipFilter
+
+
CustomFilter::getPriority() — Method in class CustomFilter
+
Returns the priority of the filter.
FrameRateFilter::getPriority() — Method in class FrameRateFilter
+
Returns the priority of the filter.
FrameRateFilter::getFrameRate() — Method in class FrameRateFilter
+
Returns the frame rate.
FrameRateFilter::getGOP() — Method in class FrameRateFilter
+
Returns the GOP size.
ResizeFilter::getPriority() — Method in class ResizeFilter
+
Returns the priority of the filter.
ResizeFilter::getDimension() — Method in class ResizeFilter
+
+
ResizeFilter::getMode() — Method in class ResizeFilter
+
+
RotateFilter::getPriority() — Method in class RotateFilter
+
Returns the priority of the filter.
RotateFilter::getAngle() — Method in class RotateFilter
+
+
SynchronizeFilter::getPriority() — Method in class SynchronizeFilter
+
Returns the priority of the filter.
WatermarkFilter::getPriority() — Method in class WatermarkFilter
+
Returns the priority of the filter.
AudioInterface::getAudioKiloBitrate() — Method in class AudioInterface
+
Gets the audio kiloBitrate value.
AudioInterface::getAudioChannels() — Method in class AudioInterface
+
Gets the audio channels value.
AudioInterface::getAudioCodec() — Method in class AudioInterface
+
Returns the audio codec.
AudioInterface::getAvailableAudioCodecs() — Method in class AudioInterface
+
Returns the list of available audio codecs for this format.
Aac::getAvailableAudioCodecs() — Method in class Aac
+
Returns the list of available audio codecs for this format.
DefaultAudio::getExtraParams() — Method in class DefaultAudio
+
Returns an array of extra parameters to add to ffmpeg commandline.
DefaultAudio::getAudioCodec() — Method in class DefaultAudio
+
Returns the audio codec.
DefaultAudio::getAudioKiloBitrate() — Method in class DefaultAudio
+
Gets the audio kiloBitrate value.
DefaultAudio::getAudioChannels() — Method in class DefaultAudio
+
Gets the audio channels value.
DefaultAudio::getPasses() — Method in class DefaultAudio
+
Returns the number of passes.
Flac::getAvailableAudioCodecs() — Method in class Flac
+
Returns the list of available audio codecs for this format.
Mp3::getAvailableAudioCodecs() — Method in class Mp3
+
Returns the list of available audio codecs for this format.
Vorbis::getExtraParams() — Method in class Vorbis
+
Returns an array of extra parameters to add to ffmpeg commandline.
Vorbis::getAvailableAudioCodecs() — Method in class Vorbis
+
Returns the list of available audio codecs for this format.
Wav::getAvailableAudioCodecs() — Method in class Wav
+
Returns the list of available audio codecs for this format.
FormatInterface::getPasses() — Method in class FormatInterface
+
Returns the number of passes.
FormatInterface::getExtraParams() — Method in class FormatInterface
+
Returns an array of extra parameters to add to ffmpeg commandline.
AbstractProgressListener::getFFProbe() — Method in class AbstractProgressListener
+
+
AbstractProgressListener::getPathfile() — Method in class AbstractProgressListener
+
+
AbstractProgressListener::getCurrentPass() — Method in class AbstractProgressListener
+
+
AbstractProgressListener::getTotalPass() — Method in class AbstractProgressListener
+
+
AudioProgressListener::getPattern() — Method in class AudioProgressListener
+
+
VideoProgressListener::getPattern() — Method in class VideoProgressListener
+
+
VideoInterface::getKiloBitrate() — Method in class VideoInterface
+
Gets the kiloBitrate value.
VideoInterface::getModulus() — Method in class VideoInterface
+
Returns the modulus used by the Resizable video.
VideoInterface::getVideoCodec() — Method in class VideoInterface
+
Returns the video codec.
VideoInterface::getAvailableVideoCodecs() — Method in class VideoInterface
+
Returns the list of available video codecs for this format.
DefaultVideo::getKiloBitrate() — Method in class DefaultVideo
+
Gets the kiloBitrate value.
DefaultVideo::getVideoCodec() — Method in class DefaultVideo
+
Returns the video codec.
DefaultVideo::getModulus() — Method in class DefaultVideo
+
+
Ogg::getAvailableAudioCodecs() — Method in class Ogg
+
Returns the list of available audio codecs for this format.
Ogg::getAvailableVideoCodecs() — Method in class Ogg
+
Returns the list of available video codecs for this format.
WMV::getAvailableAudioCodecs() — Method in class WMV
+
Returns the list of available audio codecs for this format.
WMV::getAvailableVideoCodecs() — Method in class WMV
+
Returns the list of available video codecs for this format.
WMV3::getAvailableAudioCodecs() — Method in class WMV3
+
Returns the list of available audio codecs for this format.
WMV3::getAvailableVideoCodecs() — Method in class WMV3
+
Returns the list of available video codecs for this format.
WebM::getExtraParams() — Method in class WebM
+
Returns an array of extra parameters to add to ffmpeg commandline.
WebM::getAvailableAudioCodecs() — Method in class WebM
+
Returns the list of available audio codecs for this format.
WebM::getAvailableVideoCodecs() — Method in class WebM
+
Returns the list of available video codecs for this format.
X264::getAvailableAudioCodecs() — Method in class X264
+
Returns the list of available audio codecs for this format.
X264::getAvailableVideoCodecs() — Method in class X264
+
Returns the list of available video codecs for this format.
X264::getPasses() — Method in class X264
+
Returns the number of passes.
X264::getModulus() — Method in class X264
+
+
AbstractMediaType::getFFMpegDriver() — Method in class AbstractMediaType
+
+
AbstractMediaType::getFFProbe() — Method in class AbstractMediaType
+
+
AbstractMediaType::getPathfile() — Method in class AbstractMediaType
+
+
AbstractMediaType::getFiltersCollection() — Method in class AbstractMediaType
+
+
AbstractStreamableMedia::getStreams() — Method in class AbstractStreamableMedia
+
+
AbstractStreamableMedia::getFormat() — Method in class AbstractStreamableMedia
+
+
Frame::getVideo() — Method in class Frame
+
Returns the video related to the frame.
Frame::getTimeCode() — Method in class Frame
+
+
MediaTypeInterface::getPathfile() — Method in class MediaTypeInterface
+
+

H

+
AbstractData::has() — Method in class AbstractData
+
Returns true if data has property.
OptionsTester::has() — Method in class OptionsTester
+
Tells if the given option is supported by ffprobe.
OptionsTesterInterface::has() — Method in class OptionsTesterInterface
+
Tells if the given option is supported by ffprobe.
AbstractProgressListener::handle() — Method in class AbstractProgressListener
+
{@inheritdoc}

I

+
InvalidArgumentExceptionClass in namespace FFMpeg\Exception
+
+
Stream::isAudio() — Method in class Stream
+
Returns true if the stream is an audio stream.
Stream::isVideo() — Method in class Stream
+
Returns true if the stream is a video stream.

K

+
AbstractData::keys() — Method in class AbstractData
+
Returns all property names.

L

+
LogicExceptionClass in namespace FFMpeg\Exception
+
+

M

+
MapperClass in namespace FFMpeg\FFProbe
+
+
Mapper::map() — Method in class Mapper
+
Maps data given its type.
MapperInterfaceClass in namespace FFMpeg\FFProbe
+
+
MapperInterface::map() — Method in class MapperInterface
+
Maps data given its type.
Mp3Class in namespace FFMpeg\Format\Audio
+
The MP3 audio format
MediaTypeInterfaceClass in namespace FFMpeg\Media
+
+

O

+
FFMpeg::open() — Method in class FFMpeg
+
Opens a file in order to be processed.
OptionsTesterClass in namespace FFMpeg\FFProbe
+
+
OptionsTesterInterfaceClass in namespace FFMpeg\FFProbe
+
+
OutputParserClass in namespace FFMpeg\FFProbe
+
+
OutputParserInterfaceClass in namespace FFMpeg\FFProbe
+
+
OggClass in namespace FFMpeg\Format\Video
+
The Ogg video format

P

+
PointClass in namespace FFMpeg\Coordinate
+
+
OutputParser::parse() — Method in class OutputParser
+
Parses ffprobe raw output.
OutputParserInterface::parse() — Method in class OutputParserInterface
+
Parses ffprobe raw output.
ProgressableInterfaceClass in namespace FFMpeg\Format
+
+

R

+
RuntimeExceptionClass in namespace FFMpeg\Exception
+
+
FFMpegServiceProvider::register() — Method in class FFMpegServiceProvider
+
+
AudioFilters::resample() — Method in class AudioFilters
+
Resamples the audio file.
ResizeFilterClass in namespace FFMpeg\Filters\Video
+
+
RotateFilterClass in namespace FFMpeg\Filters\Video
+
+
VideoFilters::resize() — Method in class VideoFilters
+
Resizes a video to a given dimension.
VideoFilters::rotate() — Method in class VideoFilters
+
+

S

+
FFMpeg::setFFProbe() — Method in class FFMpeg
+
Sets FFProbe.
FFMpeg::setFFMpegDriver() — Method in class FFMpeg
+
Sets the ffmpeg driver.
FFProbe::setParser() — Method in class FFProbe
+
+
FFProbe::setFFProbeDriver() — Method in class FFProbe
+
+
FFProbe::setOptionsTester() — Method in class FFProbe
+
+
FFProbe::setCache() — Method in class FFProbe
+
+
FFProbe::setMapper() — Method in class FFProbe
+
+
FFProbe::streams() — Method in class FFProbe
+
+
AbstractData::set() — Method in class AbstractData
+
Sets the property value given its name.
StreamClass in namespace FFMpeg\FFProbe\DataMapping
+
+
StreamCollectionClass in namespace FFMpeg\FFProbe\DataMapping
+
+
SimpleFilterClass in namespace FFMpeg\Filters\Audio
+
+
SynchronizeFilterClass in namespace FFMpeg\Filters\Video
+
Synchronizes audio and video in case of desynchronized movies.
VideoFilters::synchronize() — Method in class VideoFilters
+
Synchronizes audio and video.
DefaultAudio::setAudioCodec() — Method in class DefaultAudio
+
Sets the audio codec, Should be in the available ones, otherwise an exception is thrown.
DefaultAudio::setAudioKiloBitrate() — Method in class DefaultAudio
+
Sets the kiloBitrate value.
DefaultAudio::setAudioChannels() — Method in class DefaultAudio
+
Sets the channels value.
VideoInterface::supportBFrames() — Method in class VideoInterface
+
Returns true if the current format supports B-Frames.
DefaultVideo::setKiloBitrate() — Method in class DefaultVideo
+
Sets the kiloBitrate value.
DefaultVideo::setVideoCodec() — Method in class DefaultVideo
+
Sets the video codec, Should be in the available ones, otherwise an exception is thrown.
Ogg::supportBFrames() — Method in class Ogg
+
Returns true if the current format supports B-Frames.
WMV::supportBFrames() — Method in class WMV
+
Returns true if the current format supports B-Frames.
WMV3::supportBFrames() — Method in class WMV3
+
Returns true if the current format supports B-Frames.
WebM::supportBFrames() — Method in class WebM
+
Returns true if the current format supports B-Frames.
X264::supportBFrames() — Method in class X264
+
Returns true if the current format supports B-Frames.
X264::setBFramesSupport() — Method in class X264
+
+
AbstractMediaType::setFFMpegDriver() — Method in class AbstractMediaType
+
+
AbstractMediaType::setFFProbe() — Method in class AbstractMediaType
+
+
AbstractMediaType::setFiltersCollection() — Method in class AbstractMediaType
+
+
Audio::save() — Method in class Audio
+
Exports the audio in the desired format, applies registered filters.
Frame::save() — Method in class Frame
+
Saves the frame in the given filename.
Video::save() — Method in class Video
+
Exports the video in the desired format, applies registered filters.

T

+
TimeCodeClass in namespace FFMpeg\Coordinate
+
+

V

+
StreamCollection::videos() — Method in class StreamCollection
+
Returns a new StreamCollection with only video streams.
VideoFilterInterfaceClass in namespace FFMpeg\Filters\Video
+
+
VideoFiltersClass in namespace FFMpeg\Filters\Video
+
+
VorbisClass in namespace FFMpeg\Format\Audio
+
The Vorbis audio format
VideoProgressListenerClass in namespace FFMpeg\Format\ProgressListener
+
Parses ffmpeg stderr progress information for video files.
VideoInterfaceClass in namespace FFMpeg\Format
+
+
VideoClass in namespace FFMpeg\Media
+
+

W

+
VideoFilters::watermark() — Method in class VideoFilters
+
+
WatermarkFilterClass in namespace FFMpeg\Filters\Video
+
+
WavClass in namespace FFMpeg\Format\Audio
+
The WAV audio format
WMVClass in namespace FFMpeg\Format\Video
+
The WMV video format
WMV3Class in namespace FFMpeg\Format\Video
+
The WMV video format
WebMClass in namespace FFMpeg\Format\Video
+
The WebM video format

X

+
X264Class in namespace FFMpeg\Format\Video
+
The X264 video format

_

+
AspectRatio::__construct() — Method in class AspectRatio
+
+
Dimension::__construct() — Method in class Dimension
+
+
FrameRate::__construct() — Method in class FrameRate
+
+
Point::__construct() — Method in class Point
+
+
TimeCode::__construct() — Method in class TimeCode
+
+
TimeCode::__toString() — Method in class TimeCode
+
+
FFMpeg::__construct() — Method in class FFMpeg
+
+
FFProbe::__construct() — Method in class FFProbe
+
+
AbstractData::__construct() — Method in class AbstractData
+
+
StreamCollection::__construct() — Method in class StreamCollection
+
+
OptionsTester::__construct() — Method in class OptionsTester
+
+
AudioFilters::__construct() — Method in class AudioFilters
+
+
AudioResamplableFilter::__construct() — Method in class AudioResamplableFilter
+
+
SimpleFilter::__construct() — Method in class SimpleFilter
+
+
DisplayRatioFixerFilter::__construct() — Method in class DisplayRatioFixerFilter
+
+
FrameFilters::__construct() — Method in class FrameFilters
+
+
ClipFilter::__construct() — Method in class ClipFilter
+
+
CustomFilter::__construct() — Method in class CustomFilter
+
A custom filter, useful if you want to build complex filters
FrameRateFilter::__construct() — Method in class FrameRateFilter
+
+
ResizeFilter::__construct() — Method in class ResizeFilter
+
+
RotateFilter::__construct() — Method in class RotateFilter
+
+
SynchronizeFilter::__construct() — Method in class SynchronizeFilter
+
+
VideoFilters::__construct() — Method in class VideoFilters
+
+
WatermarkFilter::__construct() — Method in class WatermarkFilter
+
+
Aac::__construct() — Method in class Aac
+
+
Flac::__construct() — Method in class Flac
+
+
Mp3::__construct() — Method in class Mp3
+
+
Vorbis::__construct() — Method in class Vorbis
+
+
Wav::__construct() — Method in class Wav
+
+
AbstractProgressListener::__construct() — Method in class AbstractProgressListener
+
+
Ogg::__construct() — Method in class Ogg
+
+
WMV::__construct() — Method in class WMV
+
+
WMV3::__construct() — Method in class WMV3
+
+
WebM::__construct() — Method in class WebM
+
+
X264::__construct() — Method in class X264
+
+
AbstractMediaType::__construct() — Method in class AbstractMediaType
+
+
Frame::__construct() — Method in class Frame
+
+
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/i/arrows.png b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/i/arrows.png new file mode 100644 index 0000000000..e54060f44c Binary files /dev/null and b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/i/arrows.png differ diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/i/loader.gif b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/i/loader.gif new file mode 100644 index 0000000000..e2a116c728 Binary files /dev/null and b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/i/loader.gif differ diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/i/results_bg.png b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/i/results_bg.png new file mode 100644 index 0000000000..199ba69234 Binary files /dev/null and b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/i/results_bg.png differ diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/i/tree_bg.png b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/i/tree_bg.png new file mode 100644 index 0000000000..7d236633d7 Binary files /dev/null and b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/i/tree_bg.png differ diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/index.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/index.html new file mode 100644 index 0000000000..503128a44f --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/index.html @@ -0,0 +1,21 @@ + + + + + + PHP-FFMpeg API + + + + + + + + + + <body> + Your browser does not support frames. Go to the <a href="namespaces.html">non-frame version</a>. + </body> + + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/interfaces.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/interfaces.html new file mode 100644 index 0000000000..207e629939 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/interfaces.html @@ -0,0 +1,130 @@ + + + + + + Interfaces | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +

Interfaces

+
+ + + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/js/jquery-1.3.2.min.js b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/js/jquery-1.3.2.min.js new file mode 100644 index 0000000000..b1ae21d8b2 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/js/jquery-1.3.2.min.js @@ -0,0 +1,19 @@ +/* + * jQuery JavaScript Library v1.3.2 + * http://jquery.com/ + * + * Copyright (c) 2009 John Resig + * Dual licensed under the MIT and GPL licenses. + * http://docs.jquery.com/License + * + * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009) + * Revision: 6246 + */ +(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("",""]||!O.indexOf("",""]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"","
"]||!O.indexOf("",""]||(!O.indexOf("",""]||!O.indexOf("",""]||!o.support.htmlSerialize&&[1,"div
","
"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}}); +/* + * Sizzle CSS Selector Engine - v0.9.3 + * Copyright 2009, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return UT[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="

";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="
";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("
").append(M.responseText.replace(//g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='
';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})(); \ No newline at end of file diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/js/permalink.js b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/js/permalink.js new file mode 100644 index 0000000000..959137d8fc --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/js/permalink.js @@ -0,0 +1,17 @@ +jQuery(document).ready( + function () { + var hash = window.location.hash.replace(/^#/, ''); + + if (hash) { + jQuery('#main-frame').attr('src', hash); + + if (history.pushState) { + history.pushState( + '', + document.title, + window.location.pathname + window.location.search + ); + } + } + } +); diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/js/searchdoc.js b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/js/searchdoc.js new file mode 100644 index 0000000000..08537ec4df --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/js/searchdoc.js @@ -0,0 +1,651 @@ +/* +Copyright (c) 2009 Vladimir Kolesnikov + +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. +*/ + +Searchdoc = {}; + +// navigation.js ------------------------------------------ + +Searchdoc.Navigation = new function() { + this.initNavigation = function() { + var _this = this; + + $(document).keydown(function(e) { + _this.onkeydown(e); + }).keyup(function(e) { + _this.onkeyup(e); + }); + + this.navigationActive = true; + } + + this.setNavigationActive = function(state) { + this.navigationActive = state; + this.clearMoveTimeout(); + } + + + this.onkeyup = function(e) { + if (!this.navigationActive) return; + switch(e.keyCode) { + case 37: //Event.KEY_LEFT: + case 38: //Event.KEY_UP: + case 39: //Event.KEY_RIGHT: + case 40: //Event.KEY_DOWN: + case 73: // i - qwerty + case 74: // j + case 75: // k + case 76: // l + case 67: // c - dvorak + case 72: // h + case 84: // t + case 78: // n + this.clearMoveTimeout(); + break; + } + } + + this.onkeydown = function(e) { + if (!this.navigationActive) return; + switch(e.keyCode) { + case 37: //Event.KEY_LEFT: + case 74: // j (qwerty) + case 72: // h (dvorak) + if (this.moveLeft()) e.preventDefault(); + break; + case 38: //Event.KEY_UP: + case 73: // i (qwerty) + case 67: // c (dvorak) + if (e.keyCode == 38 || e.ctrlKey) { + if (this.moveUp()) e.preventDefault(); + this.startMoveTimeout(false); + } + break; + case 39: //Event.KEY_RIGHT: + case 76: // l (qwerty) + case 78: // n (dvorak) + if (this.moveRight()) e.preventDefault(); + break; + case 40: //Event.KEY_DOWN: + case 75: // k (qwerty) + case 84: // t (dvorak) + if (e.keyCode == 40 || e.ctrlKey) { + if (this.moveDown()) e.preventDefault(); + this.startMoveTimeout(true); + } + break; + case 9: //Event.KEY_TAB: + case 13: //Event.KEY_RETURN: + if (this.$current) this.select(this.$current); + break; + } + if (e.ctrlKey && e.shiftKey) this.select(this.$current); + } + + this.clearMoveTimeout = function() { + clearTimeout(this.moveTimeout); + this.moveTimeout = null; + } + + this.startMoveTimeout = function(isDown) { + if (!$.browser.mozilla && !$.browser.opera) return; + if (this.moveTimeout) this.clearMoveTimeout(); + var _this = this; + + var go = function() { + if (!_this.moveTimeout) return; + _this[isDown ? 'moveDown' : 'moveUp'](); + _this.moveTimout = setTimeout(go, 100); + } + this.moveTimeout = setTimeout(go, 200); + } + + this.moveRight = function() { + } + + this.moveLeft = function() { + } + + this.move = function(isDown) { + } + + this.moveUp = function() { + return this.move(false); + } + + this.moveDown = function() { + return this.move(true); + } +} + + +// scrollIntoView.js -------------------------------------- + +function scrollIntoView(element, view) { + var offset, viewHeight, viewScroll, height; + offset = element.offsetTop; + height = element.offsetHeight; + viewHeight = view.offsetHeight; + viewScroll = view.scrollTop; + if (offset - viewScroll + height > viewHeight) { + view.scrollTop = offset - viewHeight + height; + } + if (offset < viewScroll) { + view.scrollTop = offset; + } +} + + +// searcher.js -------------------------------------------- + +Searchdoc.Searcher = function(data) { + this.data = data; + this.handlers = []; +} + +Searchdoc.Searcher.prototype = new function() { + var CHUNK_SIZE = 1000, // search is performed in chunks of 1000 for non-bloking user input + MAX_RESULTS = 100, // do not try to find more than 100 results + huid = 1, suid = 1, + runs = 0; + + + this.find = function(query) { + var queries = splitQuery(query), + regexps = buildRegexps(queries), + highlighters = buildHilighters(queries), + state = { from: 0, pass: 0, limit: MAX_RESULTS, n: suid++}, + _this = this; + this.currentSuid = state.n; + + if (!query) return; + + var run = function() { + // stop current search thread if new search started + if (state.n != _this.currentSuid) return; + + var results = performSearch(_this.data, regexps, queries, highlighters, state), + hasMore = (state.limit > 0 && state.pass < 3); + + triggerResults.call(_this, results, !hasMore); + if (hasMore) { + setTimeout(run, 2); + } + runs++; + }; + runs = 0; + + // start search thread + run(); + } + + /* ----- Events ------ */ + this.ready = function(fn) { + fn.huid = huid; + this.handlers.push(fn); + } + + /* ----- Utilities ------ */ + function splitQuery(query) { + return jQuery.grep(query.split(/(\s+|\(\)?)/), function(string) { return string.match(/\S/) }); + } + + function buildRegexps(queries) { + return jQuery.map(queries, function(query) { return new RegExp(query.replace(/(.)/g, '([$1])([^$1]*?)'), 'i') }); + } + + function buildHilighters(queries) { + return jQuery.map(queries, function(query) { + return jQuery.map( query.split(''), function(l, i){ return '\u0001$' + (i*2+1) + '\u0002$' + (i*2+2) } ).join('') + }); + } + + // function longMatchRegexp(index, longIndex, regexps) { + // for (var i = regexps.length - 1; i >= 0; i--){ + // if (!index.match(regexps[i]) && !longIndex.match(regexps[i])) return false; + // }; + // return true; + // } + + + /* ----- Mathchers ------ */ + function matchPass1(index, longIndex, queries, regexps) { + if (index.indexOf(queries[0]) != 0) return false; + for (var i=1, l = regexps.length; i < l; i++) { + if (!index.match(regexps[i]) && !longIndex.match(regexps[i])) return false; + }; + return true; + } + + function matchPass2(index, longIndex, queries, regexps) { + if (index.indexOf(queries[0]) == -1) return false; + for (var i=1, l = regexps.length; i < l; i++) { + if (!index.match(regexps[i]) && !longIndex.match(regexps[i])) return false; + }; + return true; + } + + function matchPassRegexp(index, longIndex, queries, regexps) { + if (!index.match(regexps[0])) return false; + for (var i=1, l = regexps.length; i < l; i++) { + if (!index.match(regexps[i]) && !longIndex.match(regexps[i])) return false; + }; + return true; + } + + + /* ----- Highlighters ------ */ + function highlightRegexp(info, queries, regexps, highlighters) { + var result = createResult(info); + for (var i=0, l = regexps.length; i < l; i++) { + result.title = result.title.replace(regexps[i], highlighters[i]); + if (i > 0) + result.namespace = result.namespace.replace(regexps[i], highlighters[i]); + }; + return result; + } + + function hltSubstring(string, pos, length) { + return string.substring(0, pos) + '\u0001' + string.substring(pos, pos + length) + '\u0002' + string.substring(pos + length); + } + + function highlightQuery(info, queries, regexps, highlighters) { + var result = createResult(info), pos = 0, lcTitle = result.title.toLowerCase(); + pos = lcTitle.indexOf(queries[0]); + if (pos != -1) { + result.title = hltSubstring(result.title, pos, queries[0].length); + } + for (var i=1, l = regexps.length; i < l; i++) { + result.title = result.title.replace(regexps[i], highlighters[i]); + result.namespace = result.namespace.replace(regexps[i], highlighters[i]); + }; + return result; + } + + function createResult(info) { + var result = {}; + result.title = info[0]; + result.namespace = info[1]; + result.path = info[2]; + result.params = info[3]; + result.snippet = info[4]; + result.badge = info[6]; + return result; + } + + /* ----- Searching ------ */ + function performSearch(data, regexps, queries, highlighters, state) { + var searchIndex = data.searchIndex, // search by title first and then by source + longSearchIndex = data.longSearchIndex, + info = data.info, + result = [], + i = state.from, + l = searchIndex.length, + togo = CHUNK_SIZE, + matchFunc, hltFunc; + + while (state.pass < 3 && state.limit > 0 && togo > 0) { + if (state.pass == 0) { + matchFunc = matchPass1; + hltFunc = highlightQuery; + } else if (state.pass == 1) { + matchFunc = matchPass2; + hltFunc = highlightQuery; + } else if (state.pass == 2) { + matchFunc = matchPassRegexp; + hltFunc = highlightRegexp; + } + + for (; togo > 0 && i < l && state.limit > 0; i++, togo--) { + if (info[i].n == state.n) continue; + if (matchFunc(searchIndex[i], longSearchIndex[i], queries, regexps)) { + info[i].n = state.n; + result.push(hltFunc(info[i], queries, regexps, highlighters)); + state.limit--; + } + }; + if (searchIndex.length <= i) { + state.pass++; + i = state.from = 0; + } else { + state.from = i; + } + } + return result; + } + + function triggerResults(results, isLast) { + jQuery.each(this.handlers, function(i, fn) { fn.call(this, results, isLast) }) + } +} + + + + +// panel.js ----------------------------------------------- + +Searchdoc.Panel = function(element, data, tree, frame) { + this.$element = $(element); + this.$input = $('input', element).eq(0); + this.$result = $('.result ul', element).eq(0); + this.frame = frame; + this.$current = null; + this.$view = this.$result.parent(); + this.data = data; + this.searcher = new Searchdoc.Searcher(data.index); + this.tree = new Searchdoc.Tree($('.tree', element), tree, this); + this.init(); +} + +Searchdoc.Panel.prototype = $.extend({}, Searchdoc.Navigation, new function() { + var suid = 1; + + this.init = function() { + var _this = this; + var observer = function() { + _this.search(_this.$input[0].value); + }; + this.$input.keyup(observer); + this.$input.click(observer); // mac's clear field + + this.searcher.ready(function(results, isLast) { + _this.addResults(results, isLast); + }) + + this.$result.click(function(e) { + _this.$current.removeClass('current'); + _this.$current = $(e.target).closest('li').addClass('current'); + _this.select(); + _this.$input.focus(); + }); + + this.initNavigation(); + this.setNavigationActive(false); + } + + this.search = function(value, selectFirstMatch) { + value = jQuery.trim(value).toLowerCase(); + this.selectFirstMatch = selectFirstMatch; + if (value) { + this.$element.removeClass('panel_tree').addClass('panel_results'); + this.tree.setNavigationActive(false); + this.setNavigationActive(true); + } else { + this.$element.addClass('panel_tree').removeClass('panel_results'); + this.tree.setNavigationActive(true); + this.setNavigationActive(false); + } + if (value != this.lastQuery) { + this.lastQuery = value; + this.firstRun = true; + this.searcher.find(value); + } + } + + this.addResults = function(results, isLast) { + var target = this.$result.get(0); + if (this.firstRun && (results.length > 0 || isLast)) { + this.$current = null; + this.$result.empty(); + } + for (var i=0, l = results.length; i < l; i++) { + target.appendChild(renderItem.call(this, results[i])); + }; + if (this.firstRun && results.length > 0) { + this.firstRun = false; + this.$current = $(target.firstChild); + this.$current.addClass('current'); + if (this.selectFirstMatch) this.select(); + scrollIntoView(this.$current[0], this.$view[0]) + } + if (jQuery.browser.msie) this.$element[0].className += ''; + } + + this.open = function(src) { + this.frame.location.href = src; + if (this.frame.highlight) this.frame.highlight(src); + } + + this.select = function() { + this.open(this.$current.data('path')); + } + + this.move = function(isDown) { + if (!this.$current) return; + var $next = this.$current[isDown ? 'next' : 'prev'](); + if ($next.length) { + this.$current.removeClass('current'); + $next.addClass('current'); + scrollIntoView($next[0], this.$view[0]); + this.$current = $next; + } + return true; + } + + function renderItem(result) { + var li = document.createElement('li'), + html = '', badge = result.badge; + html += '

' + hlt(result.title); + if (result.params) html += '' + result.params + ''; + html += '

'; + html += '

'; + if (typeof badge != 'undefined') { + html += '' + escapeHTML(this.data.badges[badge] || 'unknown') + ''; + } + html += hlt(result.namespace) + '

'; + if (result.snippet) html += '

' + escapeHTML(result.snippet) + '

'; + li.innerHTML = html; + jQuery.data(li, 'path', result.path); + return li; + } + + function hlt(html) { + return escapeHTML(html).replace(/\u0001/g, '').replace(/\u0002/g, '') + } + + function escapeHTML(html) { + return html.replace(/[&<>]/g, function(c) { + return '&#' + c.charCodeAt(0) + ';'; + }); + } + +}); + +// tree.js ------------------------------------------------ + +Searchdoc.Tree = function(element, tree, panel) { + this.$element = $(element); + this.$list = $('ul', element); + this.tree = tree; + this.panel = panel; + this.init(); +} + +Searchdoc.Tree.prototype = $.extend({}, Searchdoc.Navigation, new function() { + this.init = function() { + var stopper = document.createElement('li'); + stopper.className = 'stopper'; + this.$list[0].appendChild(stopper); + for (var i=0, l = this.tree.length; i < l; i++) { + buildAndAppendItem.call(this, this.tree[i], 0, stopper); + }; + var _this = this; + this.$list.click(function(e) { + var $target = $(e.target), + $li = $target.closest('li'); + if ($target.hasClass('icon')) { + _this.toggle($li); + } else { + _this.select($li); + } + }) + + this.initNavigation(); + if (jQuery.browser.msie) document.body.className += ''; + } + + this.select = function($li) { + this.highlight($li); + var path = $li[0].searchdoc_tree_data.path; + if (path) this.panel.open(path); + } + + this.highlight = function($li) { + if (this.$current) this.$current.removeClass('current'); + this.$current = $li.addClass('current'); + } + + this.toggle = function($li) { + var closed = !$li.hasClass('closed'), + children = $li[0].searchdoc_tree_data.children; + $li.toggleClass('closed'); + for (var i=0, l = children.length; i < l; i++) { + toggleVis.call(this, $(children[i].li), !closed); + }; + } + + this.moveRight = function() { + if (!this.$current) { + this.highlight(this.$list.find('li:first')); + return; + } + if (this.$current.hasClass('closed')) { + this.toggle(this.$current); + } + } + + this.moveLeft = function() { + if (!this.$current) { + this.highlight(this.$list.find('li:first')); + return; + } + if (!this.$current.hasClass('closed')) { + this.toggle(this.$current); + } else { + var level = this.$current[0].searchdoc_tree_data.level; + if (level == 0) return; + var $next = this.$current.prevAll('li.level_' + (level - 1) + ':visible:first'); + this.$current.removeClass('current'); + $next.addClass('current'); + scrollIntoView($next[0], this.$element[0]); + this.$current = $next; + } + } + + this.move = function(isDown) { + if (!this.$current) { + this.highlight(this.$list.find('li:first')); + return true; + } + var next = this.$current[0]; + if (isDown) { + do { + next = next.nextSibling; + if (next && next.style && next.style.display != 'none') break; + } while(next); + } else { + do { + next = next.previousSibling; + if (next && next.style && next.style.display != 'none') break; + } while(next); + } + if (next && next.className.indexOf('stopper') == -1) { + this.$current.removeClass('current'); + $(next).addClass('current'); + scrollIntoView(next, this.$element[0]); + this.$current = $(next); + } + return true; + } + + function toggleVis($li, show) { + var closed = $li.hasClass('closed'), + children = $li[0].searchdoc_tree_data.children; + $li.css('display', show ? '' : 'none') + if (!show && this.$current && $li[0] == this.$current[0]) { + this.$current.removeClass('current'); + this.$current = null; + } + for (var i=0, l = children.length; i < l; i++) { + toggleVis.call(this, $(children[i].li), show && !closed); + }; + } + + function buildAndAppendItem(item, level, before) { + var li = renderItem(item, level), + list = this.$list[0]; + item.li = li; + list.insertBefore(li, before); + for (var i=0, l = item[3].length; i < l; i++) { + buildAndAppendItem.call(this, item[3][i], level + 1, before); + }; + return li; + } + + function renderItem(item, level) { + var li = document.createElement('li'), + cnt = document.createElement('div'), + h1 = document.createElement('h1'), + p = document.createElement('p'), + icon, i; + + li.appendChild(cnt); + li.style.paddingLeft = getOffset(level); + cnt.className = 'content'; + if (!item[1]) li.className = 'empty '; + cnt.appendChild(h1); + // cnt.appendChild(p); + h1.appendChild(document.createTextNode(item[0])); + // p.appendChild(document.createTextNode(item[4])); + if (item[2]) { + i = document.createElement('i'); + i.appendChild(document.createTextNode(item[2])); + h1.appendChild(i); + } + if (item[3].length > 0) { + icon = document.createElement('div'); + icon.className = 'icon'; + cnt.appendChild(icon); + } + + // user direct assignement instead of $() + // it's 8x faster + // $(li).data('path', item[1]) + // .data('children', item[3]) + // .data('level', level) + // .css('display', level == 0 ? '' : 'none') + // .addClass('level_' + level) + // .addClass('closed'); + li.searchdoc_tree_data = { + path: item[1], + children: item[3], + level: level + } + li.style.display = level == 0 ? '' : 'none'; + li.className += 'level_' + level + ' closed'; + return li; + } + + function getOffset(level) { + return 5 + 18*level + 'px'; + } +}); diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/namespaces-frame.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/namespaces-frame.html new file mode 100644 index 0000000000..0bbb27b429 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/namespaces-frame.html @@ -0,0 +1,9 @@ + + + + + + Namespaces | PHP-FFMpeg API + + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/namespaces.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/namespaces.html new file mode 100644 index 0000000000..cae771aaaf --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/namespaces.html @@ -0,0 +1,77 @@ + + + + + + Namespaces | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +

Namespaces

+
+ + + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/opensearch.xml b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/opensearch.xml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/panel.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/panel.html new file mode 100644 index 0000000000..e4dccfeefc --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/panel.html @@ -0,0 +1,71 @@ + + + + PHP-FFMpeg API + + + + + + + + +
+
+ loading... +
+
+ +
+
+
    +
+
+
+
    +
+
+
+ + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/renderer.index b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/renderer.index new file mode 100644 index 0000000000..3d366fdcbf --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/renderer.index @@ -0,0 +1 @@ +C:19:"Sami\Renderer\Index":6516:{a:3:{i:0;a:69:{s:29:"FFMpeg\Coordinate\AspectRatio";s:40:"57da17e0a2eff2064bdf11846081968f148d0946";s:27:"FFMpeg\Coordinate\Dimension";s:40:"8bf62fd6d7c3c6c7af0d1e8ff61926f2d331bbda";s:27:"FFMpeg\Coordinate\FrameRate";s:40:"5d68fcd12e9a7669e1cfad903bf2f247b10de21d";s:23:"FFMpeg\Coordinate\Point";s:40:"c3d3332bce0338e54fa1cd9a5c7ea7e5512a454a";s:26:"FFMpeg\Coordinate\TimeCode";s:40:"3ed681781434f88d6890cd811e01c169fe303f04";s:26:"FFMpeg\Driver\FFMpegDriver";s:40:"fb805d21f4503c064945d813c9cec8fdc195ed3d";s:27:"FFMpeg\Driver\FFProbeDriver";s:40:"2cb35865c2fef7588cb53f609dabbd1ba64c54c3";s:35:"FFMpeg\Exception\ExceptionInterface";s:40:"a8ea4b6beb62ed782ec33f97df5d81e49c319207";s:44:"FFMpeg\Exception\ExecutableNotFoundException";s:40:"b94d9119109abd3a4d347fb44338e3fc12da1eeb";s:41:"FFMpeg\Exception\InvalidArgumentException";s:40:"7b3c37264e64ad4525408f0b1ddc998950963cbc";s:31:"FFMpeg\Exception\LogicException";s:40:"4e8d24c7ac8465366b62958c30a45d1f677587cb";s:33:"FFMpeg\Exception\RuntimeException";s:40:"94b034160f13f78b3f21e147aedd8f95576f3166";s:13:"FFMpeg\FFMpeg";s:40:"0d1b826fb2a44c049740679334e7b6a5b59ae68b";s:28:"FFMpeg\FFMpegServiceProvider";s:40:"688399dfaae0872e021b655c8c15b26f66e7172d";s:14:"FFMpeg\FFProbe";s:40:"4ee7e67efd6ac5551047209bbaa2f511b4f545f5";s:39:"FFMpeg\FFProbe\DataMapping\AbstractData";s:40:"a7ea09c61353e46d07e4a6232644146e3288fb47";s:33:"FFMpeg\FFProbe\DataMapping\Format";s:40:"b49dfcfc07ef236aa6098cfeb85b1abd261c3cc2";s:33:"FFMpeg\FFProbe\DataMapping\Stream";s:40:"58188ef802a3f8736c6f86d2320016eef0415a3c";s:43:"FFMpeg\FFProbe\DataMapping\StreamCollection";s:40:"958bc86b078a708f31e6f829b177ce6fe7666052";s:21:"FFMpeg\FFProbe\Mapper";s:40:"abd650c1aaf38c3f8aa3be1ecc807fa59caa66ae";s:30:"FFMpeg\FFProbe\MapperInterface";s:40:"5a1482bed58b3922fcd4350e94c2233e7f242481";s:28:"FFMpeg\FFProbe\OptionsTester";s:40:"459fe1fa6c1ce5458e83a5d62b3f138a570c59ec";s:37:"FFMpeg\FFProbe\OptionsTesterInterface";s:40:"b582a1b5880368fc0bf1ea50e7fd73bd10855713";s:27:"FFMpeg\FFProbe\OutputParser";s:40:"19484b4e8def426ff8385e72cb2c358eeaf2f432";s:36:"FFMpeg\FFProbe\OutputParserInterface";s:40:"9d94ec72720761e297186815aea711860b85c790";s:41:"FFMpeg\Filters\Audio\AudioFilterInterface";s:40:"8fdf02d335fc63636f0fd9c97030618c59af010f";s:33:"FFMpeg\Filters\Audio\AudioFilters";s:40:"b07e52bbe4014a245eeaaf57bb2d24b8717d414d";s:43:"FFMpeg\Filters\Audio\AudioResamplableFilter";s:40:"a9b6f5143248acc9e76f65a86a01f463fa8ad9e2";s:33:"FFMpeg\Filters\Audio\SimpleFilter";s:40:"c78f9a3cf1e0b57d4ddf5cd7326cbb18f92ba56f";s:30:"FFMpeg\Filters\FilterInterface";s:40:"cfe4ed42a9a5eed222c2dea0568918b91d9b27c9";s:32:"FFMpeg\Filters\FiltersCollection";s:40:"0b10c4cd6344f8b24cfff6fddc8fdf0339a69412";s:44:"FFMpeg\Filters\Frame\DisplayRatioFixerFilter";s:40:"74767da6b7007dcc49c29c8e2b6f2e9975096a78";s:41:"FFMpeg\Filters\Frame\FrameFilterInterface";s:40:"ca1664998ca7a964f3bde800cf11a1d404ef27c6";s:33:"FFMpeg\Filters\Frame\FrameFilters";s:40:"f431f8b86388255862fb964f901b1cbac3e1d240";s:31:"FFMpeg\Filters\Video\ClipFilter";s:40:"16d3429964854e6fedad94b34c704f57d704ac62";s:33:"FFMpeg\Filters\Video\CustomFilter";s:40:"276f66be3f641aa028af792becc0be8721cea0a7";s:36:"FFMpeg\Filters\Video\FrameRateFilter";s:40:"282f7baefa142ce9c88ab84be8c5c8547a1fa125";s:33:"FFMpeg\Filters\Video\ResizeFilter";s:40:"65ce5e2a7474371cfa357914cdc253ba486d7d6b";s:33:"FFMpeg\Filters\Video\RotateFilter";s:40:"1520734eaf74545b35a358d764672521ff71e090";s:38:"FFMpeg\Filters\Video\SynchronizeFilter";s:40:"e614f7a1594f0d11a715ca046bd9e00099019381";s:41:"FFMpeg\Filters\Video\VideoFilterInterface";s:40:"780680d9a2e5080dac81ea8dca8575afbb1c0618";s:33:"FFMpeg\Filters\Video\VideoFilters";s:40:"bc6a884e5f741e6b7de73bb82e3c870a314f3f59";s:36:"FFMpeg\Filters\Video\WatermarkFilter";s:40:"5110a94b410e200c40ffb22e21f05a452cac1e0b";s:28:"FFMpeg\Format\AudioInterface";s:40:"d3880d55d6d575b2fb5ef18ddc7379b6d00f7d0b";s:23:"FFMpeg\Format\Audio\Aac";s:40:"11485603d1dd6333b4df9ef2a0e85c98c409d053";s:32:"FFMpeg\Format\Audio\DefaultAudio";s:40:"76509330e2f3d73909f786e2e5186f278b186827";s:24:"FFMpeg\Format\Audio\Flac";s:40:"28a6737f6890dc37ac7bd1e73745e9422aec2334";s:23:"FFMpeg\Format\Audio\Mp3";s:40:"1e0a9f51556efa0aabaaa659c5ee562e555509d2";s:26:"FFMpeg\Format\Audio\Vorbis";s:40:"374aa243933f925995c6db639583307ad89e55fa";s:23:"FFMpeg\Format\Audio\Wav";s:40:"cf5829652a2d6c1ecbbbc10169b1a9157ca7fa16";s:29:"FFMpeg\Format\FormatInterface";s:40:"89b9c804aa0c6a59cc1b5d32af91ba9e87f9f1db";s:28:"FFMpeg\Format\FrameInterface";s:40:"c846f893352d6d7e8334e3ac340b45300b8cebeb";s:55:"FFMpeg\Format\ProgressListener\AbstractProgressListener";s:40:"23d34d5e62384bac5ec5d8795663b1515b2d7d2a";s:52:"FFMpeg\Format\ProgressListener\AudioProgressListener";s:40:"fecd89f82565742d50124b73f6a314bdde660ce7";s:52:"FFMpeg\Format\ProgressListener\VideoProgressListener";s:40:"3dac687cec1e8c003ff7e5ad1f36868a0548b7ae";s:35:"FFMpeg\Format\ProgressableInterface";s:40:"2df70012a6fbc122cbcc60739b71b39da87f3e18";s:28:"FFMpeg\Format\VideoInterface";s:40:"3de87e72a970c97f7c1e3cd374b9b5e5c18ad9bd";s:32:"FFMpeg\Format\Video\DefaultVideo";s:40:"c214aadcb492bfd5cf352ab3a871e4ee282d29fb";s:23:"FFMpeg\Format\Video\Ogg";s:40:"cd38d313465b819d2c6247ef59993f8b8b01b2d9";s:23:"FFMpeg\Format\Video\WMV";s:40:"75192a3c3a8a9cfde8e56e2c930fa9baa7f14b5c";s:24:"FFMpeg\Format\Video\WMV3";s:40:"5b32ee16bf425cdf30e36c777176146e16feef22";s:24:"FFMpeg\Format\Video\WebM";s:40:"2938d3b5e3609bd9b279f93f44ed347d98628904";s:24:"FFMpeg\Format\Video\X264";s:40:"81a66aa4dea09cff05b714250e6425e11622a22c";s:30:"FFMpeg\Media\AbstractMediaType";s:40:"af2e82a19462716cfc7fd7ca340cc8c8f59a3670";s:36:"FFMpeg\Media\AbstractStreamableMedia";s:40:"feac899e370fe2a8d4d5a0b76facbd8154d0bbf1";s:18:"FFMpeg\Media\Audio";s:40:"4eda826dbcc6bc6a45ac39f48ac7340af58fa3f6";s:18:"FFMpeg\Media\Frame";s:40:"827898202f4a4ba13dfbfb937787b561935066b0";s:31:"FFMpeg\Media\MediaTypeInterface";s:40:"175f798e490746d9283bda93cf4f935adb94e929";s:18:"FFMpeg\Media\Video";s:40:"1898a3a561670cc2f3f2106d635a8509d12ed232";}i:1;a:1:{i:0;s:6:"master";}i:2;a:15:{i:0;s:6:"FFMpeg";i:1;s:17:"FFMpeg\Coordinate";i:2;s:13:"FFMpeg\Driver";i:3;s:16:"FFMpeg\Exception";i:4;s:14:"FFMpeg\FFProbe";i:5;s:26:"FFMpeg\FFProbe\DataMapping";i:6;s:14:"FFMpeg\Filters";i:7;s:20:"FFMpeg\Filters\Audio";i:8;s:20:"FFMpeg\Filters\Frame";i:9;s:20:"FFMpeg\Filters\Video";i:10;s:13:"FFMpeg\Format";i:11;s:19:"FFMpeg\Format\Audio";i:12;s:30:"FFMpeg\Format\ProgressListener";i:13;s:19:"FFMpeg\Format\Video";i:14;s:12:"FFMpeg\Media";}}} \ No newline at end of file diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/search_index.js b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/search_index.js new file mode 100644 index 0000000000..b361a96bca --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/search_index.js @@ -0,0 +1,7 @@ +var search_data = { + 'index': { + 'searchIndex': ["ffmpeg","ffmpeg\\coordinate","ffmpeg\\driver","ffmpeg\\exception","ffmpeg\\ffprobe","ffmpeg\\ffprobe\\datamapping","ffmpeg\\filters","ffmpeg\\filters\\audio","ffmpeg\\filters\\frame","ffmpeg\\filters\\video","ffmpeg\\format","ffmpeg\\format\\audio","ffmpeg\\format\\progresslistener","ffmpeg\\format\\video","ffmpeg\\media","ffmpeg\\coordinate\\aspectratio","ffmpeg\\coordinate\\dimension","ffmpeg\\coordinate\\framerate","ffmpeg\\coordinate\\point","ffmpeg\\coordinate\\timecode","ffmpeg\\driver\\ffmpegdriver","ffmpeg\\driver\\ffprobedriver","ffmpeg\\exception\\exceptioninterface","ffmpeg\\exception\\executablenotfoundexception","ffmpeg\\exception\\invalidargumentexception","ffmpeg\\exception\\logicexception","ffmpeg\\exception\\runtimeexception","ffmpeg\\ffmpeg","ffmpeg\\ffmpegserviceprovider","ffmpeg\\ffprobe","ffmpeg\\ffprobe\\datamapping\\abstractdata","ffmpeg\\ffprobe\\datamapping\\format","ffmpeg\\ffprobe\\datamapping\\stream","ffmpeg\\ffprobe\\datamapping\\streamcollection","ffmpeg\\ffprobe\\mapper","ffmpeg\\ffprobe\\mapperinterface","ffmpeg\\ffprobe\\optionstester","ffmpeg\\ffprobe\\optionstesterinterface","ffmpeg\\ffprobe\\outputparser","ffmpeg\\ffprobe\\outputparserinterface","ffmpeg\\filters\\audio\\audiofilterinterface","ffmpeg\\filters\\audio\\audiofilters","ffmpeg\\filters\\audio\\audioresamplablefilter","ffmpeg\\filters\\audio\\simplefilter","ffmpeg\\filters\\filterinterface","ffmpeg\\filters\\filterscollection","ffmpeg\\filters\\frame\\displayratiofixerfilter","ffmpeg\\filters\\frame\\framefilterinterface","ffmpeg\\filters\\frame\\framefilters","ffmpeg\\filters\\video\\clipfilter","ffmpeg\\filters\\video\\customfilter","ffmpeg\\filters\\video\\frameratefilter","ffmpeg\\filters\\video\\resizefilter","ffmpeg\\filters\\video\\rotatefilter","ffmpeg\\filters\\video\\synchronizefilter","ffmpeg\\filters\\video\\videofilterinterface","ffmpeg\\filters\\video\\videofilters","ffmpeg\\filters\\video\\watermarkfilter","ffmpeg\\format\\audiointerface","ffmpeg\\format\\audio\\aac","ffmpeg\\format\\audio\\defaultaudio","ffmpeg\\format\\audio\\flac","ffmpeg\\format\\audio\\mp3","ffmpeg\\format\\audio\\vorbis","ffmpeg\\format\\audio\\wav","ffmpeg\\format\\formatinterface","ffmpeg\\format\\frameinterface","ffmpeg\\format\\progresslistener\\abstractprogresslistener","ffmpeg\\format\\progresslistener\\audioprogresslistener","ffmpeg\\format\\progresslistener\\videoprogresslistener","ffmpeg\\format\\progressableinterface","ffmpeg\\format\\videointerface","ffmpeg\\format\\video\\defaultvideo","ffmpeg\\format\\video\\ogg","ffmpeg\\format\\video\\wmv","ffmpeg\\format\\video\\wmv3","ffmpeg\\format\\video\\webm","ffmpeg\\format\\video\\x264","ffmpeg\\media\\abstractmediatype","ffmpeg\\media\\abstractstreamablemedia","ffmpeg\\media\\audio","ffmpeg\\media\\frame","ffmpeg\\media\\mediatypeinterface","ffmpeg\\media\\video","ffmpeg\\coordinate\\aspectratio::__construct","ffmpeg\\coordinate\\aspectratio::getvalue","ffmpeg\\coordinate\\aspectratio::calculatewidth","ffmpeg\\coordinate\\aspectratio::calculateheight","ffmpeg\\coordinate\\aspectratio::create","ffmpeg\\coordinate\\dimension::__construct","ffmpeg\\coordinate\\dimension::getwidth","ffmpeg\\coordinate\\dimension::getheight","ffmpeg\\coordinate\\dimension::getratio","ffmpeg\\coordinate\\framerate::__construct","ffmpeg\\coordinate\\framerate::getvalue","ffmpeg\\coordinate\\point::__construct","ffmpeg\\coordinate\\point::getx","ffmpeg\\coordinate\\point::gety","ffmpeg\\coordinate\\timecode::__construct","ffmpeg\\coordinate\\timecode::__tostring","ffmpeg\\coordinate\\timecode::fromstring","ffmpeg\\coordinate\\timecode::fromseconds","ffmpeg\\driver\\ffmpegdriver::getname","ffmpeg\\driver\\ffmpegdriver::create","ffmpeg\\driver\\ffprobedriver::getname","ffmpeg\\driver\\ffprobedriver::create","ffmpeg\\ffmpeg::__construct","ffmpeg\\ffmpeg::setffprobe","ffmpeg\\ffmpeg::getffprobe","ffmpeg\\ffmpeg::setffmpegdriver","ffmpeg\\ffmpeg::getffmpegdriver","ffmpeg\\ffmpeg::open","ffmpeg\\ffmpeg::create","ffmpeg\\ffmpegserviceprovider::register","ffmpeg\\ffmpegserviceprovider::boot","ffmpeg\\ffprobe::__construct","ffmpeg\\ffprobe::getparser","ffmpeg\\ffprobe::setparser","ffmpeg\\ffprobe::getffprobedriver","ffmpeg\\ffprobe::setffprobedriver","ffmpeg\\ffprobe::setoptionstester","ffmpeg\\ffprobe::getoptionstester","ffmpeg\\ffprobe::setcache","ffmpeg\\ffprobe::getcache","ffmpeg\\ffprobe::getmapper","ffmpeg\\ffprobe::setmapper","ffmpeg\\ffprobe::format","ffmpeg\\ffprobe::streams","ffmpeg\\ffprobe::create","ffmpeg\\ffprobe\\datamapping\\abstractdata::__construct","ffmpeg\\ffprobe\\datamapping\\abstractdata::has","ffmpeg\\ffprobe\\datamapping\\abstractdata::get","ffmpeg\\ffprobe\\datamapping\\abstractdata::set","ffmpeg\\ffprobe\\datamapping\\abstractdata::keys","ffmpeg\\ffprobe\\datamapping\\abstractdata::all","ffmpeg\\ffprobe\\datamapping\\abstractdata::count","ffmpeg\\ffprobe\\datamapping\\stream::isaudio","ffmpeg\\ffprobe\\datamapping\\stream::isvideo","ffmpeg\\ffprobe\\datamapping\\stream::getdimensions","ffmpeg\\ffprobe\\datamapping\\streamcollection::__construct","ffmpeg\\ffprobe\\datamapping\\streamcollection::first","ffmpeg\\ffprobe\\datamapping\\streamcollection::add","ffmpeg\\ffprobe\\datamapping\\streamcollection::videos","ffmpeg\\ffprobe\\datamapping\\streamcollection::audios","ffmpeg\\ffprobe\\datamapping\\streamcollection::count","ffmpeg\\ffprobe\\datamapping\\streamcollection::all","ffmpeg\\ffprobe\\datamapping\\streamcollection::getiterator","ffmpeg\\ffprobe\\mapper::map","ffmpeg\\ffprobe\\mapperinterface::map","ffmpeg\\ffprobe\\optionstester::__construct","ffmpeg\\ffprobe\\optionstester::has","ffmpeg\\ffprobe\\optionstesterinterface::has","ffmpeg\\ffprobe\\outputparser::parse","ffmpeg\\ffprobe\\outputparserinterface::parse","ffmpeg\\filters\\audio\\audiofilterinterface::apply","ffmpeg\\filters\\audio\\audiofilters::__construct","ffmpeg\\filters\\audio\\audiofilters::resample","ffmpeg\\filters\\audio\\audioresamplablefilter::__construct","ffmpeg\\filters\\audio\\audioresamplablefilter::getpriority","ffmpeg\\filters\\audio\\audioresamplablefilter::getrate","ffmpeg\\filters\\audio\\audioresamplablefilter::apply","ffmpeg\\filters\\audio\\simplefilter::__construct","ffmpeg\\filters\\audio\\simplefilter::getpriority","ffmpeg\\filters\\audio\\simplefilter::apply","ffmpeg\\filters\\filterinterface::getpriority","ffmpeg\\filters\\filterscollection::add","ffmpeg\\filters\\filterscollection::count","ffmpeg\\filters\\filterscollection::getiterator","ffmpeg\\filters\\frame\\displayratiofixerfilter::__construct","ffmpeg\\filters\\frame\\displayratiofixerfilter::getpriority","ffmpeg\\filters\\frame\\displayratiofixerfilter::apply","ffmpeg\\filters\\frame\\framefilterinterface::apply","ffmpeg\\filters\\frame\\framefilters::__construct","ffmpeg\\filters\\frame\\framefilters::fixdisplayratio","ffmpeg\\filters\\video\\clipfilter::__construct","ffmpeg\\filters\\video\\clipfilter::getpriority","ffmpeg\\filters\\video\\clipfilter::getstart","ffmpeg\\filters\\video\\clipfilter::getduration","ffmpeg\\filters\\video\\clipfilter::apply","ffmpeg\\filters\\video\\customfilter::__construct","ffmpeg\\filters\\video\\customfilter::getpriority","ffmpeg\\filters\\video\\customfilter::apply","ffmpeg\\filters\\video\\frameratefilter::__construct","ffmpeg\\filters\\video\\frameratefilter::getpriority","ffmpeg\\filters\\video\\frameratefilter::getframerate","ffmpeg\\filters\\video\\frameratefilter::getgop","ffmpeg\\filters\\video\\frameratefilter::apply","ffmpeg\\filters\\video\\resizefilter::__construct","ffmpeg\\filters\\video\\resizefilter::getpriority","ffmpeg\\filters\\video\\resizefilter::getdimension","ffmpeg\\filters\\video\\resizefilter::getmode","ffmpeg\\filters\\video\\resizefilter::arestandardsforced","ffmpeg\\filters\\video\\resizefilter::apply","ffmpeg\\filters\\video\\rotatefilter::__construct","ffmpeg\\filters\\video\\rotatefilter::getpriority","ffmpeg\\filters\\video\\rotatefilter::getangle","ffmpeg\\filters\\video\\rotatefilter::apply","ffmpeg\\filters\\video\\synchronizefilter::__construct","ffmpeg\\filters\\video\\synchronizefilter::getpriority","ffmpeg\\filters\\video\\synchronizefilter::apply","ffmpeg\\filters\\video\\videofilterinterface::apply","ffmpeg\\filters\\video\\videofilters::__construct","ffmpeg\\filters\\video\\videofilters::resize","ffmpeg\\filters\\video\\videofilters::framerate","ffmpeg\\filters\\video\\videofilters::synchronize","ffmpeg\\filters\\video\\videofilters::clip","ffmpeg\\filters\\video\\videofilters::audioresample","ffmpeg\\filters\\video\\videofilters::rotate","ffmpeg\\filters\\video\\videofilters::watermark","ffmpeg\\filters\\video\\watermarkfilter::__construct","ffmpeg\\filters\\video\\watermarkfilter::getpriority","ffmpeg\\filters\\video\\watermarkfilter::apply","ffmpeg\\format\\audiointerface::getaudiokilobitrate","ffmpeg\\format\\audiointerface::getaudiochannels","ffmpeg\\format\\audiointerface::getaudiocodec","ffmpeg\\format\\audiointerface::getavailableaudiocodecs","ffmpeg\\format\\audio\\aac::__construct","ffmpeg\\format\\audio\\aac::getavailableaudiocodecs","ffmpeg\\format\\audio\\defaultaudio::getextraparams","ffmpeg\\format\\audio\\defaultaudio::getaudiocodec","ffmpeg\\format\\audio\\defaultaudio::setaudiocodec","ffmpeg\\format\\audio\\defaultaudio::getaudiokilobitrate","ffmpeg\\format\\audio\\defaultaudio::setaudiokilobitrate","ffmpeg\\format\\audio\\defaultaudio::getaudiochannels","ffmpeg\\format\\audio\\defaultaudio::setaudiochannels","ffmpeg\\format\\audio\\defaultaudio::createprogresslistener","ffmpeg\\format\\audio\\defaultaudio::getpasses","ffmpeg\\format\\audio\\flac::__construct","ffmpeg\\format\\audio\\flac::getavailableaudiocodecs","ffmpeg\\format\\audio\\mp3::__construct","ffmpeg\\format\\audio\\mp3::getavailableaudiocodecs","ffmpeg\\format\\audio\\vorbis::__construct","ffmpeg\\format\\audio\\vorbis::getextraparams","ffmpeg\\format\\audio\\vorbis::getavailableaudiocodecs","ffmpeg\\format\\audio\\wav::__construct","ffmpeg\\format\\audio\\wav::getavailableaudiocodecs","ffmpeg\\format\\formatinterface::getpasses","ffmpeg\\format\\formatinterface::getextraparams","ffmpeg\\format\\progresslistener\\abstractprogresslistener::__construct","ffmpeg\\format\\progresslistener\\abstractprogresslistener::getffprobe","ffmpeg\\format\\progresslistener\\abstractprogresslistener::getpathfile","ffmpeg\\format\\progresslistener\\abstractprogresslistener::getcurrentpass","ffmpeg\\format\\progresslistener\\abstractprogresslistener::gettotalpass","ffmpeg\\format\\progresslistener\\abstractprogresslistener::handle","ffmpeg\\format\\progresslistener\\abstractprogresslistener::forwardedevents","ffmpeg\\format\\progresslistener\\audioprogresslistener::getpattern","ffmpeg\\format\\progresslistener\\videoprogresslistener::getpattern","ffmpeg\\format\\progressableinterface::createprogresslistener","ffmpeg\\format\\videointerface::getkilobitrate","ffmpeg\\format\\videointerface::getmodulus","ffmpeg\\format\\videointerface::getvideocodec","ffmpeg\\format\\videointerface::supportbframes","ffmpeg\\format\\videointerface::getavailablevideocodecs","ffmpeg\\format\\video\\defaultvideo::getkilobitrate","ffmpeg\\format\\video\\defaultvideo::setkilobitrate","ffmpeg\\format\\video\\defaultvideo::getvideocodec","ffmpeg\\format\\video\\defaultvideo::setvideocodec","ffmpeg\\format\\video\\defaultvideo::getmodulus","ffmpeg\\format\\video\\defaultvideo::createprogresslistener","ffmpeg\\format\\video\\ogg::__construct","ffmpeg\\format\\video\\ogg::supportbframes","ffmpeg\\format\\video\\ogg::getavailableaudiocodecs","ffmpeg\\format\\video\\ogg::getavailablevideocodecs","ffmpeg\\format\\video\\wmv::__construct","ffmpeg\\format\\video\\wmv::supportbframes","ffmpeg\\format\\video\\wmv::getavailableaudiocodecs","ffmpeg\\format\\video\\wmv::getavailablevideocodecs","ffmpeg\\format\\video\\wmv3::__construct","ffmpeg\\format\\video\\wmv3::supportbframes","ffmpeg\\format\\video\\wmv3::getavailableaudiocodecs","ffmpeg\\format\\video\\wmv3::getavailablevideocodecs","ffmpeg\\format\\video\\webm::__construct","ffmpeg\\format\\video\\webm::supportbframes","ffmpeg\\format\\video\\webm::getextraparams","ffmpeg\\format\\video\\webm::getavailableaudiocodecs","ffmpeg\\format\\video\\webm::getavailablevideocodecs","ffmpeg\\format\\video\\x264::__construct","ffmpeg\\format\\video\\x264::supportbframes","ffmpeg\\format\\video\\x264::setbframessupport","ffmpeg\\format\\video\\x264::getavailableaudiocodecs","ffmpeg\\format\\video\\x264::getavailablevideocodecs","ffmpeg\\format\\video\\x264::getpasses","ffmpeg\\format\\video\\x264::getmodulus","ffmpeg\\media\\abstractmediatype::__construct","ffmpeg\\media\\abstractmediatype::getffmpegdriver","ffmpeg\\media\\abstractmediatype::setffmpegdriver","ffmpeg\\media\\abstractmediatype::getffprobe","ffmpeg\\media\\abstractmediatype::setffprobe","ffmpeg\\media\\abstractmediatype::getpathfile","ffmpeg\\media\\abstractmediatype::setfilterscollection","ffmpeg\\media\\abstractmediatype::getfilterscollection","ffmpeg\\media\\abstractstreamablemedia::getstreams","ffmpeg\\media\\abstractstreamablemedia::getformat","ffmpeg\\media\\audio::filters","ffmpeg\\media\\audio::addfilter","ffmpeg\\media\\audio::save","ffmpeg\\media\\frame::__construct","ffmpeg\\media\\frame::getvideo","ffmpeg\\media\\frame::filters","ffmpeg\\media\\frame::addfilter","ffmpeg\\media\\frame::gettimecode","ffmpeg\\media\\frame::save","ffmpeg\\media\\mediatypeinterface::filters","ffmpeg\\media\\mediatypeinterface::getpathfile","ffmpeg\\media\\video::filters","ffmpeg\\media\\video::addfilter","ffmpeg\\media\\video::save","ffmpeg\\media\\video::frame"], + 'info': [["FFMpeg","","FFMpeg.html","","",3],["FFMpeg\\Coordinate","","FFMpeg\/Coordinate.html","","",3],["FFMpeg\\Driver","","FFMpeg\/Driver.html","","",3],["FFMpeg\\Exception","","FFMpeg\/Exception.html","","",3],["FFMpeg\\FFProbe","","FFMpeg\/FFProbe.html","","",3],["FFMpeg\\FFProbe\\DataMapping","","FFMpeg\/FFProbe\/DataMapping.html","","",3],["FFMpeg\\Filters","","FFMpeg\/Filters.html","","",3],["FFMpeg\\Filters\\Audio","","FFMpeg\/Filters\/Audio.html","","",3],["FFMpeg\\Filters\\Frame","","FFMpeg\/Filters\/Frame.html","","",3],["FFMpeg\\Filters\\Video","","FFMpeg\/Filters\/Video.html","","",3],["FFMpeg\\Format","","FFMpeg\/Format.html","","",3],["FFMpeg\\Format\\Audio","","FFMpeg\/Format\/Audio.html","","",3],["FFMpeg\\Format\\ProgressListener","","FFMpeg\/Format\/ProgressListener.html","","",3],["FFMpeg\\Format\\Video","","FFMpeg\/Format\/Video.html","","",3],["FFMpeg\\Media","","FFMpeg\/Media.html","","",3],["AspectRatio","FFMpeg\\Coordinate","FFMpeg\/Coordinate\/AspectRatio.html","","",1],["Dimension","FFMpeg\\Coordinate","FFMpeg\/Coordinate\/Dimension.html","","Dimension object, used for manipulating width and height",1],["FrameRate","FFMpeg\\Coordinate","FFMpeg\/Coordinate\/FrameRate.html","","",1],["Point","FFMpeg\\Coordinate","FFMpeg\/Coordinate\/Point.html","","",1],["TimeCode","FFMpeg\\Coordinate","FFMpeg\/Coordinate\/TimeCode.html","","",1],["FFMpegDriver","FFMpeg\\Driver","FFMpeg\/Driver\/FFMpegDriver.html"," < AbstractBinary","",1],["FFProbeDriver","FFMpeg\\Driver","FFMpeg\/Driver\/FFProbeDriver.html"," < AbstractBinary","",1],["ExceptionInterface","FFMpeg\\Exception","FFMpeg\/Exception\/ExceptionInterface.html","","",1],["ExecutableNotFoundException","FFMpeg\\Exception","FFMpeg\/Exception\/ExecutableNotFoundException.html"," < RuntimeException","",1],["InvalidArgumentException","FFMpeg\\Exception","FFMpeg\/Exception\/InvalidArgumentException.html"," < InvalidArgumentException","",1],["LogicException","FFMpeg\\Exception","FFMpeg\/Exception\/LogicException.html"," < LogicException","",1],["RuntimeException","FFMpeg\\Exception","FFMpeg\/Exception\/RuntimeException.html"," < RuntimeException","",1],["FFMpeg","FFMpeg","FFMpeg\/FFMpeg.html","","",1],["FFMpegServiceProvider","FFMpeg","FFMpeg\/FFMpegServiceProvider.html","","",1],["FFProbe","FFMpeg","FFMpeg\/FFProbe.html","","",1],["AbstractData","FFMpeg\\FFProbe\\DataMapping","FFMpeg\/FFProbe\/DataMapping\/AbstractData.html","","",1],["Format","FFMpeg\\FFProbe\\DataMapping","FFMpeg\/FFProbe\/DataMapping\/Format.html"," < AbstractData","",1],["Stream","FFMpeg\\FFProbe\\DataMapping","FFMpeg\/FFProbe\/DataMapping\/Stream.html"," < AbstractData","",1],["StreamCollection","FFMpeg\\FFProbe\\DataMapping","FFMpeg\/FFProbe\/DataMapping\/StreamCollection.html","","",1],["Mapper","FFMpeg\\FFProbe","FFMpeg\/FFProbe\/Mapper.html","","",1],["MapperInterface","FFMpeg\\FFProbe","FFMpeg\/FFProbe\/MapperInterface.html","","",1],["OptionsTester","FFMpeg\\FFProbe","FFMpeg\/FFProbe\/OptionsTester.html","","",1],["OptionsTesterInterface","FFMpeg\\FFProbe","FFMpeg\/FFProbe\/OptionsTesterInterface.html","","",1],["OutputParser","FFMpeg\\FFProbe","FFMpeg\/FFProbe\/OutputParser.html","","",1],["OutputParserInterface","FFMpeg\\FFProbe","FFMpeg\/FFProbe\/OutputParserInterface.html","","",1],["AudioFilterInterface","FFMpeg\\Filters\\Audio","FFMpeg\/Filters\/Audio\/AudioFilterInterface.html","","",1],["AudioFilters","FFMpeg\\Filters\\Audio","FFMpeg\/Filters\/Audio\/AudioFilters.html","","",1],["AudioResamplableFilter","FFMpeg\\Filters\\Audio","FFMpeg\/Filters\/Audio\/AudioResamplableFilter.html","","",1],["SimpleFilter","FFMpeg\\Filters\\Audio","FFMpeg\/Filters\/Audio\/SimpleFilter.html","","",1],["FilterInterface","FFMpeg\\Filters","FFMpeg\/Filters\/FilterInterface.html","","",1],["FiltersCollection","FFMpeg\\Filters","FFMpeg\/Filters\/FiltersCollection.html","","",1],["DisplayRatioFixerFilter","FFMpeg\\Filters\\Frame","FFMpeg\/Filters\/Frame\/DisplayRatioFixerFilter.html","","",1],["FrameFilterInterface","FFMpeg\\Filters\\Frame","FFMpeg\/Filters\/Frame\/FrameFilterInterface.html","","",1],["FrameFilters","FFMpeg\\Filters\\Frame","FFMpeg\/Filters\/Frame\/FrameFilters.html","","",1],["ClipFilter","FFMpeg\\Filters\\Video","FFMpeg\/Filters\/Video\/ClipFilter.html","","",1],["CustomFilter","FFMpeg\\Filters\\Video","FFMpeg\/Filters\/Video\/CustomFilter.html","","",1],["FrameRateFilter","FFMpeg\\Filters\\Video","FFMpeg\/Filters\/Video\/FrameRateFilter.html","","",1],["ResizeFilter","FFMpeg\\Filters\\Video","FFMpeg\/Filters\/Video\/ResizeFilter.html","","",1],["RotateFilter","FFMpeg\\Filters\\Video","FFMpeg\/Filters\/Video\/RotateFilter.html","","",1],["SynchronizeFilter","FFMpeg\\Filters\\Video","FFMpeg\/Filters\/Video\/SynchronizeFilter.html","","Synchronizes audio and video in case of desynchronized",1],["VideoFilterInterface","FFMpeg\\Filters\\Video","FFMpeg\/Filters\/Video\/VideoFilterInterface.html","","",1],["VideoFilters","FFMpeg\\Filters\\Video","FFMpeg\/Filters\/Video\/VideoFilters.html"," < AudioFilters","",1],["WatermarkFilter","FFMpeg\\Filters\\Video","FFMpeg\/Filters\/Video\/WatermarkFilter.html","","",1],["AudioInterface","FFMpeg\\Format","FFMpeg\/Format\/AudioInterface.html","","",1],["Aac","FFMpeg\\Format\\Audio","FFMpeg\/Format\/Audio\/Aac.html"," < DefaultAudio","The AAC audio format",1],["DefaultAudio","FFMpeg\\Format\\Audio","FFMpeg\/Format\/Audio\/DefaultAudio.html"," < EventEmitter","",1],["Flac","FFMpeg\\Format\\Audio","FFMpeg\/Format\/Audio\/Flac.html"," < DefaultAudio","The Flac audio format",1],["Mp3","FFMpeg\\Format\\Audio","FFMpeg\/Format\/Audio\/Mp3.html"," < DefaultAudio","The MP3 audio format",1],["Vorbis","FFMpeg\\Format\\Audio","FFMpeg\/Format\/Audio\/Vorbis.html"," < DefaultAudio","The Vorbis audio format",1],["Wav","FFMpeg\\Format\\Audio","FFMpeg\/Format\/Audio\/Wav.html"," < DefaultAudio","The WAV audio format",1],["FormatInterface","FFMpeg\\Format","FFMpeg\/Format\/FormatInterface.html","","",1],["FrameInterface","FFMpeg\\Format","FFMpeg\/Format\/FrameInterface.html","","",1],["AbstractProgressListener","FFMpeg\\Format\\ProgressListener","FFMpeg\/Format\/ProgressListener\/AbstractProgressListener.html"," < EventEmitter","",1],["AudioProgressListener","FFMpeg\\Format\\ProgressListener","FFMpeg\/Format\/ProgressListener\/AudioProgressListener.html"," < AbstractProgressListener","Parses ffmpeg stderr progress information.",1],["VideoProgressListener","FFMpeg\\Format\\ProgressListener","FFMpeg\/Format\/ProgressListener\/VideoProgressListener.html"," < AbstractProgressListener","Parses ffmpeg stderr progress information for video",1],["ProgressableInterface","FFMpeg\\Format","FFMpeg\/Format\/ProgressableInterface.html","","",1],["VideoInterface","FFMpeg\\Format","FFMpeg\/Format\/VideoInterface.html","","",1],["DefaultVideo","FFMpeg\\Format\\Video","FFMpeg\/Format\/Video\/DefaultVideo.html"," < DefaultAudio","The abstract default Video format",1],["Ogg","FFMpeg\\Format\\Video","FFMpeg\/Format\/Video\/Ogg.html"," < DefaultVideo","The Ogg video format",1],["WMV","FFMpeg\\Format\\Video","FFMpeg\/Format\/Video\/WMV.html"," < DefaultVideo","The WMV video format",1],["WMV3","FFMpeg\\Format\\Video","FFMpeg\/Format\/Video\/WMV3.html"," < DefaultVideo","The WMV video format",1],["WebM","FFMpeg\\Format\\Video","FFMpeg\/Format\/Video\/WebM.html"," < DefaultVideo","The WebM video format",1],["X264","FFMpeg\\Format\\Video","FFMpeg\/Format\/Video\/X264.html"," < DefaultVideo","The X264 video format",1],["AbstractMediaType","FFMpeg\\Media","FFMpeg\/Media\/AbstractMediaType.html","","",1],["AbstractStreamableMedia","FFMpeg\\Media","FFMpeg\/Media\/AbstractStreamableMedia.html"," < AbstractMediaType","",1],["Audio","FFMpeg\\Media","FFMpeg\/Media\/Audio.html"," < AbstractStreamableMedia","",1],["Frame","FFMpeg\\Media","FFMpeg\/Media\/Frame.html"," < AbstractMediaType","",1],["MediaTypeInterface","FFMpeg\\Media","FFMpeg\/Media\/MediaTypeInterface.html","","",1],["Video","FFMpeg\\Media","FFMpeg\/Media\/Video.html"," < Audio","",1],["AspectRatio::__construct","FFMpeg\\Coordinate\\AspectRatio","FFMpeg\/Coordinate\/AspectRatio.html#method___construct","($ratio)","",2],["AspectRatio::getValue","FFMpeg\\Coordinate\\AspectRatio","FFMpeg\/Coordinate\/AspectRatio.html#method_getValue","()","Returns the value of the ratio.",2],["AspectRatio::calculateWidth","FFMpeg\\Coordinate\\AspectRatio","FFMpeg\/Coordinate\/AspectRatio.html#method_calculateWidth","(Integer $height, Integer $modulus = 1)","Computes the best width for given height and modulus.",2],["AspectRatio::calculateHeight","FFMpeg\\Coordinate\\AspectRatio","FFMpeg\/Coordinate\/AspectRatio.html#method_calculateHeight","(Integer $width, Integer $modulus = 1)","Computes the best height for given width and modulus.",2],["AspectRatio::create","FFMpeg\\Coordinate\\AspectRatio","FFMpeg\/Coordinate\/AspectRatio.html#method_create","(Dimension<\/abbr><\/a> $dimension, Boolean $forceStandards = true)","Creates a ratio based on Dimension.",2],["Dimension::__construct","FFMpeg\\Coordinate\\Dimension","FFMpeg\/Coordinate\/Dimension.html#method___construct","(integer $width, integer $height)","",2],["Dimension::getWidth","FFMpeg\\Coordinate\\Dimension","FFMpeg\/Coordinate\/Dimension.html#method_getWidth","()","Returns width.",2],["Dimension::getHeight","FFMpeg\\Coordinate\\Dimension","FFMpeg\/Coordinate\/Dimension.html#method_getHeight","()","Returns height.",2],["Dimension::getRatio","FFMpeg\\Coordinate\\Dimension","FFMpeg\/Coordinate\/Dimension.html#method_getRatio","(type<\/abbr> $forceStandards = true)","Returns the ratio.",2],["FrameRate::__construct","FFMpeg\\Coordinate\\FrameRate","FFMpeg\/Coordinate\/FrameRate.html#method___construct","($value)","",2],["FrameRate::getValue","FFMpeg\\Coordinate\\FrameRate","FFMpeg\/Coordinate\/FrameRate.html#method_getValue","()","",2],["Point::__construct","FFMpeg\\Coordinate\\Point","FFMpeg\/Coordinate\/Point.html#method___construct","($x, $y)","",2],["Point::getX","FFMpeg\\Coordinate\\Point","FFMpeg\/Coordinate\/Point.html#method_getX","()","",2],["Point::getY","FFMpeg\\Coordinate\\Point","FFMpeg\/Coordinate\/Point.html#method_getY","()","",2],["TimeCode::__construct","FFMpeg\\Coordinate\\TimeCode","FFMpeg\/Coordinate\/TimeCode.html#method___construct","($hours, $minutes, $seconds, $frames)","",2],["TimeCode::__toString","FFMpeg\\Coordinate\\TimeCode","FFMpeg\/Coordinate\/TimeCode.html#method___toString","()","",2],["TimeCode::fromString","FFMpeg\\Coordinate\\TimeCode","FFMpeg\/Coordinate\/TimeCode.html#method_fromString","(string $timecode)","Creates timecode from string.",2],["TimeCode::fromSeconds","FFMpeg\\Coordinate\\TimeCode","FFMpeg\/Coordinate\/TimeCode.html#method_fromSeconds","(float $quantity)","Creates timecode from number of seconds.",2],["FFMpegDriver::getName","FFMpeg\\Driver\\FFMpegDriver","FFMpeg\/Driver\/FFMpegDriver.html#method_getName","()","{@inheritdoc}",2],["FFMpegDriver::create","FFMpeg\\Driver\\FFMpegDriver","FFMpeg\/Driver\/FFMpegDriver.html#method_create","(LoggerInterface<\/abbr> $logger = null, array|Configuration<\/abbr> $configuration = array())","Creates an FFMpegDriver.",2],["FFProbeDriver::getName","FFMpeg\\Driver\\FFProbeDriver","FFMpeg\/Driver\/FFProbeDriver.html#method_getName","()","{@inheritdoc}",2],["FFProbeDriver::create","FFMpeg\\Driver\\FFProbeDriver","FFMpeg\/Driver\/FFProbeDriver.html#method_create","(array|ConfigurationInterface<\/abbr> $configuration, LoggerInterface<\/abbr> $logger = null)","Creates an FFProbeDriver.",2],["FFMpeg::__construct","FFMpeg\\FFMpeg","FFMpeg\/FFMpeg.html#method___construct","(FFMpegDriver<\/abbr><\/a> $ffmpeg, FFProbe<\/abbr><\/a> $ffprobe)","",2],["FFMpeg::setFFProbe","FFMpeg\\FFMpeg","FFMpeg\/FFMpeg.html#method_setFFProbe","(FFProbe<\/abbr><\/a> $ffprobe)","Sets FFProbe.",2],["FFMpeg::getFFProbe","FFMpeg\\FFMpeg","FFMpeg\/FFMpeg.html#method_getFFProbe","()","Gets FFProbe.",2],["FFMpeg::setFFMpegDriver","FFMpeg\\FFMpeg","FFMpeg\/FFMpeg.html#method_setFFMpegDriver","(FFMpegDriver<\/abbr><\/a> $ffmpeg)","Sets the ffmpeg driver.",2],["FFMpeg::getFFMpegDriver","FFMpeg\\FFMpeg","FFMpeg\/FFMpeg.html#method_getFFMpegDriver","()","Gets the ffmpeg driver.",2],["FFMpeg::open","FFMpeg\\FFMpeg","FFMpeg\/FFMpeg.html#method_open","(string $pathfile)","Opens a file in order to be processed.",2],["FFMpeg::create","FFMpeg\\FFMpeg","FFMpeg\/FFMpeg.html#method_create","(array|ConfigurationInterface<\/abbr> $configuration = array(), LoggerInterface<\/abbr> $logger = null, FFProbe<\/abbr><\/a> $probe = null)","Creates a new FFMpeg instance.",2],["FFMpegServiceProvider::register","FFMpeg\\FFMpegServiceProvider","FFMpeg\/FFMpegServiceProvider.html#method_register","(Application<\/abbr> $app)","",2],["FFMpegServiceProvider::boot","FFMpeg\\FFMpegServiceProvider","FFMpeg\/FFMpegServiceProvider.html#method_boot","(Application<\/abbr> $app)","",2],["FFProbe::__construct","FFMpeg\\FFProbe","FFMpeg\/FFProbe.html#method___construct","(FFProbeDriver<\/abbr><\/a> $ffprobe, Cache<\/abbr> $cache)","",2],["FFProbe::getParser","FFMpeg\\FFProbe","FFMpeg\/FFProbe.html#method_getParser","()","",2],["FFProbe::setParser","FFMpeg\\FFProbe","FFMpeg\/FFProbe.html#method_setParser","(OutputParserInterface<\/abbr><\/a> $parser)","",2],["FFProbe::getFFProbeDriver","FFMpeg\\FFProbe","FFMpeg\/FFProbe.html#method_getFFProbeDriver","()","",2],["FFProbe::setFFProbeDriver","FFMpeg\\FFProbe","FFMpeg\/FFProbe.html#method_setFFProbeDriver","(FFProbeDriver<\/abbr><\/a> $ffprobe)","",2],["FFProbe::setOptionsTester","FFMpeg\\FFProbe","FFMpeg\/FFProbe.html#method_setOptionsTester","(OptionsTesterInterface<\/abbr><\/a> $tester)","",2],["FFProbe::getOptionsTester","FFMpeg\\FFProbe","FFMpeg\/FFProbe.html#method_getOptionsTester","()","",2],["FFProbe::setCache","FFMpeg\\FFProbe","FFMpeg\/FFProbe.html#method_setCache","(Cache<\/abbr> $cache)","",2],["FFProbe::getCache","FFMpeg\\FFProbe","FFMpeg\/FFProbe.html#method_getCache","()","",2],["FFProbe::getMapper","FFMpeg\\FFProbe","FFMpeg\/FFProbe.html#method_getMapper","()","",2],["FFProbe::setMapper","FFMpeg\\FFProbe","FFMpeg\/FFProbe.html#method_setMapper","(MapperInterface<\/abbr><\/a> $mapper)","",2],["FFProbe::format","FFMpeg\\FFProbe","FFMpeg\/FFProbe.html#method_format","(string $pathfile)","",2],["FFProbe::streams","FFMpeg\\FFProbe","FFMpeg\/FFProbe.html#method_streams","(string $pathfile)","",2],["FFProbe::create","FFMpeg\\FFProbe","FFMpeg\/FFProbe.html#method_create","(array|ConfigurationInterface<\/abbr> $configuration = array(), LoggerInterface<\/abbr> $logger = null, Cache<\/abbr> $cache = null)","",2],["AbstractData::__construct","FFMpeg\\FFProbe\\DataMapping\\AbstractData","FFMpeg\/FFProbe\/DataMapping\/AbstractData.html#method___construct","(array $properties)","",2],["AbstractData::has","FFMpeg\\FFProbe\\DataMapping\\AbstractData","FFMpeg\/FFProbe\/DataMapping\/AbstractData.html#method_has","(string $property)","Returns true if data has property.",2],["AbstractData::get","FFMpeg\\FFProbe\\DataMapping\\AbstractData","FFMpeg\/FFProbe\/DataMapping\/AbstractData.html#method_get","(string $property)","Returns the property value given its name.",2],["AbstractData::set","FFMpeg\\FFProbe\\DataMapping\\AbstractData","FFMpeg\/FFProbe\/DataMapping\/AbstractData.html#method_set","(string $property, mixed $value)","Sets the property value given its name.",2],["AbstractData::keys","FFMpeg\\FFProbe\\DataMapping\\AbstractData","FFMpeg\/FFProbe\/DataMapping\/AbstractData.html#method_keys","()","Returns all property names.",2],["AbstractData::all","FFMpeg\\FFProbe\\DataMapping\\AbstractData","FFMpeg\/FFProbe\/DataMapping\/AbstractData.html#method_all","()","Returns all properties and their values.",2],["AbstractData::count","FFMpeg\\FFProbe\\DataMapping\\AbstractData","FFMpeg\/FFProbe\/DataMapping\/AbstractData.html#method_count","()","{@inheritdoc}",2],["Stream::isAudio","FFMpeg\\FFProbe\\DataMapping\\Stream","FFMpeg\/FFProbe\/DataMapping\/Stream.html#method_isAudio","()","Returns true if the stream is an audio stream.",2],["Stream::isVideo","FFMpeg\\FFProbe\\DataMapping\\Stream","FFMpeg\/FFProbe\/DataMapping\/Stream.html#method_isVideo","()","Returns true if the stream is a video stream.",2],["Stream::getDimensions","FFMpeg\\FFProbe\\DataMapping\\Stream","FFMpeg\/FFProbe\/DataMapping\/Stream.html#method_getDimensions","()","Returns the dimension of the video stream.",2],["StreamCollection::__construct","FFMpeg\\FFProbe\\DataMapping\\StreamCollection","FFMpeg\/FFProbe\/DataMapping\/StreamCollection.html#method___construct","(array $streams = array())","",2],["StreamCollection::first","FFMpeg\\FFProbe\\DataMapping\\StreamCollection","FFMpeg\/FFProbe\/DataMapping\/StreamCollection.html#method_first","()","Returns the first stream of the collection, null if",2],["StreamCollection::add","FFMpeg\\FFProbe\\DataMapping\\StreamCollection","FFMpeg\/FFProbe\/DataMapping\/StreamCollection.html#method_add","(Stream<\/abbr><\/a> $stream)","Adds a stream to the collection.",2],["StreamCollection::videos","FFMpeg\\FFProbe\\DataMapping\\StreamCollection","FFMpeg\/FFProbe\/DataMapping\/StreamCollection.html#method_videos","()","Returns a new StreamCollection with only video streams.",2],["StreamCollection::audios","FFMpeg\\FFProbe\\DataMapping\\StreamCollection","FFMpeg\/FFProbe\/DataMapping\/StreamCollection.html#method_audios","()","Returns a new StreamCollection with only audio streams.",2],["StreamCollection::count","FFMpeg\\FFProbe\\DataMapping\\StreamCollection","FFMpeg\/FFProbe\/DataMapping\/StreamCollection.html#method_count","()","{@inheritdoc}",2],["StreamCollection::all","FFMpeg\\FFProbe\\DataMapping\\StreamCollection","FFMpeg\/FFProbe\/DataMapping\/StreamCollection.html#method_all","()","Returns the array of contained streams.",2],["StreamCollection::getIterator","FFMpeg\\FFProbe\\DataMapping\\StreamCollection","FFMpeg\/FFProbe\/DataMapping\/StreamCollection.html#method_getIterator","()","{@inheritdoc}",2],["Mapper::map","FFMpeg\\FFProbe\\Mapper","FFMpeg\/FFProbe\/Mapper.html#method_map","(string $type, string $data)","Maps data given its type.",2],["MapperInterface::map","FFMpeg\\FFProbe\\MapperInterface","FFMpeg\/FFProbe\/MapperInterface.html#method_map","(string $type, string $data)","Maps data given its type.",2],["OptionsTester::__construct","FFMpeg\\FFProbe\\OptionsTester","FFMpeg\/FFProbe\/OptionsTester.html#method___construct","(FFProbeDriver<\/abbr><\/a> $ffprobe, Cache<\/abbr> $cache)","",2],["OptionsTester::has","FFMpeg\\FFProbe\\OptionsTester","FFMpeg\/FFProbe\/OptionsTester.html#method_has","(string $name)","Tells if the given option is supported by ffprobe.",2],["OptionsTesterInterface::has","FFMpeg\\FFProbe\\OptionsTesterInterface","FFMpeg\/FFProbe\/OptionsTesterInterface.html#method_has","(string $name)","Tells if the given option is supported by ffprobe.",2],["OutputParser::parse","FFMpeg\\FFProbe\\OutputParser","FFMpeg\/FFProbe\/OutputParser.html#method_parse","(string $type, string $data)","Parses ffprobe raw output.",2],["OutputParserInterface::parse","FFMpeg\\FFProbe\\OutputParserInterface","FFMpeg\/FFProbe\/OutputParserInterface.html#method_parse","(string $type, string $data)","Parses ffprobe raw output.",2],["AudioFilterInterface::apply","FFMpeg\\Filters\\Audio\\AudioFilterInterface","FFMpeg\/Filters\/Audio\/AudioFilterInterface.html#method_apply","(Audio<\/abbr><\/a> $audio, AudioInterface<\/abbr><\/a> $format)","Applies the filter on the the Audio media given an",2],["AudioFilters::__construct","FFMpeg\\Filters\\Audio\\AudioFilters","FFMpeg\/Filters\/Audio\/AudioFilters.html#method___construct","(Audio<\/abbr><\/a> $media)","",2],["AudioFilters::resample","FFMpeg\\Filters\\Audio\\AudioFilters","FFMpeg\/Filters\/Audio\/AudioFilters.html#method_resample","(Integer $rate)","Resamples the audio file.",2],["AudioResamplableFilter::__construct","FFMpeg\\Filters\\Audio\\AudioResamplableFilter","FFMpeg\/Filters\/Audio\/AudioResamplableFilter.html#method___construct","($rate, $priority)","",2],["AudioResamplableFilter::getPriority","FFMpeg\\Filters\\Audio\\AudioResamplableFilter","FFMpeg\/Filters\/Audio\/AudioResamplableFilter.html#method_getPriority","()","Returns the priority of the filter.",2],["AudioResamplableFilter::getRate","FFMpeg\\Filters\\Audio\\AudioResamplableFilter","FFMpeg\/Filters\/Audio\/AudioResamplableFilter.html#method_getRate","()","",2],["AudioResamplableFilter::apply","FFMpeg\\Filters\\Audio\\AudioResamplableFilter","FFMpeg\/Filters\/Audio\/AudioResamplableFilter.html#method_apply","(Audio<\/abbr><\/a> $audio, AudioInterface<\/abbr><\/a> $format)","Applies the filter on the the Audio media given an",2],["SimpleFilter::__construct","FFMpeg\\Filters\\Audio\\SimpleFilter","FFMpeg\/Filters\/Audio\/SimpleFilter.html#method___construct","(array $params, $priority)","",2],["SimpleFilter::getPriority","FFMpeg\\Filters\\Audio\\SimpleFilter","FFMpeg\/Filters\/Audio\/SimpleFilter.html#method_getPriority","()","Returns the priority of the filter.",2],["SimpleFilter::apply","FFMpeg\\Filters\\Audio\\SimpleFilter","FFMpeg\/Filters\/Audio\/SimpleFilter.html#method_apply","(Audio<\/abbr><\/a> $audio, AudioInterface<\/abbr><\/a> $format)","Applies the filter on the the Audio media given an",2],["FilterInterface::getPriority","FFMpeg\\Filters\\FilterInterface","FFMpeg\/Filters\/FilterInterface.html#method_getPriority","()","Returns the priority of the filter.",2],["FiltersCollection::add","FFMpeg\\Filters\\FiltersCollection","FFMpeg\/Filters\/FiltersCollection.html#method_add","(FilterInterface<\/abbr><\/a> $filter)","",2],["FiltersCollection::count","FFMpeg\\Filters\\FiltersCollection","FFMpeg\/Filters\/FiltersCollection.html#method_count","()","{@inheritdoc}",2],["FiltersCollection::getIterator","FFMpeg\\Filters\\FiltersCollection","FFMpeg\/Filters\/FiltersCollection.html#method_getIterator","()","{@inheritdoc}",2],["DisplayRatioFixerFilter::__construct","FFMpeg\\Filters\\Frame\\DisplayRatioFixerFilter","FFMpeg\/Filters\/Frame\/DisplayRatioFixerFilter.html#method___construct","($priority)","",2],["DisplayRatioFixerFilter::getPriority","FFMpeg\\Filters\\Frame\\DisplayRatioFixerFilter","FFMpeg\/Filters\/Frame\/DisplayRatioFixerFilter.html#method_getPriority","()","Returns the priority of the filter.",2],["DisplayRatioFixerFilter::apply","FFMpeg\\Filters\\Frame\\DisplayRatioFixerFilter","FFMpeg\/Filters\/Frame\/DisplayRatioFixerFilter.html#method_apply","(Frame<\/abbr><\/a> $frame)","",2],["FrameFilterInterface::apply","FFMpeg\\Filters\\Frame\\FrameFilterInterface","FFMpeg\/Filters\/Frame\/FrameFilterInterface.html#method_apply","(Frame<\/abbr><\/a> $frame)","",2],["FrameFilters::__construct","FFMpeg\\Filters\\Frame\\FrameFilters","FFMpeg\/Filters\/Frame\/FrameFilters.html#method___construct","(Frame<\/abbr><\/a> $frame)","",2],["FrameFilters::fixDisplayRatio","FFMpeg\\Filters\\Frame\\FrameFilters","FFMpeg\/Filters\/Frame\/FrameFilters.html#method_fixDisplayRatio","()","Fixes the display ratio of the output frame.",2],["ClipFilter::__construct","FFMpeg\\Filters\\Video\\ClipFilter","FFMpeg\/Filters\/Video\/ClipFilter.html#method___construct","(TimeCode<\/abbr><\/a> $start, TimeCode<\/abbr><\/a> $duration = null, $priority)","",2],["ClipFilter::getPriority","FFMpeg\\Filters\\Video\\ClipFilter","FFMpeg\/Filters\/Video\/ClipFilter.html#method_getPriority","()","Returns the priority of the filter.",2],["ClipFilter::getStart","FFMpeg\\Filters\\Video\\ClipFilter","FFMpeg\/Filters\/Video\/ClipFilter.html#method_getStart","()","",2],["ClipFilter::getDuration","FFMpeg\\Filters\\Video\\ClipFilter","FFMpeg\/Filters\/Video\/ClipFilter.html#method_getDuration","()","",2],["ClipFilter::apply","FFMpeg\\Filters\\Video\\ClipFilter","FFMpeg\/Filters\/Video\/ClipFilter.html#method_apply","(Video<\/abbr><\/a> $video, VideoInterface<\/abbr><\/a> $format)","Applies the filter on the the Video media given an",2],["CustomFilter::__construct","FFMpeg\\Filters\\Video\\CustomFilter","FFMpeg\/Filters\/Video\/CustomFilter.html#method___construct","(string $filter, int $priority)","A custom filter, useful if you want to build complex",2],["CustomFilter::getPriority","FFMpeg\\Filters\\Video\\CustomFilter","FFMpeg\/Filters\/Video\/CustomFilter.html#method_getPriority","()","Returns the priority of the filter.",2],["CustomFilter::apply","FFMpeg\\Filters\\Video\\CustomFilter","FFMpeg\/Filters\/Video\/CustomFilter.html#method_apply","(Video<\/abbr><\/a> $video, VideoInterface<\/abbr><\/a> $format)","Applies the filter on the the Video media given an",2],["FrameRateFilter::__construct","FFMpeg\\Filters\\Video\\FrameRateFilter","FFMpeg\/Filters\/Video\/FrameRateFilter.html#method___construct","(FrameRate<\/abbr><\/a> $rate, $gop, $priority)","",2],["FrameRateFilter::getPriority","FFMpeg\\Filters\\Video\\FrameRateFilter","FFMpeg\/Filters\/Video\/FrameRateFilter.html#method_getPriority","()","Returns the priority of the filter.",2],["FrameRateFilter::getFrameRate","FFMpeg\\Filters\\Video\\FrameRateFilter","FFMpeg\/Filters\/Video\/FrameRateFilter.html#method_getFrameRate","()","Returns the frame rate.",2],["FrameRateFilter::getGOP","FFMpeg\\Filters\\Video\\FrameRateFilter","FFMpeg\/Filters\/Video\/FrameRateFilter.html#method_getGOP","()","Returns the GOP size.",2],["FrameRateFilter::apply","FFMpeg\\Filters\\Video\\FrameRateFilter","FFMpeg\/Filters\/Video\/FrameRateFilter.html#method_apply","(Video<\/abbr><\/a> $video, VideoInterface<\/abbr><\/a> $format)","Applies the filter on the the Video media given an",2],["ResizeFilter::__construct","FFMpeg\\Filters\\Video\\ResizeFilter","FFMpeg\/Filters\/Video\/ResizeFilter.html#method___construct","(Dimension<\/abbr><\/a> $dimension, $mode = self::RESIZEMODE_FIT, $forceStandards = true, $priority)","",2],["ResizeFilter::getPriority","FFMpeg\\Filters\\Video\\ResizeFilter","FFMpeg\/Filters\/Video\/ResizeFilter.html#method_getPriority","()","Returns the priority of the filter.",2],["ResizeFilter::getDimension","FFMpeg\\Filters\\Video\\ResizeFilter","FFMpeg\/Filters\/Video\/ResizeFilter.html#method_getDimension","()","",2],["ResizeFilter::getMode","FFMpeg\\Filters\\Video\\ResizeFilter","FFMpeg\/Filters\/Video\/ResizeFilter.html#method_getMode","()","",2],["ResizeFilter::areStandardsForced","FFMpeg\\Filters\\Video\\ResizeFilter","FFMpeg\/Filters\/Video\/ResizeFilter.html#method_areStandardsForced","()","",2],["ResizeFilter::apply","FFMpeg\\Filters\\Video\\ResizeFilter","FFMpeg\/Filters\/Video\/ResizeFilter.html#method_apply","(Video<\/abbr><\/a> $video, VideoInterface<\/abbr><\/a> $format)","Applies the filter on the the Video media given an",2],["RotateFilter::__construct","FFMpeg\\Filters\\Video\\RotateFilter","FFMpeg\/Filters\/Video\/RotateFilter.html#method___construct","($angle, $priority)","",2],["RotateFilter::getPriority","FFMpeg\\Filters\\Video\\RotateFilter","FFMpeg\/Filters\/Video\/RotateFilter.html#method_getPriority","()","Returns the priority of the filter.",2],["RotateFilter::getAngle","FFMpeg\\Filters\\Video\\RotateFilter","FFMpeg\/Filters\/Video\/RotateFilter.html#method_getAngle","()","",2],["RotateFilter::apply","FFMpeg\\Filters\\Video\\RotateFilter","FFMpeg\/Filters\/Video\/RotateFilter.html#method_apply","(Video<\/abbr><\/a> $video, VideoInterface<\/abbr><\/a> $format)","Applies the filter on the the Video media given an",2],["SynchronizeFilter::__construct","FFMpeg\\Filters\\Video\\SynchronizeFilter","FFMpeg\/Filters\/Video\/SynchronizeFilter.html#method___construct","($priority = 12)","",2],["SynchronizeFilter::getPriority","FFMpeg\\Filters\\Video\\SynchronizeFilter","FFMpeg\/Filters\/Video\/SynchronizeFilter.html#method_getPriority","()","Returns the priority of the filter.",2],["SynchronizeFilter::apply","FFMpeg\\Filters\\Video\\SynchronizeFilter","FFMpeg\/Filters\/Video\/SynchronizeFilter.html#method_apply","(Video<\/abbr><\/a> $video, VideoInterface<\/abbr><\/a> $format)","Applies the filter on the the Video media given an",2],["VideoFilterInterface::apply","FFMpeg\\Filters\\Video\\VideoFilterInterface","FFMpeg\/Filters\/Video\/VideoFilterInterface.html#method_apply","(Video<\/abbr><\/a> $video, VideoInterface<\/abbr><\/a> $format)","Applies the filter on the the Video media given an",2],["VideoFilters::__construct","FFMpeg\\Filters\\Video\\VideoFilters","FFMpeg\/Filters\/Video\/VideoFilters.html#method___construct","(Video<\/abbr><\/a> $media)","",2],["VideoFilters::resize","FFMpeg\\Filters\\Video\\VideoFilters","FFMpeg\/Filters\/Video\/VideoFilters.html#method_resize","(Dimension<\/abbr><\/a> $dimension, string $mode = ResizeFilter::RESIZEMODE_FIT, Boolean $forceStandards = true)","Resizes a video to a given dimension.",2],["VideoFilters::framerate","FFMpeg\\Filters\\Video\\VideoFilters","FFMpeg\/Filters\/Video\/VideoFilters.html#method_framerate","(FrameRate<\/abbr><\/a> $framerate, type<\/abbr> $gop)","Changes the video framerate.",2],["VideoFilters::synchronize","FFMpeg\\Filters\\Video\\VideoFilters","FFMpeg\/Filters\/Video\/VideoFilters.html#method_synchronize","()","Synchronizes audio and video.",2],["VideoFilters::clip","FFMpeg\\Filters\\Video\\VideoFilters","FFMpeg\/Filters\/Video\/VideoFilters.html#method_clip","(TimeCode<\/abbr><\/a> $start, TimeCode<\/abbr><\/a> $duration = null)","Clips (cuts) the video.",2],["VideoFilters::audioResample","FFMpeg\\Filters\\Video\\VideoFilters","FFMpeg\/Filters\/Video\/VideoFilters.html#method_audioResample","(Integer $rate)","Resamples the audio file.",2],["VideoFilters::rotate","FFMpeg\\Filters\\Video\\VideoFilters","FFMpeg\/Filters\/Video\/VideoFilters.html#method_rotate","($angle)","",2],["VideoFilters::watermark","FFMpeg\\Filters\\Video\\VideoFilters","FFMpeg\/Filters\/Video\/VideoFilters.html#method_watermark","(string $imagePath, array $coordinates = array())","",2],["WatermarkFilter::__construct","FFMpeg\\Filters\\Video\\WatermarkFilter","FFMpeg\/Filters\/Video\/WatermarkFilter.html#method___construct","($watermarkPath, array $coordinates = array(), $priority)","",2],["WatermarkFilter::getPriority","FFMpeg\\Filters\\Video\\WatermarkFilter","FFMpeg\/Filters\/Video\/WatermarkFilter.html#method_getPriority","()","Returns the priority of the filter.",2],["WatermarkFilter::apply","FFMpeg\\Filters\\Video\\WatermarkFilter","FFMpeg\/Filters\/Video\/WatermarkFilter.html#method_apply","(Video<\/abbr><\/a> $video, VideoInterface<\/abbr><\/a> $format)","Applies the filter on the the Video media given an",2],["AudioInterface::getAudioKiloBitrate","FFMpeg\\Format\\AudioInterface","FFMpeg\/Format\/AudioInterface.html#method_getAudioKiloBitrate","()","Gets the audio kiloBitrate value.",2],["AudioInterface::getAudioChannels","FFMpeg\\Format\\AudioInterface","FFMpeg\/Format\/AudioInterface.html#method_getAudioChannels","()","Gets the audio channels value.",2],["AudioInterface::getAudioCodec","FFMpeg\\Format\\AudioInterface","FFMpeg\/Format\/AudioInterface.html#method_getAudioCodec","()","Returns the audio codec.",2],["AudioInterface::getAvailableAudioCodecs","FFMpeg\\Format\\AudioInterface","FFMpeg\/Format\/AudioInterface.html#method_getAvailableAudioCodecs","()","Returns the list of available audio codecs for this",2],["Aac::__construct","FFMpeg\\Format\\Audio\\Aac","FFMpeg\/Format\/Audio\/Aac.html#method___construct","()","",2],["Aac::getAvailableAudioCodecs","FFMpeg\\Format\\Audio\\Aac","FFMpeg\/Format\/Audio\/Aac.html#method_getAvailableAudioCodecs","()","Returns the list of available audio codecs for this",2],["DefaultAudio::getExtraParams","FFMpeg\\Format\\Audio\\DefaultAudio","FFMpeg\/Format\/Audio\/DefaultAudio.html#method_getExtraParams","()","Returns an array of extra parameters to add to ffmpeg",2],["DefaultAudio::getAudioCodec","FFMpeg\\Format\\Audio\\DefaultAudio","FFMpeg\/Format\/Audio\/DefaultAudio.html#method_getAudioCodec","()","Returns the audio codec.",2],["DefaultAudio::setAudioCodec","FFMpeg\\Format\\Audio\\DefaultAudio","FFMpeg\/Format\/Audio\/DefaultAudio.html#method_setAudioCodec","(string $audioCodec)","Sets the audio codec, Should be in the available ones,",2],["DefaultAudio::getAudioKiloBitrate","FFMpeg\\Format\\Audio\\DefaultAudio","FFMpeg\/Format\/Audio\/DefaultAudio.html#method_getAudioKiloBitrate","()","Gets the audio kiloBitrate value.",2],["DefaultAudio::setAudioKiloBitrate","FFMpeg\\Format\\Audio\\DefaultAudio","FFMpeg\/Format\/Audio\/DefaultAudio.html#method_setAudioKiloBitrate","(integer $kiloBitrate)","Sets the kiloBitrate value.",2],["DefaultAudio::getAudioChannels","FFMpeg\\Format\\Audio\\DefaultAudio","FFMpeg\/Format\/Audio\/DefaultAudio.html#method_getAudioChannels","()","Gets the audio channels value.",2],["DefaultAudio::setAudioChannels","FFMpeg\\Format\\Audio\\DefaultAudio","FFMpeg\/Format\/Audio\/DefaultAudio.html#method_setAudioChannels","(integer $channels)","Sets the channels value.",2],["DefaultAudio::createProgressListener","FFMpeg\\Format\\Audio\\DefaultAudio","FFMpeg\/Format\/Audio\/DefaultAudio.html#method_createProgressListener","(MediaTypeInterface<\/abbr><\/a> $media, FFProbe<\/abbr><\/a> $ffprobe, Integer $pass, Integer $total)","Creates the progress listener.",2],["DefaultAudio::getPasses","FFMpeg\\Format\\Audio\\DefaultAudio","FFMpeg\/Format\/Audio\/DefaultAudio.html#method_getPasses","()","Returns the number of passes.",2],["Flac::__construct","FFMpeg\\Format\\Audio\\Flac","FFMpeg\/Format\/Audio\/Flac.html#method___construct","()","",2],["Flac::getAvailableAudioCodecs","FFMpeg\\Format\\Audio\\Flac","FFMpeg\/Format\/Audio\/Flac.html#method_getAvailableAudioCodecs","()","Returns the list of available audio codecs for this",2],["Mp3::__construct","FFMpeg\\Format\\Audio\\Mp3","FFMpeg\/Format\/Audio\/Mp3.html#method___construct","()","",2],["Mp3::getAvailableAudioCodecs","FFMpeg\\Format\\Audio\\Mp3","FFMpeg\/Format\/Audio\/Mp3.html#method_getAvailableAudioCodecs","()","Returns the list of available audio codecs for this",2],["Vorbis::__construct","FFMpeg\\Format\\Audio\\Vorbis","FFMpeg\/Format\/Audio\/Vorbis.html#method___construct","()","",2],["Vorbis::getExtraParams","FFMpeg\\Format\\Audio\\Vorbis","FFMpeg\/Format\/Audio\/Vorbis.html#method_getExtraParams","()","Returns an array of extra parameters to add to ffmpeg",2],["Vorbis::getAvailableAudioCodecs","FFMpeg\\Format\\Audio\\Vorbis","FFMpeg\/Format\/Audio\/Vorbis.html#method_getAvailableAudioCodecs","()","Returns the list of available audio codecs for this",2],["Wav::__construct","FFMpeg\\Format\\Audio\\Wav","FFMpeg\/Format\/Audio\/Wav.html#method___construct","()","",2],["Wav::getAvailableAudioCodecs","FFMpeg\\Format\\Audio\\Wav","FFMpeg\/Format\/Audio\/Wav.html#method_getAvailableAudioCodecs","()","Returns the list of available audio codecs for this",2],["FormatInterface::getPasses","FFMpeg\\Format\\FormatInterface","FFMpeg\/Format\/FormatInterface.html#method_getPasses","()","Returns the number of passes.",2],["FormatInterface::getExtraParams","FFMpeg\\Format\\FormatInterface","FFMpeg\/Format\/FormatInterface.html#method_getExtraParams","()","Returns an array of extra parameters to add to ffmpeg",2],["AbstractProgressListener::__construct","FFMpeg\\Format\\ProgressListener\\AbstractProgressListener","FFMpeg\/Format\/ProgressListener\/AbstractProgressListener.html#method___construct","(FFProbe<\/abbr><\/a> $ffprobe, string $pathfile, integer $currentPass, integer $totalPass)","",2],["AbstractProgressListener::getFFProbe","FFMpeg\\Format\\ProgressListener\\AbstractProgressListener","FFMpeg\/Format\/ProgressListener\/AbstractProgressListener.html#method_getFFProbe","()","",2],["AbstractProgressListener::getPathfile","FFMpeg\\Format\\ProgressListener\\AbstractProgressListener","FFMpeg\/Format\/ProgressListener\/AbstractProgressListener.html#method_getPathfile","()","",2],["AbstractProgressListener::getCurrentPass","FFMpeg\\Format\\ProgressListener\\AbstractProgressListener","FFMpeg\/Format\/ProgressListener\/AbstractProgressListener.html#method_getCurrentPass","()","",2],["AbstractProgressListener::getTotalPass","FFMpeg\\Format\\ProgressListener\\AbstractProgressListener","FFMpeg\/Format\/ProgressListener\/AbstractProgressListener.html#method_getTotalPass","()","",2],["AbstractProgressListener::handle","FFMpeg\\Format\\ProgressListener\\AbstractProgressListener","FFMpeg\/Format\/ProgressListener\/AbstractProgressListener.html#method_handle","($type, $data)","{@inheritdoc}",2],["AbstractProgressListener::forwardedEvents","FFMpeg\\Format\\ProgressListener\\AbstractProgressListener","FFMpeg\/Format\/ProgressListener\/AbstractProgressListener.html#method_forwardedEvents","()","{@inheritdoc}",2],["AudioProgressListener::getPattern","FFMpeg\\Format\\ProgressListener\\AudioProgressListener","FFMpeg\/Format\/ProgressListener\/AudioProgressListener.html#method_getPattern","()","",2],["VideoProgressListener::getPattern","FFMpeg\\Format\\ProgressListener\\VideoProgressListener","FFMpeg\/Format\/ProgressListener\/VideoProgressListener.html#method_getPattern","()","",2],["ProgressableInterface::createProgressListener","FFMpeg\\Format\\ProgressableInterface","FFMpeg\/Format\/ProgressableInterface.html#method_createProgressListener","(MediaTypeInterface<\/abbr><\/a> $media, FFProbe<\/abbr><\/a> $ffprobe, Integer $pass, Integer $total)","Creates the progress listener.",2],["VideoInterface::getKiloBitrate","FFMpeg\\Format\\VideoInterface","FFMpeg\/Format\/VideoInterface.html#method_getKiloBitrate","()","Gets the kiloBitrate value.",2],["VideoInterface::getModulus","FFMpeg\\Format\\VideoInterface","FFMpeg\/Format\/VideoInterface.html#method_getModulus","()","Returns the modulus used by the Resizable video.",2],["VideoInterface::getVideoCodec","FFMpeg\\Format\\VideoInterface","FFMpeg\/Format\/VideoInterface.html#method_getVideoCodec","()","Returns the video codec.",2],["VideoInterface::supportBFrames","FFMpeg\\Format\\VideoInterface","FFMpeg\/Format\/VideoInterface.html#method_supportBFrames","()","Returns true if the current format supports B-Frames.",2],["VideoInterface::getAvailableVideoCodecs","FFMpeg\\Format\\VideoInterface","FFMpeg\/Format\/VideoInterface.html#method_getAvailableVideoCodecs","()","Returns the list of available video codecs for this",2],["DefaultVideo::getKiloBitrate","FFMpeg\\Format\\Video\\DefaultVideo","FFMpeg\/Format\/Video\/DefaultVideo.html#method_getKiloBitrate","()","Gets the kiloBitrate value.",2],["DefaultVideo::setKiloBitrate","FFMpeg\\Format\\Video\\DefaultVideo","FFMpeg\/Format\/Video\/DefaultVideo.html#method_setKiloBitrate","(integer $kiloBitrate)","Sets the kiloBitrate value.",2],["DefaultVideo::getVideoCodec","FFMpeg\\Format\\Video\\DefaultVideo","FFMpeg\/Format\/Video\/DefaultVideo.html#method_getVideoCodec","()","Returns the video codec.",2],["DefaultVideo::setVideoCodec","FFMpeg\\Format\\Video\\DefaultVideo","FFMpeg\/Format\/Video\/DefaultVideo.html#method_setVideoCodec","(string $videoCodec)","Sets the video codec, Should be in the available ones,",2],["DefaultVideo::getModulus","FFMpeg\\Format\\Video\\DefaultVideo","FFMpeg\/Format\/Video\/DefaultVideo.html#method_getModulus","()","",2],["DefaultVideo::createProgressListener","FFMpeg\\Format\\Video\\DefaultVideo","FFMpeg\/Format\/Video\/DefaultVideo.html#method_createProgressListener","(MediaTypeInterface<\/abbr><\/a> $media, FFProbe<\/abbr><\/a> $ffprobe, Integer $pass, Integer $total)","Creates the progress listener.",2],["Ogg::__construct","FFMpeg\\Format\\Video\\Ogg","FFMpeg\/Format\/Video\/Ogg.html#method___construct","($audioCodec = 'libvorbis', $videoCodec = 'libtheora')","",2],["Ogg::supportBFrames","FFMpeg\\Format\\Video\\Ogg","FFMpeg\/Format\/Video\/Ogg.html#method_supportBFrames","()","Returns true if the current format supports B-Frames.",2],["Ogg::getAvailableAudioCodecs","FFMpeg\\Format\\Video\\Ogg","FFMpeg\/Format\/Video\/Ogg.html#method_getAvailableAudioCodecs","()","Returns the list of available audio codecs for this",2],["Ogg::getAvailableVideoCodecs","FFMpeg\\Format\\Video\\Ogg","FFMpeg\/Format\/Video\/Ogg.html#method_getAvailableVideoCodecs","()","Returns the list of available video codecs for this",2],["WMV::__construct","FFMpeg\\Format\\Video\\WMV","FFMpeg\/Format\/Video\/WMV.html#method___construct","($audioCodec = 'wmav2', $videoCodec = 'wmv2')","",2],["WMV::supportBFrames","FFMpeg\\Format\\Video\\WMV","FFMpeg\/Format\/Video\/WMV.html#method_supportBFrames","()","Returns true if the current format supports B-Frames.",2],["WMV::getAvailableAudioCodecs","FFMpeg\\Format\\Video\\WMV","FFMpeg\/Format\/Video\/WMV.html#method_getAvailableAudioCodecs","()","Returns the list of available audio codecs for this",2],["WMV::getAvailableVideoCodecs","FFMpeg\\Format\\Video\\WMV","FFMpeg\/Format\/Video\/WMV.html#method_getAvailableVideoCodecs","()","Returns the list of available video codecs for this",2],["WMV3::__construct","FFMpeg\\Format\\Video\\WMV3","FFMpeg\/Format\/Video\/WMV3.html#method___construct","($audioCodec = 'wmav3', $videoCodec = 'wmv3')","",2],["WMV3::supportBFrames","FFMpeg\\Format\\Video\\WMV3","FFMpeg\/Format\/Video\/WMV3.html#method_supportBFrames","()","Returns true if the current format supports B-Frames.",2],["WMV3::getAvailableAudioCodecs","FFMpeg\\Format\\Video\\WMV3","FFMpeg\/Format\/Video\/WMV3.html#method_getAvailableAudioCodecs","()","Returns the list of available audio codecs for this",2],["WMV3::getAvailableVideoCodecs","FFMpeg\\Format\\Video\\WMV3","FFMpeg\/Format\/Video\/WMV3.html#method_getAvailableVideoCodecs","()","Returns the list of available video codecs for this",2],["WebM::__construct","FFMpeg\\Format\\Video\\WebM","FFMpeg\/Format\/Video\/WebM.html#method___construct","($audioCodec = 'libvorbis', $videoCodec = 'libvpx')","",2],["WebM::supportBFrames","FFMpeg\\Format\\Video\\WebM","FFMpeg\/Format\/Video\/WebM.html#method_supportBFrames","()","Returns true if the current format supports B-Frames.",2],["WebM::getExtraParams","FFMpeg\\Format\\Video\\WebM","FFMpeg\/Format\/Video\/WebM.html#method_getExtraParams","()","Returns an array of extra parameters to add to ffmpeg",2],["WebM::getAvailableAudioCodecs","FFMpeg\\Format\\Video\\WebM","FFMpeg\/Format\/Video\/WebM.html#method_getAvailableAudioCodecs","()","Returns the list of available audio codecs for this",2],["WebM::getAvailableVideoCodecs","FFMpeg\\Format\\Video\\WebM","FFMpeg\/Format\/Video\/WebM.html#method_getAvailableVideoCodecs","()","Returns the list of available video codecs for this",2],["X264::__construct","FFMpeg\\Format\\Video\\X264","FFMpeg\/Format\/Video\/X264.html#method___construct","($audioCodec = 'libfaac', $videoCodec = 'libx264')","",2],["X264::supportBFrames","FFMpeg\\Format\\Video\\X264","FFMpeg\/Format\/Video\/X264.html#method_supportBFrames","()","Returns true if the current format supports B-Frames.",2],["X264::setBFramesSupport","FFMpeg\\Format\\Video\\X264","FFMpeg\/Format\/Video\/X264.html#method_setBFramesSupport","($support<\/abbr> $support)","",2],["X264::getAvailableAudioCodecs","FFMpeg\\Format\\Video\\X264","FFMpeg\/Format\/Video\/X264.html#method_getAvailableAudioCodecs","()","Returns the list of available audio codecs for this",2],["X264::getAvailableVideoCodecs","FFMpeg\\Format\\Video\\X264","FFMpeg\/Format\/Video\/X264.html#method_getAvailableVideoCodecs","()","Returns the list of available video codecs for this",2],["X264::getPasses","FFMpeg\\Format\\Video\\X264","FFMpeg\/Format\/Video\/X264.html#method_getPasses","()","Returns the number of passes.",2],["X264::getModulus","FFMpeg\\Format\\Video\\X264","FFMpeg\/Format\/Video\/X264.html#method_getModulus","()","",2],["AbstractMediaType::__construct","FFMpeg\\Media\\AbstractMediaType","FFMpeg\/Media\/AbstractMediaType.html#method___construct","($pathfile, FFMpegDriver<\/abbr><\/a> $driver, FFProbe<\/abbr><\/a> $ffprobe)","",2],["AbstractMediaType::getFFMpegDriver","FFMpeg\\Media\\AbstractMediaType","FFMpeg\/Media\/AbstractMediaType.html#method_getFFMpegDriver","()","",2],["AbstractMediaType::setFFMpegDriver","FFMpeg\\Media\\AbstractMediaType","FFMpeg\/Media\/AbstractMediaType.html#method_setFFMpegDriver","(FFMpegDriver<\/abbr><\/a> $driver)","",2],["AbstractMediaType::getFFProbe","FFMpeg\\Media\\AbstractMediaType","FFMpeg\/Media\/AbstractMediaType.html#method_getFFProbe","()","",2],["AbstractMediaType::setFFProbe","FFMpeg\\Media\\AbstractMediaType","FFMpeg\/Media\/AbstractMediaType.html#method_setFFProbe","(FFProbe<\/abbr><\/a> $ffprobe)","",2],["AbstractMediaType::getPathfile","FFMpeg\\Media\\AbstractMediaType","FFMpeg\/Media\/AbstractMediaType.html#method_getPathfile","()","",2],["AbstractMediaType::setFiltersCollection","FFMpeg\\Media\\AbstractMediaType","FFMpeg\/Media\/AbstractMediaType.html#method_setFiltersCollection","(FiltersCollection<\/abbr><\/a> $filters)","",2],["AbstractMediaType::getFiltersCollection","FFMpeg\\Media\\AbstractMediaType","FFMpeg\/Media\/AbstractMediaType.html#method_getFiltersCollection","()","",2],["AbstractStreamableMedia::getStreams","FFMpeg\\Media\\AbstractStreamableMedia","FFMpeg\/Media\/AbstractStreamableMedia.html#method_getStreams","()","",2],["AbstractStreamableMedia::getFormat","FFMpeg\\Media\\AbstractStreamableMedia","FFMpeg\/Media\/AbstractStreamableMedia.html#method_getFormat","()","",2],["Audio::filters","FFMpeg\\Media\\Audio","FFMpeg\/Media\/Audio.html#method_filters","()","Returns the available filters.",2],["Audio::addFilter","FFMpeg\\Media\\Audio","FFMpeg\/Media\/Audio.html#method_addFilter","(FilterInterface<\/abbr><\/a> $filter)","{@inheritdoc}",2],["Audio::save","FFMpeg\\Media\\Audio","FFMpeg\/Media\/Audio.html#method_save","(FormatInterface<\/abbr><\/a> $format, string $outputPathfile)","Exports the audio in the desired format, applies registered",2],["Frame::__construct","FFMpeg\\Media\\Frame","FFMpeg\/Media\/Frame.html#method___construct","(Video<\/abbr><\/a> $video, FFMpegDriver<\/abbr><\/a> $driver, FFProbe<\/abbr><\/a> $ffprobe, TimeCode<\/abbr><\/a> $timecode)","",2],["Frame::getVideo","FFMpeg\\Media\\Frame","FFMpeg\/Media\/Frame.html#method_getVideo","()","Returns the video related to the frame.",2],["Frame::filters","FFMpeg\\Media\\Frame","FFMpeg\/Media\/Frame.html#method_filters","()","Returns the available filters.",2],["Frame::addFilter","FFMpeg\\Media\\Frame","FFMpeg\/Media\/Frame.html#method_addFilter","(FrameFilterInterface<\/abbr><\/a> $filter)","{@inheritdoc}",2],["Frame::getTimeCode","FFMpeg\\Media\\Frame","FFMpeg\/Media\/Frame.html#method_getTimeCode","()","",2],["Frame::save","FFMpeg\\Media\\Frame","FFMpeg\/Media\/Frame.html#method_save","(string $pathfile, Boolean $accurate = false)","Saves the frame in the given filename.",2],["MediaTypeInterface::filters","FFMpeg\\Media\\MediaTypeInterface","FFMpeg\/Media\/MediaTypeInterface.html#method_filters","()","Returns the available filters.",2],["MediaTypeInterface::getPathfile","FFMpeg\\Media\\MediaTypeInterface","FFMpeg\/Media\/MediaTypeInterface.html#method_getPathfile","()","",2],["Video::filters","FFMpeg\\Media\\Video","FFMpeg\/Media\/Video.html#method_filters","()","Returns the available filters.",2],["Video::addFilter","FFMpeg\\Media\\Video","FFMpeg\/Media\/Video.html#method_addFilter","(FilterInterface<\/abbr><\/a> $filter)","{@inheritdoc}",2],["Video::save","FFMpeg\\Media\\Video","FFMpeg\/Media\/Video.html#method_save","(FormatInterface<\/abbr><\/a> $format, string $outputPathfile)","Exports the video in the desired format, applies registered",2],["Video::frame","FFMpeg\\Media\\Video","FFMpeg\/Media\/Video.html#method_frame","(TimeCode<\/abbr><\/a> $at)","Gets the frame at timecode.",2]] + } +} +search_data['index']['longSearchIndex'] = search_data['index']['searchIndex'] \ No newline at end of file diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/stylesheet.css b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/stylesheet.css new file mode 100644 index 0000000000..f57f65a807 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/stylesheet.css @@ -0,0 +1,212 @@ +/* +Copyright (c) 2010, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.com/yui/license.html +version: 2.8.1 +*/ +html{color:#000;background:#FFF;}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,button,textarea,p,blockquote,th,td{margin:0;padding:0;}table{border-collapse:collapse;border-spacing:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var,optgroup{font-style:inherit;font-weight:inherit;}del,ins{text-decoration:none;}caption,th{text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}q:before,q:after{content:'';}abbr,acronym{border:0;font-variant:normal;}sup{vertical-align:baseline;}sub{vertical-align:baseline;}legend{color:#000;}input,button,textarea,select,optgroup,option{font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;}input,button,textarea,select{*font-size:100%;}body{font:13px/1.231 arial,helvetica,clean,sans-serif;*font-size:small;*font:x-small;}select,input,button,textarea,button{font:99% arial,helvetica,clean,sans-serif;}table{font-size:inherit;font:100%;}pre,code,kbd,samp,tt{font-family:monospace;*font-size:108%;line-height:100%;}body{text-align:center;}#doc,#doc2,#doc3,#doc4,.yui-t1,.yui-t2,.yui-t3,.yui-t4,.yui-t5,.yui-t6,.yui-t7{margin:auto;text-align:left;width:57.69em;*width:56.25em;}#doc2{width:73.076em;*width:71.25em;}#doc3{margin:auto 10px;width:auto;}#doc4{width:74.923em;*width:73.05em;}.yui-b{position:relative;}.yui-b{_position:static;}#yui-main .yui-b{position:static;}#yui-main,.yui-g .yui-u .yui-g{width:100%;}.yui-t1 #yui-main,.yui-t2 #yui-main,.yui-t3 #yui-main{float:right;margin-left:-25em;}.yui-t4 #yui-main,.yui-t5 #yui-main,.yui-t6 #yui-main{float:left;margin-right:-25em;}.yui-t1 .yui-b{float:left;width:12.30769em;*width:12.00em;}.yui-t1 #yui-main .yui-b{margin-left:13.30769em;*margin-left:13.05em;}.yui-t2 .yui-b{float:left;width:13.8461em;*width:13.50em;}.yui-t2 #yui-main .yui-b{margin-left:14.8461em;*margin-left:14.55em;}.yui-t3 .yui-b{float:left;width:23.0769em;*width:22.50em;}.yui-t3 #yui-main .yui-b{margin-left:24.0769em;*margin-left:23.62em;}.yui-t4 .yui-b{float:right;width:13.8456em;*width:13.50em;}.yui-t4 #yui-main .yui-b{margin-right:14.8456em;*margin-right:14.55em;}.yui-t5 .yui-b{float:right;width:18.4615em;*width:18.00em;}.yui-t5 #yui-main .yui-b{margin-right:19.4615em;*margin-right:19.125em;}.yui-t6 .yui-b{float:right;width:23.0769em;*width:22.50em;}.yui-t6 #yui-main .yui-b{margin-right:24.0769em;*margin-right:23.62em;}.yui-t7 #yui-main .yui-b{display:block;margin:0 0 1em 0;}#yui-main .yui-b{float:none;width:auto;}.yui-gb .yui-u,.yui-g .yui-gb .yui-u,.yui-gb .yui-g,.yui-gb .yui-gb,.yui-gb .yui-gc,.yui-gb .yui-gd,.yui-gb .yui-ge,.yui-gb .yui-gf,.yui-gc .yui-u,.yui-gc .yui-g,.yui-gd .yui-u{float:left;}.yui-g .yui-u,.yui-g .yui-g,.yui-g .yui-gb,.yui-g .yui-gc,.yui-g .yui-gd,.yui-g .yui-ge,.yui-g .yui-gf,.yui-gc .yui-u,.yui-gd .yui-g,.yui-g .yui-gc .yui-u,.yui-ge .yui-u,.yui-ge .yui-g,.yui-gf .yui-g,.yui-gf .yui-u{float:right;}.yui-g div.first,.yui-gb div.first,.yui-gc div.first,.yui-gd div.first,.yui-ge div.first,.yui-gf div.first,.yui-g .yui-gc div.first,.yui-g .yui-ge div.first,.yui-gc div.first div.first{float:left;}.yui-g .yui-u,.yui-g .yui-g,.yui-g .yui-gb,.yui-g .yui-gc,.yui-g .yui-gd,.yui-g .yui-ge,.yui-g .yui-gf{width:49.1%;}.yui-gb .yui-u,.yui-g .yui-gb .yui-u,.yui-gb .yui-g,.yui-gb .yui-gb,.yui-gb .yui-gc,.yui-gb .yui-gd,.yui-gb .yui-ge,.yui-gb .yui-gf,.yui-gc .yui-u,.yui-gc .yui-g,.yui-gd .yui-u{width:32%;margin-left:1.99%;}.yui-gb .yui-u{*margin-left:1.9%;*width:31.9%;}.yui-gc div.first,.yui-gd .yui-u{width:66%;}.yui-gd div.first{width:32%;}.yui-ge div.first,.yui-gf .yui-u{width:74.2%;}.yui-ge .yui-u,.yui-gf div.first{width:24%;}.yui-g .yui-gb div.first,.yui-gb div.first,.yui-gc div.first,.yui-gd div.first{margin-left:0;}.yui-g .yui-g .yui-u,.yui-gb .yui-g .yui-u,.yui-gc .yui-g .yui-u,.yui-gd .yui-g .yui-u,.yui-ge .yui-g .yui-u,.yui-gf .yui-g .yui-u{width:49%;*width:48.1%;*margin-left:0;}.yui-g .yui-g .yui-u{width:48.1%;}.yui-g .yui-gb div.first,.yui-gb .yui-gb div.first{*margin-right:0;*width:32%;_width:31.7%;}.yui-g .yui-gc div.first,.yui-gd .yui-g{width:66%;}.yui-gb .yui-g div.first{*margin-right:4%;_margin-right:1.3%;}.yui-gb .yui-gc div.first,.yui-gb .yui-gd div.first{*margin-right:0;}.yui-gb .yui-gb .yui-u,.yui-gb .yui-gc .yui-u{*margin-left:1.8%;_margin-left:4%;}.yui-g .yui-gb .yui-u{_margin-left:1.0%;}.yui-gb .yui-gd .yui-u{*width:66%;_width:61.2%;}.yui-gb .yui-gd div.first{*width:31%;_width:29.5%;}.yui-g .yui-gc .yui-u,.yui-gb .yui-gc .yui-u{width:32%;_float:right;margin-right:0;_margin-left:0;}.yui-gb .yui-gc div.first{width:66%;*float:left;*margin-left:0;}.yui-gb .yui-ge .yui-u,.yui-gb .yui-gf .yui-u{margin:0;}.yui-gb .yui-gb .yui-u{_margin-left:.7%;}.yui-gb .yui-g div.first,.yui-gb .yui-gb div.first{*margin-left:0;}.yui-gc .yui-g .yui-u,.yui-gd .yui-g .yui-u{*width:48.1%;*margin-left:0;}.yui-gb .yui-gd div.first{width:32%;}.yui-g .yui-gd div.first{_width:29.9%;}.yui-ge .yui-g{width:24%;}.yui-gf .yui-g{width:74.2%;}.yui-gb .yui-ge div.yui-u,.yui-gb .yui-gf div.yui-u{float:right;}.yui-gb .yui-ge div.first,.yui-gb .yui-gf div.first{float:left;}.yui-gb .yui-ge .yui-u,.yui-gb .yui-gf div.first{*width:24%;_width:20%;}.yui-gb .yui-ge div.first,.yui-gb .yui-gf .yui-u{*width:73.5%;_width:65.5%;}.yui-ge div.first .yui-gd .yui-u{width:65%;}.yui-ge div.first .yui-gd div.first{width:32%;}#hd:after,#bd:after,#ft:after,.yui-g:after,.yui-gb:after,.yui-gc:after,.yui-gd:after,.yui-ge:after,.yui-gf:after{content:".";display:block;height:0;clear:both;visibility:hidden;}#hd,#bd,#ft,.yui-g,.yui-gb,.yui-gc,.yui-gd,.yui-ge,.yui-gf{zoom:1;} + +strong { + font-weight: bold; +} + +em { + font-style: italic; +} + +a { + text-decoration: none; +} + +a:hover { + text-decoration:underline; +} + +body { + text-align: left; + margin: 0; + padding: 0; + background-color: #fff; + color: #000; +} + +td.last { + width: 100%; +} + +table, th, td { + border-bottom: 1px solid #ccc; + vertical-align: top; +} + +table { + margin-bottom: 20px; +} + +td { + padding: 7px 4px; +} + +td p { + padding: 0; + margin: 0; +} + +p, dl, ul, ol, h1, h2, h3, h4, h5, h6 { + margin: 5px 0; +} + +dd { + margin-left: 20px; + margin-bottom: 7px; +} + +ul, ol { + margin-left: 30px; +} + +#title { + font-size: 140%; +} + +h1 { + font-size: 130%; +} + +h2 { + font-size: 120%; + font-weight: bold; + margin: 15px 0; + background-color: #EDF3FE; + padding: 5px; +} + +h3 { + font-size: 110%; +} + +h4 { + font-weight: bold; +} + +/* page header */ + +div.header { + background-color: #EDF3FE; + border-bottom: 1px solid #ccc; + padding: 20px 30px 10px 30px; +} + +#frame div.header { + background-color: #fff; + border: 0; + padding: 10px 15px 5px 15px; +} + +/* menu */ + +div.header ul { + list-style: none; + margin: 0; + float: right; + font-size: 80%; +} + +div.header ul li { + display: inline; + font-size: 100%; + font-weight: bold; + padding: 0 4px; +} + +div.header ul li a { + color: #000; + text-transform: uppercase; +} + +#frame div.header ul { + float: none; +} + +#frame div.header ul li { + padding: 0; + padding-right: 7px; +} + +/* footer */ + +#footer { + margin: 30px; + text-align: right; + font-size: 80%; +} + +/* frames */ + +#frame .content { + margin: 10px; +} + +#frame h1 { + font-size: 120%; +} + +#frame h2 { + font-size: 100%; +} + +#frame ul { + list-style: none; + margin-left: 0; +} + +/* class */ + +div.type { + color: #aaa; + margin: 10px 0 0; +} + +div.location { + font-size: 80%; + float: right; + font-style: italic; +} + +#class h1 { + margin: 0 0 10px; +} + +#class h3 { + font-size: 100%; + margin: 15px 0; +} + +#class h3 strong { + font-size: 120%; +} + +div.details { + padding: 0 0 10px 20px; + border-bottom: 1px solid #ccc; +} + +div.tags { + clear: both; + padding-top: 15px; + font-size: 90%; +} + +td.type { + text-align: right; +} + +#class .content, #overview .content { + padding: 10px 30px; +} + +.description { + margin: 10px 0; + padding: 10px; + background-color: #efefef; +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/traits.html b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/traits.html new file mode 100644 index 0000000000..9306c8f6d0 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/traits.html @@ -0,0 +1,32 @@ + + + + + + Traits | PHP-FFMpeg API + + + +
+ + +
PHP-FFMpeg API
+ +

Traits

+
+
+ +
+
+ + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/tree.js b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/tree.js new file mode 100644 index 0000000000..200a05527c --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/docs/source/API/API/tree.js @@ -0,0 +1,86 @@ +var tree = [["FFMpeg","FFMpeg.html","", + [["Coordinate","FFMpeg\/Coordinate.html","", + [["AspectRatio","FFMpeg\/Coordinate\/AspectRatio.html","", + [ ]],["Dimension","FFMpeg\/Coordinate\/Dimension.html","", + [ ]],["FrameRate","FFMpeg\/Coordinate\/FrameRate.html","", + [ ]],["Point","FFMpeg\/Coordinate\/Point.html","", + [ ]],["TimeCode","FFMpeg\/Coordinate\/TimeCode.html","", + [ ]] ]],["Driver","FFMpeg\/Driver.html","", + [["FFMpegDriver","FFMpeg\/Driver\/FFMpegDriver.html"," < AbstractBinary", + [ ]],["FFProbeDriver","FFMpeg\/Driver\/FFProbeDriver.html"," < AbstractBinary", + [ ]] ]],["Exception","FFMpeg\/Exception.html","", + [["ExceptionInterface","FFMpeg\/Exception\/ExceptionInterface.html","", + [ ]],["ExecutableNotFoundException","FFMpeg\/Exception\/ExecutableNotFoundException.html"," < RuntimeException", + [ ]],["InvalidArgumentException","FFMpeg\/Exception\/InvalidArgumentException.html"," < InvalidArgumentException", + [ ]],["LogicException","FFMpeg\/Exception\/LogicException.html"," < LogicException", + [ ]],["RuntimeException","FFMpeg\/Exception\/RuntimeException.html"," < RuntimeException", + [ ]] ]],["FFProbe","FFMpeg\/FFProbe.html","", + [["DataMapping","FFMpeg\/FFProbe\/DataMapping.html","", + [["AbstractData","FFMpeg\/FFProbe\/DataMapping\/AbstractData.html","", + [ ]],["Format","FFMpeg\/FFProbe\/DataMapping\/Format.html"," < AbstractData", + [ ]],["Stream","FFMpeg\/FFProbe\/DataMapping\/Stream.html"," < AbstractData", + [ ]],["StreamCollection","FFMpeg\/FFProbe\/DataMapping\/StreamCollection.html","", + [ ]] ]],["Mapper","FFMpeg\/FFProbe\/Mapper.html","", + [ ]],["MapperInterface","FFMpeg\/FFProbe\/MapperInterface.html","", + [ ]],["OptionsTester","FFMpeg\/FFProbe\/OptionsTester.html","", + [ ]],["OptionsTesterInterface","FFMpeg\/FFProbe\/OptionsTesterInterface.html","", + [ ]],["OutputParser","FFMpeg\/FFProbe\/OutputParser.html","", + [ ]],["OutputParserInterface","FFMpeg\/FFProbe\/OutputParserInterface.html","", + [ ]] ]],["Filters","FFMpeg\/Filters.html","", + [["Audio","FFMpeg\/Filters\/Audio.html","", + [["AudioFilterInterface","FFMpeg\/Filters\/Audio\/AudioFilterInterface.html","", + [ ]],["AudioFilters","FFMpeg\/Filters\/Audio\/AudioFilters.html","", + [ ]],["AudioResamplableFilter","FFMpeg\/Filters\/Audio\/AudioResamplableFilter.html","", + [ ]],["SimpleFilter","FFMpeg\/Filters\/Audio\/SimpleFilter.html","", + [ ]] ]],["Frame","FFMpeg\/Filters\/Frame.html","", + [["DisplayRatioFixerFilter","FFMpeg\/Filters\/Frame\/DisplayRatioFixerFilter.html","", + [ ]],["FrameFilterInterface","FFMpeg\/Filters\/Frame\/FrameFilterInterface.html","", + [ ]],["FrameFilters","FFMpeg\/Filters\/Frame\/FrameFilters.html","", + [ ]] ]],["Video","FFMpeg\/Filters\/Video.html","", + [["ClipFilter","FFMpeg\/Filters\/Video\/ClipFilter.html","", + [ ]],["CustomFilter","FFMpeg\/Filters\/Video\/CustomFilter.html","", + [ ]],["FrameRateFilter","FFMpeg\/Filters\/Video\/FrameRateFilter.html","", + [ ]],["ResizeFilter","FFMpeg\/Filters\/Video\/ResizeFilter.html","", + [ ]],["RotateFilter","FFMpeg\/Filters\/Video\/RotateFilter.html","", + [ ]],["SynchronizeFilter","FFMpeg\/Filters\/Video\/SynchronizeFilter.html","", + [ ]],["VideoFilterInterface","FFMpeg\/Filters\/Video\/VideoFilterInterface.html","", + [ ]],["VideoFilters","FFMpeg\/Filters\/Video\/VideoFilters.html"," < AudioFilters", + [ ]],["WatermarkFilter","FFMpeg\/Filters\/Video\/WatermarkFilter.html","", + [ ]] ]],["FilterInterface","FFMpeg\/Filters\/FilterInterface.html","", + [ ]],["FiltersCollection","FFMpeg\/Filters\/FiltersCollection.html","", + [ ]] ]],["Format","FFMpeg\/Format.html","", + [["Audio","FFMpeg\/Format\/Audio.html","", + [["Aac","FFMpeg\/Format\/Audio\/Aac.html"," < DefaultAudio", + [ ]],["DefaultAudio","FFMpeg\/Format\/Audio\/DefaultAudio.html"," < EventEmitter", + [ ]],["Flac","FFMpeg\/Format\/Audio\/Flac.html"," < DefaultAudio", + [ ]],["Mp3","FFMpeg\/Format\/Audio\/Mp3.html"," < DefaultAudio", + [ ]],["Vorbis","FFMpeg\/Format\/Audio\/Vorbis.html"," < DefaultAudio", + [ ]],["Wav","FFMpeg\/Format\/Audio\/Wav.html"," < DefaultAudio", + [ ]] ]],["ProgressListener","FFMpeg\/Format\/ProgressListener.html","", + [["AbstractProgressListener","FFMpeg\/Format\/ProgressListener\/AbstractProgressListener.html"," < EventEmitter", + [ ]],["AudioProgressListener","FFMpeg\/Format\/ProgressListener\/AudioProgressListener.html"," < AbstractProgressListener", + [ ]],["VideoProgressListener","FFMpeg\/Format\/ProgressListener\/VideoProgressListener.html"," < AbstractProgressListener", + [ ]] ]],["Video","FFMpeg\/Format\/Video.html","", + [["DefaultVideo","FFMpeg\/Format\/Video\/DefaultVideo.html"," < DefaultAudio", + [ ]],["Ogg","FFMpeg\/Format\/Video\/Ogg.html"," < DefaultVideo", + [ ]],["WMV","FFMpeg\/Format\/Video\/WMV.html"," < DefaultVideo", + [ ]],["WMV3","FFMpeg\/Format\/Video\/WMV3.html"," < DefaultVideo", + [ ]],["WebM","FFMpeg\/Format\/Video\/WebM.html"," < DefaultVideo", + [ ]],["X264","FFMpeg\/Format\/Video\/X264.html"," < DefaultVideo", + [ ]] ]],["AudioInterface","FFMpeg\/Format\/AudioInterface.html","", + [ ]],["FormatInterface","FFMpeg\/Format\/FormatInterface.html","", + [ ]],["FrameInterface","FFMpeg\/Format\/FrameInterface.html","", + [ ]],["ProgressableInterface","FFMpeg\/Format\/ProgressableInterface.html","", + [ ]],["VideoInterface","FFMpeg\/Format\/VideoInterface.html","", + [ ]] ]],["Media","FFMpeg\/Media.html","", + [["AbstractMediaType","FFMpeg\/Media\/AbstractMediaType.html","", + [ ]],["AbstractStreamableMedia","FFMpeg\/Media\/AbstractStreamableMedia.html"," < AbstractMediaType", + [ ]],["Audio","FFMpeg\/Media\/Audio.html"," < AbstractStreamableMedia", + [ ]],["Frame","FFMpeg\/Media\/Frame.html"," < AbstractMediaType", + [ ]],["MediaTypeInterface","FFMpeg\/Media\/MediaTypeInterface.html","", + [ ]],["Video","FFMpeg\/Media\/Video.html"," < Audio", + [ ]] ]],["FFMpeg","FFMpeg\/FFMpeg.html","", + [ ]],["FFMpegServiceProvider","FFMpeg\/FFMpegServiceProvider.html","", + [ ]],["FFProbe","FFMpeg\/FFProbe.html","", + [ ]] ]] ] + diff --git a/vendor/php-ffmpeg/php-ffmpeg/phpunit.xml.dist b/vendor/php-ffmpeg/php-ffmpeg/phpunit.xml.dist new file mode 100644 index 0000000000..8b9403d777 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/phpunit.xml.dist @@ -0,0 +1,32 @@ + + + + + + + + + tests/Unit + + + tests/Functional + + + + + + src/ + + + + diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Coordinate/AspectRatio.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Coordinate/AspectRatio.php new file mode 100644 index 0000000000..0f159d7e9e --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Coordinate/AspectRatio.php @@ -0,0 +1,260 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Coordinate; + +use FFMpeg\Exception\InvalidArgumentException; + +// see http://en.wikipedia.org/wiki/List_of_common_resolutions +class AspectRatio +{ + // named 4:3 or 1.33:1 Traditional TV + const AR_4_3 = '4/3'; + // named 16:9 or 1.77:1 HD video standard + const AR_16_9 = '16/9'; + + // named 8:5 or 16:10 or 1.6:1 + const AR_8_5 = '8/5'; + + // named 25:16 or 1.56:1 + const AR_25_16 = '25/16'; + + // named 3:2 or 1.5:1 see http://en.wikipedia.org/wiki/135_film + const AR_3_2 = '3/2'; + // named 5:3 or 1.66:1 see http://en.wikipedia.org/wiki/Super_16_mm + const AR_5_3 = '5/3'; + + // mostly used in Photography + const AR_5_4 = '5/4'; + const AR_1_1 = '1/1'; + + // 1.85:1 US widescreen cinema standard see http://en.wikipedia.org/wiki/Widescreen#Film + const AR_1_DOT_85_1 = '1.85:1'; + // 2.39:1 or 2.40:1 Current widescreen cinema standard see http://en.wikipedia.org/wiki/Anamorphic_format + const AR_2_DOT_39_1 = '2.39:1'; + + // Rotated constants + + // Rotated 4:3 + const AR_ROTATED_3_4 = '3/4'; + // Rotated 16:9 + const AR_ROTATED_9_16 = '9/16'; + + // Rotated 3:2 + const AR_ROTATED_2_3 = '2/3'; + // Rotated 5:3 + const AR_ROTATED_3_5 = '3/5'; + + // Rotated 5:4 + const AR_ROTATED_4_5 = '4/5'; + + // Rotated 1.85 + const AR_ROTATED_1_DOT_85 = '1/1.85'; + // Rotated 2.39 + const AR_ROTATED_2_DOT_39 = '1/2.39'; + + /** @var float */ + private $ratio; + + public function __construct($ratio) + { + $this->ratio = $ratio; + } + + /** + * Returns the value of the ratio. + * + * @return float + */ + public function getValue() + { + return $this->ratio; + } + + /** + * Computes the best width for given height and modulus. + * + * @param Integer $height + * @param Integer $modulus + * + * @return Integer + */ + public function calculateWidth($height, $modulus = 1) + { + $maxPossibleWidth = $this->getMultipleUp(ceil($this->ratio * $height), $modulus); + $minPossibleWidth = $this->getMultipleDown(floor($this->ratio * $height), $modulus); + + $maxRatioDiff = abs($this->ratio - ($maxPossibleWidth / $height)); + $minRatioDiff = abs($this->ratio - ($minPossibleWidth / $height)); + + return $maxRatioDiff < $minRatioDiff ? $maxPossibleWidth : $minPossibleWidth; + } + + /** + * Computes the best height for given width and modulus. + * + * @param Integer $width + * @param Integer $modulus + * + * @return Integer + */ + public function calculateHeight($width, $modulus = 1) + { + $maxPossibleHeight = $this->getMultipleUp(ceil($width / $this->ratio), $modulus); + $minPossibleHeight = $this->getMultipleDown(floor($width / $this->ratio), $modulus); + + $maxRatioDiff = abs($this->ratio - ($width / $maxPossibleHeight)); + $minRatioDiff = abs($this->ratio - ($width / $minPossibleHeight)); + + return $maxRatioDiff < $minRatioDiff ? $maxPossibleHeight : $minPossibleHeight; + } + + private function getMultipleUp($value, $multiple) + { + while (0 !== $value % $multiple) { + $value++; + } + + return $value; + } + + private function getMultipleDown($value, $multiple) + { + while (0 !== $value % $multiple) { + $value--; + } + + return $value; + } + + /** + * Creates a ratio based on Dimension. + * + * The strategy parameter forces by default to use standardized ratios. If + * custom ratio need to be used, disable it. + * + * @param Dimension $dimension + * @param Boolean $forceStandards Whether to force or not standard ratios + * + * @return AspectRatio + * + * @throws InvalidArgumentException + */ + public static function create(Dimension $dimension, $forceStandards = true) + { + $incoming = $dimension->getWidth() / $dimension->getHeight(); + + if ($forceStandards) { + return new static(static::nearestStrategy($incoming)); + } else { + return new static(static::customStrategy($incoming)); + } + } + + private static function valueFromName($name) + { + switch ($name) { + case static::AR_4_3: + return 4 / 3; + case static::AR_16_9: + return 16 / 9; + case static::AR_8_5: + return 8 / 5; + case static::AR_25_16: + return 25 / 16; + case static::AR_1_1: + return 1 / 1; + case static::AR_1_DOT_85_1: + return 1.85; + case static::AR_2_DOT_39_1: + return 2.39; + case static::AR_3_2: + return 3 / 2; + case static::AR_5_3: + return 5 / 3; + case static::AR_5_4: + return 5 / 4; + case static::AR_ROTATED_3_4: + return 3 / 4; + case static::AR_ROTATED_9_16: + return 9 / 16; + case static::AR_ROTATED_2_3: + return 2 / 3; + case static::AR_ROTATED_3_5: + return 3 / 5; + case static::AR_ROTATED_4_5: + return 4 / 5; + case static::AR_ROTATED_1_DOT_85: + return 1 / 1.85; + case static::AR_ROTATED_2_DOT_39: + return 1 / 2.39; + default: + throw new InvalidArgumentException(sprintf('Unable to find value for %s', $name)); + } + } + + private static function customStrategy($incoming) + { + $try = static::nearestStrategy($incoming); + + if (abs($try - $incoming) < $try * 0.05) { + return $try; + } + + return $incoming; + } + + private static function nearestStrategy($incoming) + { + $availables = array( + static::AR_4_3 => static::valueFromName(static::AR_4_3), + static::AR_16_9 => static::valueFromName(static::AR_16_9), + static::AR_8_5 => static::valueFromName(static::AR_8_5), + static::AR_25_16 => static::valueFromName(static::AR_25_16), + static::AR_1_1 => static::valueFromName(static::AR_1_1), + static::AR_1_DOT_85_1 => static::valueFromName(static::AR_1_DOT_85_1), + static::AR_2_DOT_39_1 => static::valueFromName(static::AR_2_DOT_39_1), + static::AR_3_2 => static::valueFromName(static::AR_3_2), + static::AR_5_3 => static::valueFromName(static::AR_5_3), + static::AR_5_4 => static::valueFromName(static::AR_5_4), + + // Rotated + static::AR_ROTATED_4_5 => static::valueFromName(static::AR_ROTATED_4_5), + static::AR_ROTATED_9_16 => static::valueFromName(static::AR_ROTATED_9_16), + static::AR_ROTATED_2_3 => static::valueFromName(static::AR_ROTATED_2_3), + static::AR_ROTATED_3_5 => static::valueFromName(static::AR_ROTATED_3_5), + static::AR_ROTATED_3_4 => static::valueFromName(static::AR_ROTATED_3_4), + static::AR_ROTATED_1_DOT_85 => static::valueFromName(static::AR_ROTATED_1_DOT_85), + static::AR_ROTATED_2_DOT_39 => static::valueFromName(static::AR_ROTATED_2_DOT_39), + ); + asort($availables); + + $previous = $current = null; + + foreach ($availables as $name => $value) { + $current = $value; + if ($incoming <= $value) { + break; + } + $previous = $value; + } + + if (null === $previous) { + return $current; + } + + if (($current - $incoming) < ($incoming - $previous)) { + return $current; + } + + return $previous; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Coordinate/Dimension.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Coordinate/Dimension.php new file mode 100644 index 0000000000..33ebaea944 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Coordinate/Dimension.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 FFMpeg\Coordinate; + +use FFMpeg\Exception\InvalidArgumentException; + +/** + * Dimension object, used for manipulating width and height couples + */ +class Dimension +{ + private $width; + private $height; + + /** + * @param integer $width + * @param integer $height + * + * @throws InvalidArgumentException when one of the parameteres is invalid + */ + public function __construct($width, $height) + { + if ($width <= 0 || $height <= 0) { + throw new InvalidArgumentException('Width and height should be positive integer'); + } + + $this->width = (int) $width; + $this->height = (int) $height; + } + + /** + * Returns width. + * + * @return integer + */ + public function getWidth() + { + return $this->width; + } + + /** + * Returns height. + * + * @return integer + */ + public function getHeight() + { + return $this->height; + } + + /** + * Returns the ratio. + * + * @param type $forceStandards Whether or not force the use of standards ratios; + * + * @return AspectRatio + */ + public function getRatio($forceStandards = true) + { + return AspectRatio::create($this, $forceStandards); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Coordinate/FrameRate.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Coordinate/FrameRate.php new file mode 100644 index 0000000000..ed0c7b2800 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Coordinate/FrameRate.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Coordinate; + +use FFMpeg\Exception\InvalidArgumentException; + +class FrameRate +{ + private $value; + + public function __construct($value) + { + if ($value <= 0) { + throw new InvalidArgumentException('Invalid frame rate, must be positive value.'); + } + + $this->value = $value; + } + + /** + * @return float + */ + public function getValue() + { + return $this->value; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Coordinate/Point.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Coordinate/Point.php new file mode 100644 index 0000000000..710216c9e4 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Coordinate/Point.php @@ -0,0 +1,45 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Coordinate; + +class Point +{ + private $x; + private $y; + + public function __construct($x, $y, $dynamic = false) + { + if ($dynamic) { + $this->x = $x; + $this->y = $y; + } else { + $this->x = (int)$x; + $this->y = (int)$y; + } + } + + /** + * @return integer + */ + public function getX() + { + return $this->x; + } + + /** + * @return integer + */ + public function getY() + { + return $this->y; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Coordinate/TimeCode.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Coordinate/TimeCode.php new file mode 100644 index 0000000000..b65a525946 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Coordinate/TimeCode.php @@ -0,0 +1,120 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Coordinate; + +use FFMpeg\Exception\InvalidArgumentException; + +class TimeCode +{ + //see http://www.dropframetimecode.org/ + private $hours; + private $minutes; + private $seconds; + private $frames; + + public function __construct($hours, $minutes, $seconds, $frames) + { + $this->hours = $hours; + $this->minutes = $minutes; + $this->seconds = $seconds; + $this->frames = $frames; + } + + public function __toString() + { + return sprintf('%02d:%02d:%02d.%02d', $this->hours, $this->minutes, $this->seconds, $this->frames); + } + + /** + * Creates timecode from string. + * + * @param string $timecode + * + * @return TimeCode + * + * @throws InvalidArgumentException In case an invalid timecode is supplied + */ + public static function fromString($timecode) + { + $days = 0; + + if (preg_match('/^[0-9]+:[0-9]+:[0-9]+:[0-9]+\.[0-9]+$/', $timecode)) { + list($days, $hours, $minutes, $seconds, $frames) = sscanf($timecode, '%d:%d:%d:%d.%d'); + } elseif (preg_match('/^[0-9]+:[0-9]+:[0-9]+:[0-9]+:[0-9]+$/', $timecode)) { + list($days, $hours, $minutes, $seconds, $frames) = sscanf($timecode, '%d:%d:%d:%d:%d'); + } elseif (preg_match('/^[0-9]+:[0-9]+:[0-9]+\.[0-9]+$/', $timecode)) { + list($hours, $minutes, $seconds, $frames) = sscanf($timecode, '%d:%d:%d.%s'); + } elseif (preg_match('/^[0-9]+:[0-9]+:[0-9]+:[0-9]+$/', $timecode)) { + list($hours, $minutes, $seconds, $frames) = sscanf($timecode, '%d:%d:%d:%s'); + } else { + throw new InvalidArgumentException(sprintf('Unable to parse timecode %s', $timecode)); + } + + $hours += $days * 24; + + return new static($hours, $minutes, $seconds, $frames); + } + + /** + * Creates timecode from number of seconds. + * + * @param float $quantity + * + * @return TimeCode + */ + public static function fromSeconds($quantity) + { + $minutes = $hours = $frames = 0; + + $frames = round(100 * ($quantity - floor($quantity))); + $seconds = floor($quantity); + + if ($seconds > 59) { + $minutes = floor($seconds / 60); + $seconds = $seconds % 60; + } + if ($minutes > 59) { + $hours = floor($minutes / 60); + $minutes = $minutes % 60; + } + + return new static($hours, $minutes, $seconds, $frames); + } + + /** + * Returns this timecode in seconds + * @return int + */ + public function toSeconds() { + $seconds = 0; + + $seconds += $this->hours * 60 * 60; + $seconds += $this->minutes * 60; + $seconds += $this->seconds; + + // TODO: Handle frames? + + return (int) $seconds; + } + + /** + * Helper function wether `$timecode` is after this one + * + * @param TimeCode $timecode The Timecode to compare + * @return bool + */ + public function isAfter(TimeCode $timecode) { + // convert everything to seconds and compare + return ($this->toSeconds() > $timecode->toSeconds()); + } + +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Driver/FFMpegDriver.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Driver/FFMpegDriver.php new file mode 100644 index 0000000000..a0de7beab8 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Driver/FFMpegDriver.php @@ -0,0 +1,74 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Driver; + +use Alchemy\BinaryDriver\AbstractBinary; +use Alchemy\BinaryDriver\Configuration; +use Alchemy\BinaryDriver\ConfigurationInterface; +use Alchemy\BinaryDriver\Exception\ExecutableNotFoundException as BinaryDriverExecutableNotFound; +use FFMpeg\Exception\ExecutableNotFoundException; +use FFMpeg\Exception\RuntimeException; +use Psr\Log\LoggerInterface; + +class FFMpegDriver extends AbstractBinary +{ + /** + * {@inheritdoc} + */ + public function getName() + { + return 'ffmpeg'; + } + + /** + * Creates an FFMpegDriver. + * + * @param LoggerInterface $logger + * @param array|Configuration $configuration + * + * @return FFMpegDriver + */ + public static function create(LoggerInterface $logger = null, $configuration = array()) + { + if (!$configuration instanceof ConfigurationInterface) { + $configuration = new Configuration($configuration); + } + + $binaries = $configuration->get('ffmpeg.binaries', array('avconv', 'ffmpeg')); + + if (!$configuration->has('timeout')) { + $configuration->set('timeout', 300); + } + + try { + return static::load($binaries, $logger, $configuration); + } catch (BinaryDriverExecutableNotFound $e) { + throw new ExecutableNotFoundException('Unable to load FFMpeg', $e->getCode(), $e); + } + } + + /** + * Get ffmpeg version. + * + * @return string + * @throws RuntimeException + */ + public function getVersion() + { + preg_match('#version\s(\S+)#', $this->command('-version'), $version); + if (!isset($version[1])) { + throw new RuntimeException('Cannot to parse the ffmpeg version!'); + } + + return $version[1]; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Driver/FFProbeDriver.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Driver/FFProbeDriver.php new file mode 100644 index 0000000000..40636113d6 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Driver/FFProbeDriver.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 FFMpeg\Driver; + +use Alchemy\BinaryDriver\AbstractBinary; +use Alchemy\BinaryDriver\Configuration; +use Alchemy\BinaryDriver\ConfigurationInterface; +use Alchemy\BinaryDriver\Exception\ExecutableNotFoundException as BinaryDriverExecutableNotFound; +use FFMpeg\Exception\ExecutableNotFoundException; +use Psr\Log\LoggerInterface; + +class FFProbeDriver extends AbstractBinary +{ + /** + * {@inheritdoc} + */ + public function getName() + { + return 'ffprobe'; + } + + /** + * Creates an FFProbeDriver. + * + * @param array|ConfigurationInterface $configuration + * @param LoggerInterface $logger + * + * @return FFProbeDriver + */ + public static function create($configuration, LoggerInterface $logger = null) + { + if (!$configuration instanceof ConfigurationInterface) { + $configuration = new Configuration($configuration); + } + + $binaries = $configuration->get('ffprobe.binaries', array('avprobe', 'ffprobe')); + + try { + return static::load($binaries, $logger, $configuration); + } catch (BinaryDriverExecutableNotFound $e) { + throw new ExecutableNotFoundException('Unable to load FFProbe', $e->getCode(), $e); + } + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Exception/ExceptionInterface.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Exception/ExceptionInterface.php new file mode 100644 index 0000000000..df1bfb016c --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Exception/ExceptionInterface.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Exception; + +interface ExceptionInterface +{ +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Exception/ExecutableNotFoundException.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Exception/ExecutableNotFoundException.php new file mode 100644 index 0000000000..28736d8030 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Exception/ExecutableNotFoundException.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Exception; + +class ExecutableNotFoundException extends RuntimeException +{ +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Exception/InvalidArgumentException.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Exception/InvalidArgumentException.php new file mode 100644 index 0000000000..c2ef8bdfc8 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Exception/InvalidArgumentException.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Exception; + +class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface +{ +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Exception/LogicException.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Exception/LogicException.php new file mode 100644 index 0000000000..b73b567b60 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Exception/LogicException.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Exception; + +class LogicException extends \LogicException implements ExceptionInterface +{ +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Exception/RuntimeException.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Exception/RuntimeException.php new file mode 100644 index 0000000000..14261da390 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Exception/RuntimeException.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Exception; + +class RuntimeException extends \RuntimeException implements ExceptionInterface +{ +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFMpeg.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFMpeg.php new file mode 100644 index 0000000000..16a7ff151b --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFMpeg.php @@ -0,0 +1,137 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg; + +use Alchemy\BinaryDriver\ConfigurationInterface; +use FFMpeg\Driver\FFMpegDriver; +use FFMpeg\Exception\InvalidArgumentException; +use FFMpeg\Exception\RuntimeException; +use FFMpeg\Media\Audio; +use FFMpeg\Media\AdvancedMedia; +use FFMpeg\Media\Video; +use Psr\Log\LoggerInterface; + +class FFMpeg +{ + /** @var FFMpegDriver */ + private $driver; + /** @var FFProbe */ + private $ffprobe; + + public function __construct(FFMpegDriver $ffmpeg, FFProbe $ffprobe) + { + $this->driver = $ffmpeg; + $this->ffprobe = $ffprobe; + } + + /** + * Sets FFProbe. + * + * @param FFProbe + * + * @return FFMpeg + */ + public function setFFProbe(FFProbe $ffprobe) + { + $this->ffprobe = $ffprobe; + + return $this; + } + + /** + * Gets FFProbe. + * + * @return FFProbe + */ + public function getFFProbe() + { + return $this->ffprobe; + } + + /** + * Sets the ffmpeg driver. + * + * @param FFMpegDriver $ffmpeg + * + * @return FFMpeg + */ + public function setFFMpegDriver(FFMpegDriver $ffmpeg) + { + $this->driver = $ffmpeg; + + return $this; + } + + /** + * Gets the ffmpeg driver. + * + * @return FFMpegDriver + */ + public function getFFMpegDriver() + { + return $this->driver; + } + + /** + * Opens a file in order to be processed. + * + * @param string $pathfile A pathfile + * + * @return Audio|Video + * + * @throws InvalidArgumentException + */ + public function open($pathfile) + { + if (null === $streams = $this->ffprobe->streams($pathfile)) { + throw new RuntimeException(sprintf('Unable to probe "%s".', $pathfile)); + } + + if (0 < count($streams->videos())) { + return new Video($pathfile, $this->driver, $this->ffprobe); + } elseif (0 < count($streams->audios())) { + return new Audio($pathfile, $this->driver, $this->ffprobe); + } + + throw new InvalidArgumentException('Unable to detect file format, only audio and video supported'); + } + + /** + * Opens multiple input sources. + * + * @param string[] $inputs Array of files to be opened. + * + * @return AdvancedMedia + */ + public function openAdvanced($inputs) + { + return new AdvancedMedia($inputs, $this->driver, $this->ffprobe); + } + + /** + * Creates a new FFMpeg instance. + * + * @param array|ConfigurationInterface $configuration + * @param LoggerInterface $logger + * @param FFProbe $probe + * + * @return FFMpeg + */ + public static function create($configuration = array(), LoggerInterface $logger = null, FFProbe $probe = null) + { + if (null === $probe) { + $probe = FFProbe::create($configuration, $logger, null); + } + + return new static(FFMpegDriver::create($logger, $configuration), $probe); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFMpegServiceProvider.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFMpegServiceProvider.php new file mode 100644 index 0000000000..6aa97350be --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFMpegServiceProvider.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 FFMpeg; + +use Doctrine\Common\Cache\ArrayCache; +use Silex\Application; +use Silex\ServiceProviderInterface; + +class FFMpegServiceProvider implements ServiceProviderInterface +{ + public function register(Application $app) + { + $app['ffmpeg.configuration'] = array(); + $app['ffmpeg.default.configuration'] = array( + 'ffmpeg.threads' => 4, + 'ffmpeg.timeout' => 300, + 'ffmpeg.binaries' => array('avconv', 'ffmpeg'), + 'ffprobe.timeout' => 30, + 'ffprobe.binaries' => array('avprobe', 'ffprobe'), + ); + $app['ffmpeg.logger'] = null; + + $app['ffmpeg.configuration.build'] = $app->share(function (Application $app) { + return array_replace($app['ffmpeg.default.configuration'], $app['ffmpeg.configuration']); + }); + + $app['ffmpeg'] = $app['ffmpeg.ffmpeg'] = $app->share(function (Application $app) { + $configuration = $app['ffmpeg.configuration.build']; + + if (isset($configuration['ffmpeg.timeout'])) { + $configuration['timeout'] = $configuration['ffmpeg.timeout']; + } + + return FFMpeg::create($configuration, $app['ffmpeg.logger'], $app['ffmpeg.ffprobe']); + }); + + $app['ffprobe.cache'] = $app->share(function () { + return new ArrayCache(); + }); + + $app['ffmpeg.ffprobe'] = $app->share(function (Application $app) { + $configuration = $app['ffmpeg.configuration.build']; + + if (isset($configuration['ffmpeg.timeout'])) { + $configuration['timeout'] = $configuration['ffprobe.timeout']; + } + + return FFProbe::create($configuration, $app['ffmpeg.logger'], $app['ffprobe.cache']); + }); + } + + public function boot(Application $app) + { + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe.php new file mode 100644 index 0000000000..a1a0ba3fdb --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe.php @@ -0,0 +1,294 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg; + +use Alchemy\BinaryDriver\ConfigurationInterface; +use Alchemy\BinaryDriver\Exception\ExecutionFailureException; +use Doctrine\Common\Cache\ArrayCache; +use Doctrine\Common\Cache\Cache; +use FFMpeg\Driver\FFProbeDriver; +use FFMpeg\FFProbe\DataMapping\Format; +use FFMpeg\FFProbe\Mapper; +use FFMpeg\FFProbe\MapperInterface; +use FFMpeg\FFProbe\OptionsTester; +use FFMpeg\FFProbe\OptionsTesterInterface; +use FFMpeg\FFProbe\OutputParser; +use FFMpeg\FFProbe\OutputParserInterface; +use FFMpeg\Exception\InvalidArgumentException; +use FFMpeg\Exception\RuntimeException; +use FFMpeg\FFProbe\DataMapping\StreamCollection; +use Psr\Log\LoggerInterface; + +class FFProbe +{ + const TYPE_STREAMS = 'streams'; + const TYPE_FORMAT = 'format'; + + /** @var Cache */ + private $cache; + /** @var OptionsTesterInterface */ + private $optionsTester; + /** @var OutputParserInterface */ + private $parser; + /** @var FFProbeDriver */ + private $ffprobe; + /** @var MapperInterface */ + private $mapper; + + public function __construct(FFProbeDriver $ffprobe, Cache $cache) + { + $this->ffprobe = $ffprobe; + $this->optionsTester = new OptionsTester($ffprobe, $cache); + $this->parser = new OutputParser(); + $this->mapper = new Mapper(); + $this->cache = $cache; + } + + /** + * @return OutputParserInterface + */ + public function getParser() + { + return $this->parser; + } + + /** + * @param OutputParserInterface $parser + * + * @return FFProbe + */ + public function setParser(OutputParserInterface $parser) + { + $this->parser = $parser; + + return $this; + } + + /** + * @return FFProbeDriver + */ + public function getFFProbeDriver() + { + return $this->ffprobe; + } + + /** + * @param FFProbeDriver $ffprobe + * + * @return FFProbe + */ + public function setFFProbeDriver(FFProbeDriver $ffprobe) + { + $this->ffprobe = $ffprobe; + + return $this; + } + + /** + * @param OptionsTesterInterface $tester + * + * @return FFProbe + */ + public function setOptionsTester(OptionsTesterInterface $tester) + { + $this->optionsTester = $tester; + + return $this; + } + + /** + * @return OptionsTesterInterface + */ + public function getOptionsTester() + { + return $this->optionsTester; + } + + /** + * @param Cache $cache + * + * @return FFProbe + */ + public function setCache(Cache $cache) + { + $this->cache = $cache; + + return $this; + } + + /** + * @return Cache + */ + public function getCache() + { + return $this->cache; + } + + /** + * @return MapperInterface + */ + public function getMapper() + { + return $this->mapper; + } + + /** + * @param MapperInterface $mapper + * + * @return FFProbe + */ + public function setMapper(MapperInterface $mapper) + { + $this->mapper = $mapper; + + return $this; + } + + /** + * @api + * + * Probes the format of a given file. + * + * @param string $pathfile + * + * @return Format A Format object + * + * @throws InvalidArgumentException + * @throws RuntimeException + */ + public function format($pathfile) + { + return $this->probe($pathfile, '-show_format', static::TYPE_FORMAT); + } + + /** + * @api + * + * Checks wether the given `$pathfile` is considered a valid media file. + * + * @param string $pathfile + * @return bool + * @since 0.10.0 + */ + public function isValid($pathfile) + { + try { + return $this->format($pathfile)->get('duration') > 0; + } catch(\Exception $e) { + // complete invalid data + return false; + } + } + + /** + * @api + * + * Probes the streams contained in a given file. + * + * @param string $pathfile + * + * @return StreamCollection A collection of streams + * + * @throws InvalidArgumentException + * @throws RuntimeException + */ + public function streams($pathfile) + { + return $this->probe($pathfile, '-show_streams', static::TYPE_STREAMS); + } + + /** + * @api + * + * Creates an FFProbe. + * + * @param array|ConfigurationInterface $configuration + * @param LoggerInterface $logger + * @param Cache $cache + * + * @return FFProbe + */ + public static function create($configuration = array(), LoggerInterface $logger = null, Cache $cache = null) + { + if (null === $cache) { + $cache = new ArrayCache(); + } + + return new static(FFProbeDriver::create($configuration, $logger), $cache); + } + + private function probe($pathfile, $command, $type, $allowJson = true) + { + $id = sprintf('%s-%s', $command, $pathfile); + + if ($this->cache->contains($id)) { + return $this->cache->fetch($id); + } + + if (!$this->optionsTester->has($command)) { + throw new RuntimeException(sprintf( + 'This version of ffprobe is too old and ' + . 'does not support `%s` option, please upgrade', $command + )); + } + + $commands = array($pathfile, $command); + + $parseIsToDo = false; + + if ($allowJson && $this->optionsTester->has('-print_format')) { + // allowed in latest PHP-FFmpeg version + $commands[] = '-print_format'; + $commands[] = 'json'; + } elseif ($allowJson && $this->optionsTester->has('-of')) { + // option has changed in avconv 9 + $commands[] = '-of'; + $commands[] = 'json'; + } else { + $parseIsToDo = true; + } + + try { + $output = $this->ffprobe->command($commands); + } catch (ExecutionFailureException $e) { + throw new RuntimeException(sprintf('Unable to probe %s', $pathfile), $e->getCode(), $e); + } + + if ($parseIsToDo) { + $data = $this->parser->parse($type, $output); + } else { + try { + // Malformed json may be retrieved + $data = $this->parseJson($output); + } catch (RuntimeException $e) { + return $this->probe($pathfile, $command, $type, false); + } + } + + $ret = $this->mapper->map($type, $data); + + $this->cache->save($id, $ret); + + return $ret; + } + + private function parseJson($data) + { + $ret = @json_decode($data, true); + + if (JSON_ERROR_NONE !== json_last_error()) { + throw new RuntimeException(sprintf('Unable to parse json %s', $ret)); + } + + return $ret; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/DataMapping/AbstractData.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/DataMapping/AbstractData.php new file mode 100644 index 0000000000..ce04e89928 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/DataMapping/AbstractData.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 FFMpeg\FFProbe\DataMapping; + +abstract class AbstractData implements \Countable +{ + private $properties; + + public function __construct(array $properties) + { + $this->properties = $properties; + } + + /** + * Returns true if data has property. + * + * @param string $property + * @return Boolean + */ + public function has($property) + { + return isset($this->properties[$property]); + } + + /** + * Returns the property value given its name. + * + * @param string $property + * @param mixed $default + * + * @return mixed + */ + public function get($property, $default = null) + { + if (!isset($this->properties[$property])) { + return $default; + } + + return $this->properties[$property]; + } + + /** + * Sets the property value given its name. + * + * @param string $property + * @param mixed $value + * + * @return AbstractData + */ + public function set($property, $value) + { + $this->properties[$property] = $value; + + return $this; + } + + /** + * Returns all property names. + * + * @return array + */ + public function keys() + { + return array_keys($this->properties); + } + + /** + * Returns all properties and their values. + * + * @return array + */ + public function all() + { + return $this->properties; + } + + /** + * {@inheritdoc} + */ + public function count() + { + return count($this->properties); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/DataMapping/Format.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/DataMapping/Format.php new file mode 100644 index 0000000000..4d7caa0dc9 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/DataMapping/Format.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\FFProbe\DataMapping; + +class Format extends AbstractData +{ +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/DataMapping/Stream.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/DataMapping/Stream.php new file mode 100644 index 0000000000..3333453bf6 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/DataMapping/Stream.php @@ -0,0 +1,107 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\FFProbe\DataMapping; + +use FFMpeg\Exception\LogicException; +use FFMpeg\Exception\RuntimeException; +use FFMpeg\Coordinate\Dimension; + +class Stream extends AbstractData +{ + /** + * Returns true if the stream is an audio stream. + * + * @return Boolean + */ + public function isAudio() + { + return $this->get('codec_type') === 'audio'; + } + + /** + * Returns true if the stream is a video stream. + * + * @return Boolean + */ + public function isVideo() + { + return $this->get('codec_type') === 'video'; + } + + /** + * Returns the dimension of the video stream. + * + * @return Dimension + * + * @throws LogicException In case the stream is not a video stream. + * @throws RuntimeException In case the dimensions can not be extracted. + */ + public function getDimensions() + { + if (!$this->isVideo()) { + throw new LogicException('Dimensions can only be retrieved from video streams.'); + } + + $sampleRatio = $displayRatio = null; + + $width = $this->get('width'); + $height = $this->get('height'); + + if (null !== $ratio = $this->extractRatio($this, 'sample_aspect_ratio')) { + $sampleRatio = $ratio; + } + if (null !== $ratio = $this->extractRatio($this, 'display_aspect_ratio')) { + $displayRatio = $ratio; + } + + if (null === $height || null === $width) { + throw new RuntimeException('Unable to extract dimensions.'); + } + + if (null !== $displayRatio && null !== $sampleRatio) { + if ($sampleRatio[0] !== 1 && $sampleRatio[1] !== 1) { + if (null !== $width && null !== $height) { + // stretch video according to pixel sample aspect ratio + $width = round($width * ($sampleRatio[0] / $sampleRatio[1])); + // set height according to display aspect ratio + $height = round($width * ($displayRatio[1] / $displayRatio[0])); + } + } + } + + return new Dimension($width, $height); + } + + /** + * Extracts a ratio from a string in a \d+:\d+ format given a key name. + * + * @param Stream $stream The stream where to look for the ratio. + * @param string $name the name of the key. + * @return null|array An array containing the width and the height, null if not found. + */ + private function extractRatio(Stream $stream, $name) + { + if (!$stream->has($name)) { + return; + } + + $ratio = $stream->get($name); + if (preg_match('/\d+:\d+/', $ratio)) { + $data = array_filter(explode(':', $ratio), function ($int) { + return $int > 0; + }); + if (2 === count($data)) { + return array_map(function ($int) { return (int) $int; }, $data); + } + } + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/DataMapping/StreamCollection.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/DataMapping/StreamCollection.php new file mode 100644 index 0000000000..409cf912d5 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/DataMapping/StreamCollection.php @@ -0,0 +1,99 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\FFProbe\DataMapping; + +class StreamCollection implements \Countable, \IteratorAggregate +{ + private $streams; + + public function __construct(array $streams = array()) + { + $this->streams = array_values($streams); + } + + /** + * Returns the first stream of the collection, null if the collection is + * empty. + * + * @return null|Stream + */ + public function first() + { + $stream = reset($this->streams); + + return $stream ?: null; + } + + /** + * Adds a stream to the collection. + * + * @param Stream $stream + * + * @return StreamCollection + */ + public function add(Stream $stream) + { + $this->streams[] = $stream; + + return $this; + } + + /** + * Returns a new StreamCollection with only video streams. + * + * @return StreamCollection + */ + public function videos() + { + return new static(array_filter($this->streams, function (Stream $stream) { + return $stream->isVideo(); + })); + } + + /** + * Returns a new StreamCollection with only audio streams. + * + * @return StreamCollection + */ + public function audios() + { + return new static(array_filter($this->streams, function (Stream $stream) { + return $stream->isAudio(); + })); + } + + /** + * {@inheritdoc} + */ + public function count() + { + return count($this->streams); + } + + /** + * Returns the array of contained streams. + * + * @return array + */ + public function all() + { + return $this->streams; + } + + /** + * {@inheritdoc} + */ + public function getIterator() + { + return new \ArrayIterator($this->streams); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/Mapper.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/Mapper.php new file mode 100644 index 0000000000..c0bf70f91c --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/Mapper.php @@ -0,0 +1,54 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\FFProbe; + +use FFMpeg\FFProbe; +use FFMpeg\FFProbe\DataMapping\Format; +use FFMpeg\FFProbe\DataMapping\StreamCollection; +use FFMpeg\FFProbe\DataMapping\Stream; +use FFMpeg\Exception\InvalidArgumentException; + +class Mapper implements MapperInterface +{ + /** + * {@inheritdoc} + */ + public function map($type, $data) + { + switch ($type) { + case FFProbe::TYPE_FORMAT: + return $this->mapFormat($data); + case FFProbe::TYPE_STREAMS: + return $this->mapStreams($data); + default: + throw new InvalidArgumentException(sprintf( + 'Invalid type `%s`.', $type + )); + } + } + + private function mapFormat($data) + { + return new Format($data['format']); + } + + private function mapStreams($data) + { + $streams = new StreamCollection(); + + foreach ($data['streams'] as $properties) { + $streams->add(new Stream($properties)); + } + + return $streams; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/MapperInterface.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/MapperInterface.php new file mode 100644 index 0000000000..dbd1312bcb --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/MapperInterface.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 FFMpeg\FFProbe; + +interface MapperInterface +{ + /** + * Maps data given its type. + * + * @param string $type One of FFProbe::TYPE_* constant + * @param string $data The data + * + * @return Format|Stream + * + * @throws InvalidArgumentException In case the type is not supported + */ + public function map($type, $data); +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/OptionsTester.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/OptionsTester.php new file mode 100644 index 0000000000..be45a76e59 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/OptionsTester.php @@ -0,0 +1,70 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\FFProbe; + +use Alchemy\BinaryDriver\Exception\ExecutionFailureException; +use Doctrine\Common\Cache\Cache; +use FFMpeg\Driver\FFProbeDriver; +use FFMpeg\Exception\RuntimeException; + +class OptionsTester implements OptionsTesterInterface +{ + /** @var FFProbeDriver */ + private $ffprobe; + /** @var Cache */ + private $cache; + + public function __construct(FFProbeDriver $ffprobe, Cache $cache) + { + $this->ffprobe = $ffprobe; + $this->cache = $cache; + } + + /** + * {@inheritdoc} + */ + public function has($name) + { + $id = sprintf('option-%s', $name); + + if ($this->cache->contains($id)) { + return $this->cache->fetch($id); + } + + $output = $this->retrieveHelpOutput(); + + $ret = (Boolean) preg_match('/^'.$name.'/m', $output); + + $this->cache->save($id, $ret); + + return $ret; + } + + private function retrieveHelpOutput() + { + $id = 'help'; + + if ($this->cache->contains($id)) { + return $this->cache->fetch($id); + } + + try { + $output = $this->ffprobe->command(array('-help', '-loglevel', 'quiet')); + } catch (ExecutionFailureException $e) { + throw new RuntimeException('Your FFProbe version is too old and does not support `-help` option, please upgrade.', $e->getCode(), $e); + } + + $this->cache->save($id, $output); + + return $output; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/OptionsTesterInterface.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/OptionsTesterInterface.php new file mode 100644 index 0000000000..ab1f3ded80 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/OptionsTesterInterface.php @@ -0,0 +1,24 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\FFProbe; + +interface OptionsTesterInterface +{ + /** + * Tells if the given option is supported by ffprobe. + * + * @param string $name + * + * @return Boolean + */ + public function has($name); +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/OutputParser.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/OutputParser.php new file mode 100644 index 0000000000..acaa1a069e --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/OutputParser.php @@ -0,0 +1,125 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\FFProbe; + +use FFMpeg\FFProbe; +use FFMpeg\Exception\InvalidArgumentException; + +class OutputParser implements OutputParserInterface +{ + /** + * {@inheritdoc} + */ + public function parse($type, $data) + { + switch ($type) { + case FFProbe::TYPE_FORMAT: + return $this->parseFormat($data); + break; + case FFProbe::TYPE_STREAMS: + return $this->parseStreams($data); + break; + default: + throw new InvalidArgumentException(sprintf('Unknown data type %s', $type)); + } + } + + private function parseFormat($data) + { + $ret = array(); + + foreach (explode(PHP_EOL, $data) as $line) { + + if (in_array($line, array('[FORMAT]', '[/FORMAT]'))) { + continue; + } + + $chunks = explode('=', $line); + $key = array_shift($chunks); + + if ('' === trim($key)) { + continue; + } + + $value = trim(implode('=', $chunks)); + + if ('nb_streams' === $key) { + $value = (int) $value; + } + + if (0 === strpos($key, 'TAG:')) { + if (!isset($ret['tags'])) { + $ret['tags'] = array(); + } + $ret['tags'][substr($key, 4)] = $value; + } else { + $ret[$key] = $value; + } + } + + return array('format' => $ret); + } + + private function parseStreams($data) + { + $ret = array(); + $n = -1; + + foreach (explode(PHP_EOL, $data) as $line) { + + if ($line == '[STREAM]') { + $n ++; + $ret[$n] = array(); + continue; + } + if ($line == '[/STREAM]') { + continue; + } + + $chunks = explode('=', $line); + $key = array_shift($chunks); + + if ('' === trim($key)) { + continue; + } + + $value = trim(implode('=', $chunks)); + + if ('N/A' === $value) { + continue; + } + if ('profile' === $key && 'unknown' === $value) { + continue; + } + + if (in_array($key, array('index', 'width', 'height', 'channels', 'bits_per_sample', 'has_b_frames', 'level', 'start_pts', 'duration_ts'))) { + $value = (int) $value; + } + + if (0 === strpos($key, 'TAG:')) { + if (!isset($ret[$n]['tags'])) { + $ret[$n]['tags'] = array(); + } + $ret[$n]['tags'][substr($key, 4)] = $value; + } elseif (0 === strpos($key, 'DISPOSITION:')) { + if (!isset($ret[$n]['disposition'])) { + $ret[$n]['disposition'] = array(); + } + $ret[$n]['disposition'][substr($key, 12)] = $value; + } else { + $ret[$n][$key] = $value; + } + } + + return array('streams' => $ret); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/OutputParserInterface.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/OutputParserInterface.php new file mode 100644 index 0000000000..f220fceabf --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/FFProbe/OutputParserInterface.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 FFMpeg\FFProbe; + +interface OutputParserInterface +{ + /** + * Parses ffprobe raw output. + * + * @param string $type One of FFProbe::TYPE_* constant + * @param string $data The data + * + * @return array + * + * @throws InvalidArgumentException In case the type is not supported + */ + public function parse($type, $data); +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/ANullSrcFilter.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/ANullSrcFilter.php new file mode 100644 index 0000000000..ca575b1b2c --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/ANullSrcFilter.php @@ -0,0 +1,71 @@ +channelLayout = $channelLayout; + $this->sampleRate = $sampleRate; + $this->nbSamples = $nbSamples; + } + + /** + * Get name of the filter. + * + * @return string + */ + public function getName() + { + return 'anullsrc'; + } + + /** + * {@inheritdoc} + */ + public function applyComplex(AdvancedMedia $media) + { + return array( + '-filter_complex', + $this->getName() . $this->buildFilterOptions(array( + 'channel_layout' => $this->channelLayout, + 'sample_rate' => $this->sampleRate, + 'nb_samples' => $this->nbSamples, + )) + ); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/AbstractComplexFilter.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/AbstractComplexFilter.php new file mode 100644 index 0000000000..f5a6b20720 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/AbstractComplexFilter.php @@ -0,0 +1,62 @@ +priority = $priority; + } + + /** + * {@inheritdoc} + */ + public function getPriority() + { + return $this->priority; + } + + /** + * Get minimal version of ffmpeg starting with which this filter is supported. + * + * @return string + */ + public function getMinimalFFMpegVersion() + { + return '0.3'; + } + + /** + * Generate the config of the filter. + * + * @param array $params Associative array of filter options. The options may be null. + * + * @return string The string of the form "=name1=value1:name2=value2" or empty string. + */ + protected function buildFilterOptions(array $params) + { + $config = array(); + foreach ($params as $paramName => $paramValue) { + if ($paramValue !== null) { + $config[] = $paramName . '=' . $paramValue; + } + } + + if (!empty($config)) { + return '=' . implode(':', $config); + } + + return ''; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/ComplexCompatibleFilter.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/ComplexCompatibleFilter.php new file mode 100644 index 0000000000..c967d9512c --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/ComplexCompatibleFilter.php @@ -0,0 +1,35 @@ +priority = $baseFilter->getPriority(); + $this->inLabels = $inLabels; + $this->baseFilter = $baseFilter; + $this->outLabels = $outLabels; + } + + /** + * Returns the priority of the filter. + * + * @return integer + */ + public function getPriority() + { + return $this->priority; + } + + /** + * @return string + */ + public function getInLabels() + { + return $this->inLabels; + } + + /** + * @return string + */ + public function getOutLabels() + { + return $this->outLabels; + } + + /** + * Get name of the filter. + * + * @return string + */ + public function getName() + { + return $this->baseFilter->getName(); + } + + /** + * Get minimal version of ffmpeg starting with which this filter is supported. + * + * @return string + */ + public function getMinimalFFMpegVersion() + { + return $this->baseFilter->getMinimalFFMpegVersion(); + } + + /** + * {@inheritdoc} + */ + public function applyComplex(AdvancedMedia $media) + { + return $this->baseFilter->applyComplex($media); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/ComplexFilterInterface.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/ComplexFilterInterface.php new file mode 100644 index 0000000000..58568d6b85 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/ComplexFilterInterface.php @@ -0,0 +1,19 @@ +media = $media; + } + + /** + * @param string $in + * @param string $parameters + * @param string $out + * + * @return ComplexFilters + */ + public function custom($in, $parameters, $out) + { + $this->media->addFilter($in, new CustomComplexFilter($parameters), $out); + return $this; + } + + /** + * Adds padding (black bars) to a video. + * + * @param string $in + * @param Dimension $dimension + * @param string $out + * + * @return ComplexFilters + */ + public function pad($in, Dimension $dimension, $out) + { + $this->media->addFilter($in, new PadFilter($dimension), $out); + return $this; + } + + /** + * Adds a watermark image to a video. + * + * @param string $in + * @param string $imagePath + * @param string $out + * @param array $coordinates + * + * @return $this + */ + public function watermark($in, $imagePath, $out, array $coordinates = array()) + { + $this->media->addFilter($in, new WatermarkFilter($imagePath, $coordinates), $out); + return $this; + } + + /** + * Apply "xstack" filter. + * Warning: this filter is supported starting from 4.1 ffmpeg version. + * + * @param string $in + * @param string $layout + * @param int $inputsCount + * @param string $out + * + * @return ComplexFilters + * @see https://ffmpeg.org/ffmpeg-filters.html#xstack + */ + public function xStack($in, $layout, $inputsCount, $out) + { + $this->media->addFilter($in, new XStackFilter($layout, $inputsCount), $out); + return $this; + } + + /** + * This filter build various types of computed inputs. + * + * @param string $out + * @param string|null $type + * @param string|null $size + * @param string|null $duration + * @param string|null $sar + * @param string|null $rate + * @param string|null $level + * @param string|null $color + * @param int|null $alpha + * @param float|null $decimals + * + * @return ComplexFilters + * @see https://ffmpeg.org/ffmpeg-filters.html#allrgb_002c-allyuv_002c-color_002c-haldclutsrc_002c-nullsrc_002c-pal75bars_002c-pal100bars_002c-rgbtestsrc_002c-smptebars_002c-smptehdbars_002c-testsrc_002c-testsrc2_002c-yuvtestsrc + */ + public function testSrc( + $out, + $type = TestSrcFilter::TESTSRC, + $size = '320x240', + $duration = null, + $sar = null, + $rate = null, + $level = null, + $color = null, + $alpha = null, + $decimals = null + ) { + $this->media->addFilter('', + new TestSrcFilter($type, $size, $duration, $sar, $rate, $level, $color, $alpha, $decimals), $out); + return $this; + } + + /** + * Apply "anullsrc" filter. + * + * @param string $out + * @param string|null $channelLayout + * @param int|null $sampleRate + * @param int|null $nbSamples + * + * @return ComplexFilters + * @see https://ffmpeg.org/ffmpeg-filters.html#anullsrc + */ + public function aNullSrc( + $out, + $channelLayout = null, + $sampleRate = null, + $nbSamples = null + ) { + $this->media->addFilter('', new ANullSrcFilter($channelLayout, $sampleRate, $nbSamples), $out); + return $this; + } + + /** + * Apply "sine" filter. + * + * @param $out + * @param string $duration + * @param int|null $frequency + * @param string|null $beep_factor + * @param int|null $sample_rate + * @param string|null $samples_per_frame + * + * @return $this + * @see https://ffmpeg.org/ffmpeg-filters.html#sine + */ + public function sine( + $out, + $duration, + $frequency = null, + $beep_factor = null, + $sample_rate = null, + $samples_per_frame = null + ) { + $this->media->addFilter('', + new SineFilter($duration, $frequency, $beep_factor, $sample_rate, $samples_per_frame), $out); + return $this; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/CustomComplexFilter.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/CustomComplexFilter.php new file mode 100644 index 0000000000..25e0d71fcc --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/CustomComplexFilter.php @@ -0,0 +1,43 @@ +filter = $filter; + } + + /** + * Get name of the filter. + * + * @return string + */ + public function getName() + { + return 'custom_filter'; + } + + /** + * {@inheritdoc} + */ + public function applyComplex(AdvancedMedia $media) + { + return array('-filter_complex', $this->filter); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/SineFilter.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/SineFilter.php new file mode 100644 index 0000000000..cdfe4ed207 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/SineFilter.php @@ -0,0 +1,97 @@ +duration = $duration; + $this->frequency = $frequency; + $this->beep_factor = $beep_factor; + $this->sample_rate = $sample_rate; + $this->samples_per_frame = $samples_per_frame; + } + + /** + * Get name of the filter. + * + * @return string + */ + public function getName() + { + return 'sine'; + } + + /** + * Get minimal version of ffmpeg starting with which this filter is supported. + * + * @return string + */ + public function getMinimalFFMpegVersion() + { + return '2.0'; + } + + /** + * Apply the complex filter to the given media. + * + * @param AdvancedMedia $media + * + * @return string[] An array of arguments. + */ + public function applyComplex(AdvancedMedia $media) + { + return array( + '-filter_complex', + $this->getName() . $this->buildFilterOptions(array( + 'frequency' => $this->frequency, + 'beep_factor' => $this->beep_factor, + 'sample_rate' => $this->sample_rate, + 'duration' => $this->duration, + 'samples_per_frame' => $this->samples_per_frame, + )) + ); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/TestSrcFilter.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/TestSrcFilter.php new file mode 100644 index 0000000000..9dfe77e249 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/TestSrcFilter.php @@ -0,0 +1,246 @@ +type = $type; + $this->level = $level; + $this->color = $color; + $this->size = $size; + $this->rate = $rate; + $this->duration = $duration; + $this->sar = $sar; + $this->alpha = $alpha; + $this->decimals = $decimals; + } + + /** + * Get name of the filter. + * + * @return string + */ + public function getName() + { + return $this->type; + } + + /** + * Get minimal version of ffmpeg starting with which this filter is supported. + * + * @return string + */ + public function getMinimalFFMpegVersion() + { + switch ($this->type) { + case self::PAL75BARS: + case self::PAL100BARS: + return '4.1'; + case self::YUVTESTSRC: + return '3.2'; + case self::ALLRGB: + case self::ALLYUV: + return '2.8'; + case self::SMPTEHDBARS: + return '2.0'; + case self::SMPTEBARS: + return '1.0'; + default: + return '0.3'; + } + } + + /** + * {@inheritdoc} + */ + public function applyComplex(AdvancedMedia $media) + { + return array( + '-filter_complex', + $this->type . $this->buildFilterOptions(array( + 'level' => $this->level, + 'color' => $this->color, + 'size' => $this->size, + 'rate' => $this->rate, + 'duration' => $this->duration, + 'sar' => $this->sar, + 'alpha' => $this->alpha, + 'decimals' => $this->decimals + )) + ); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/XStackFilter.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/XStackFilter.php new file mode 100644 index 0000000000..3058a5ea5f --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/AdvancedMedia/XStackFilter.php @@ -0,0 +1,93 @@ +layout = $layout; + $this->inputsCount = $inputsCount; + } + + /** + * @param int $count + * + * @return string + */ + public static function getInputByCount($count) + { + $result = ''; + for ($i = 0; $i < $count; $i++) { + $result .= '[' . $i . ':v]'; + } + return $result; + } + + /** + * Get name of the filter. + * + * @return string + */ + public function getName() + { + return 'xstack'; + } + + /** + * Get minimal version of ffmpeg starting with which this filter is supported. + * + * @return string + */ + public function getMinimalFFMpegVersion() + { + return '4.1'; + } + + /** + * {@inheritdoc} + */ + public function applyComplex(AdvancedMedia $media) + { + return array( + '-filter_complex', + $this->getName() . $this->buildFilterOptions(array( + 'inputs' => $this->inputsCount, + 'layout' => $this->layout + )) + ); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Audio/AddMetadataFilter.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Audio/AddMetadataFilter.php new file mode 100644 index 0000000000..cd0755c4ce --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Audio/AddMetadataFilter.php @@ -0,0 +1,58 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Filters\Audio; + +use FFMpeg\Filters\Audio\AudioFilterInterface; +use FFMpeg\Format\AudioInterface; +use FFMpeg\Media\Audio; + +class AddMetadataFilter implements AudioFilterInterface +{ + /** @var Array */ + private $metaArr; + /** @var Integer */ + private $priority; + + function __construct($metaArr = null, $priority = 9) + { + $this->metaArr = $metaArr; + $this->priority = $priority; + } + + public function getPriority() + { + //must be of high priority in case theres a second input stream (artwork) to register with audio + return $this->priority; + } + + public function apply(Audio $audio, AudioInterface $format) + { + $meta = $this->metaArr; + + if (is_null($meta)) { + return ['-map_metadata', '-1', '-vn']; + } + + $metadata = []; + + if (array_key_exists("artwork", $meta)) { + array_push($metadata, "-i", $meta['artwork'], "-map", "0", "-map", "1"); + unset($meta['artwork']); + } + + foreach ($meta as $k => $v) { + array_push($metadata, "-metadata", "$k=$v"); + } + + return $metadata; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Audio/AudioClipFilter.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Audio/AudioClipFilter.php new file mode 100644 index 0000000000..c124dcaf7b --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Audio/AudioClipFilter.php @@ -0,0 +1,84 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Filters\Audio; + +use FFMpeg\Coordinate\TimeCode; +use FFMpeg\Format\AudioInterface; +use FFMpeg\Media\Audio; + +class AudioClipFilter implements AudioFilterInterface { + + /** + * @var TimeCode + */ + private $start; + + /** + * @var TimeCode + */ + private $duration; + + /** + * @var int + */ + private $priority; + + + public function __construct(TimeCode $start, TimeCode $duration = null, $priority = 0) { + $this->start = $start; + $this->duration = $duration; + $this->priority = $priority; + } + + /** + * @inheritDoc + */ + public function getPriority() { + return $this->priority; + } + + /** + * Returns the start position the audio is being cutted + * + * @return TimeCode + */ + public function getStart() { + return $this->start; + } + + /** + * Returns how long the audio is being cutted. Returns null when the duration is infinite, + * + * @return TimeCode|null + */ + public function getDuration() { + return $this->duration; + } + + /** + * @inheritDoc + */ + public function apply(Audio $audio, AudioInterface $format) { + $commands = array('-ss', (string) $this->start); + + if ($this->duration !== null) { + $commands[] = '-t'; + $commands[] = (string) $this->duration; + } + + $commands[] = '-acodec'; + $commands[] = 'copy'; + + return $commands; + } + +} \ No newline at end of file diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Audio/AudioFilterInterface.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Audio/AudioFilterInterface.php new file mode 100644 index 0000000000..b111cfe35f --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Audio/AudioFilterInterface.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Filters\Audio; + +use FFMpeg\Filters\FilterInterface; +use FFMpeg\Format\AudioInterface; +use FFMpeg\Media\Audio; + +interface AudioFilterInterface extends FilterInterface +{ + /** + * Applies the filter on the the Audio media given an format. + * + * @param Audio $audio + * @param AudioInterface $format + * + * @return array An array of arguments + */ + public function apply(Audio $audio, AudioInterface $format); +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Audio/AudioFilters.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Audio/AudioFilters.php new file mode 100644 index 0000000000..41308c0459 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Audio/AudioFilters.php @@ -0,0 +1,88 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Filters\Audio; + +use FFMpeg\Filters\Audio\AddMetadataFilter; +use FFMpeg\Media\Audio; +use FFMpeg\Coordinate\TimeCode; + +class AudioFilters +{ + protected $media; + + public function __construct(Audio $media) + { + $this->media = $media; + } + + /** + * Resamples the audio file. + * + * @param Integer $rate + * + * @return AudioFilters + */ + public function resample($rate) + { + $this->media->addFilter(new AudioResamplableFilter($rate)); + + return $this; + } + + /** + * Add metadata to an audio file. If no arguments are given then filter + * will remove all metadata from the audio file + * @param Array|Null $data If array must contain one of these key/value pairs: + * - "title": Title metadata + * - "artist": Artist metadata + * - "composer": Composer metadata + * - "album": Album metadata + * - "track": Track metadata + * - "artwork": Song artwork. String of file path + * - "year": Year metadata + * - "genre": Genre metadata + * - "description": Description metadata + */ + public function addMetadata($data = null) + { + $this->media->addFilter(new AddMetadataFilter($data)); + + return $this; + } + + /** + * Cuts the audio at `$start`, optionally define the end + * + * @param TimeCode $start Where the clipping starts(seek to time) + * @param TimeCode $duration How long the clipped audio should be + * @return AudioFilters + */ + public function clip($start, $duration = null) { + $this->media->addFilter(new AudioClipFilter($start, $duration)); + + return $this; + } + + /** + * Applies a custom filter + * + * @param string $parameters + * + * @return AudioFilters + */ + public function custom($parameters) + { + $this->media->addFilter(new CustomFilter($parameters)); + + return $this; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Audio/AudioResamplableFilter.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Audio/AudioResamplableFilter.php new file mode 100644 index 0000000000..5a6bfba65d --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Audio/AudioResamplableFilter.php @@ -0,0 +1,54 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Filters\Audio; + +use FFMpeg\Format\AudioInterface; +use FFMpeg\Media\Audio; + +class AudioResamplableFilter implements AudioFilterInterface +{ + /** @var string */ + private $rate; + /** @var integer */ + private $priority; + + public function __construct($rate, $priority = 0) + { + $this->rate = $rate; + $this->priority = $priority; + } + + /** + * {@inheritdoc} + */ + public function getPriority() + { + return $this->priority; + } + + /** + * + * @return Integer + */ + public function getRate() + { + return $this->rate; + } + + /** + * {@inheritdoc} + */ + public function apply(Audio $audio, AudioInterface $format) + { + return array('-ac', 2, '-ar', $this->rate); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Audio/CustomFilter.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Audio/CustomFilter.php new file mode 100644 index 0000000000..4c1a29cc58 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Audio/CustomFilter.php @@ -0,0 +1,52 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace FFMpeg\Filters\Audio; + +use FFMpeg\Format\AudioInterface; +use FFMpeg\Media\Audio; + +class CustomFilter implements AudioFilterInterface +{ + /** @var string */ + private $filter; + /** @var integer */ + private $priority; + + /** + * A custom filter, useful if you want to build complex filters + * + * @param string $filter + * @param int $priority + */ + public function __construct($filter, $priority = 0) + { + $this->filter = $filter; + $this->priority = $priority; + } + + /** + * {@inheritdoc} + */ + public function getPriority() + { + return $this->priority; + } + + /** + * {@inheritdoc} + */ + public function apply(Audio $audio, AudioInterface $format) + { + $commands = array('-af', $this->filter); + + return $commands; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Audio/SimpleFilter.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Audio/SimpleFilter.php new file mode 100644 index 0000000000..46639cd802 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Audio/SimpleFilter.php @@ -0,0 +1,43 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Filters\Audio; + +use FFMpeg\Media\Audio; +use FFMpeg\Format\AudioInterface; + +class SimpleFilter implements AudioFilterInterface +{ + private $params; + private $priority; + + public function __construct(array $params, $priority = 0) + { + $this->params = $params; + $this->priority = $priority; + } + + /** + * {@inheritdoc} + */ + public function getPriority() + { + return $this->priority; + } + + /** + * {@inheritdoc} + */ + public function apply(Audio $audio, AudioInterface $format) + { + return $this->params; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Concat/ConcatFilterInterface.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Concat/ConcatFilterInterface.php new file mode 100644 index 0000000000..33eea509ae --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Concat/ConcatFilterInterface.php @@ -0,0 +1,20 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Filters\Concat; + +use FFMpeg\Filters\FilterInterface; +use FFMpeg\Media\Concat; + +interface ConcatFilterInterface extends FilterInterface +{ + public function apply(Concat $concat); +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Concat/ConcatFilters.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Concat/ConcatFilters.php new file mode 100644 index 0000000000..5fe4e3e597 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Concat/ConcatFilters.php @@ -0,0 +1,24 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Filters\Concat; + +use FFMpeg\Media\Concat; + +class ConcatFilters +{ + private $concat; + + public function __construct(Concat $concat) + { + $this->concat = $concat; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/FilterInterface.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/FilterInterface.php new file mode 100644 index 0000000000..cb41d5151c --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/FilterInterface.php @@ -0,0 +1,22 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Filters; + +interface FilterInterface +{ + /** + * Returns the priority of the filter. + * + * @return integer + */ + public function getPriority(); +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/FiltersCollection.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/FiltersCollection.php new file mode 100644 index 0000000000..c91241a208 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/FiltersCollection.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 FFMpeg\Filters; + +class FiltersCollection implements \Countable, \IteratorAggregate +{ + private $sorted; + private $filters = array(); + + /** + * @param FilterInterface $filter + * + * @return FiltersCollection + */ + public function add(FilterInterface $filter) + { + $this->filters[$filter->getPriority()][] = $filter; + $this->sorted = null; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function count() + { + if (0 === count($this->filters)) { + return 0; + } + + return count(call_user_func_array('array_merge', $this->filters)); + } + + /** + * {@inheritdoc} + */ + public function getIterator() + { + if (null === $this->sorted) { + if (0 === count($this->filters)) { + $this->sorted = $this->filters; + } else { + krsort($this->filters); + $this->sorted = call_user_func_array('array_merge', $this->filters); + } + } + + return new \ArrayIterator($this->sorted); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Frame/CustomFrameFilter.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Frame/CustomFrameFilter.php new file mode 100644 index 0000000000..8ace0e9239 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Frame/CustomFrameFilter.php @@ -0,0 +1,54 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Filters\Frame; + +use FFMpeg\Exception\RuntimeException; +use FFMpeg\Media\Frame; + +class CustomFrameFilter implements FrameFilterInterface +{ + /** @var string */ + private $filter; + /** @var integer */ + private $priority; + + /** + * A custom filter, useful if you want to build complex filters + * + * @param string $filter + * @param int $priority + */ + public function __construct($filter, $priority = 0) + { + $this->filter = $filter; + $this->priority = $priority; + } + + /** + * {@inheritdoc} + */ + public function getPriority() + { + return $this->priority; + } + + /** + * {@inheritdoc} + */ + public function apply(Frame $frame) + { + $commands = array('-vf', $this->filter); + + return $commands; + } +} + diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Frame/DisplayRatioFixerFilter.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Frame/DisplayRatioFixerFilter.php new file mode 100644 index 0000000000..0cc3cea2e4 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Frame/DisplayRatioFixerFilter.php @@ -0,0 +1,58 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Filters\Frame; + +use FFMpeg\Exception\RuntimeException; +use FFMpeg\Media\Frame; + +class DisplayRatioFixerFilter implements FrameFilterInterface +{ + /** @var integer */ + private $priority; + + public function __construct($priority = 0) + { + $this->priority = $priority; + } + + /** + * {@inheritdoc} + */ + public function getPriority() + { + return $this->priority; + } + + /** + * {@inheritdoc} + */ + public function apply(Frame $frame) + { + $dimensions = null; + $commands = array(); + + foreach ($frame->getVideo()->getStreams() as $stream) { + if ($stream->isVideo()) { + try { + $dimensions = $stream->getDimensions(); + $commands[] = '-s'; + $commands[] = $dimensions->getWidth() . 'x' . $dimensions->getHeight(); + break; + } catch (RuntimeException $e) { + + } + } + } + + return $commands; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Frame/FrameFilterInterface.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Frame/FrameFilterInterface.php new file mode 100644 index 0000000000..d9df0e447f --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Frame/FrameFilterInterface.php @@ -0,0 +1,20 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Filters\Frame; + +use FFMpeg\Filters\FilterInterface; +use FFMpeg\Media\Frame; + +interface FrameFilterInterface extends FilterInterface +{ + public function apply(Frame $frame); +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Frame/FrameFilters.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Frame/FrameFilters.php new file mode 100644 index 0000000000..ad7e95ad4d --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Frame/FrameFilters.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 FFMpeg\Filters\Frame; + +use FFMpeg\Media\Frame; + +class FrameFilters +{ + private $frame; + + public function __construct(Frame $frame) + { + $this->frame = $frame; + } + + /** + * Fixes the display ratio of the output frame. + * + * In case the sample ratio and display ratio are different, image may be + * anamorphozed. This filter fixes this by specifying the output size. + * + * @return FrameFilters + */ + public function fixDisplayRatio() + { + $this->frame->addFilter(new DisplayRatioFixerFilter()); + + return $this; + } + + /** + * Applies a custom filter: -vf foo bar + * + * @param string $parameters + * + * @return FrameFilters + */ + public function custom($parameters) + { + $this->frame->addFilter(new CustomFrameFilter($parameters)); + + return $this; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Gif/GifFilterInterface.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Gif/GifFilterInterface.php new file mode 100644 index 0000000000..141bbad399 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Gif/GifFilterInterface.php @@ -0,0 +1,20 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Filters\Gif; + +use FFMpeg\Filters\FilterInterface; +use FFMpeg\Media\Gif; + +interface GifFilterInterface extends FilterInterface +{ + public function apply(Gif $gif); +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Gif/GifFilters.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Gif/GifFilters.php new file mode 100644 index 0000000000..9834c91421 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Gif/GifFilters.php @@ -0,0 +1,24 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Filters\Gif; + +use FFMpeg\Media\Gif; + +class GifFilters +{ + private $gif; + + public function __construct(Gif $gif) + { + $this->gif = $gif; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/ClipFilter.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/ClipFilter.php new file mode 100644 index 0000000000..5e015a821a --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/ClipFilter.php @@ -0,0 +1,72 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Filters\Video; + +use FFMpeg\Format\VideoInterface; +use FFMpeg\Media\Video; +use FFMpeg\Coordinate\TimeCode; + +class ClipFilter implements VideoFilterInterface +{ + /** @var TimeCode */ + private $start; + /** @var TimeCode */ + private $duration; + /** @var integer */ + private $priority; + + public function __construct(TimeCode $start, TimeCode $duration = null, $priority = 0) + { + $this->start = $start; + $this->duration = $duration; + $this->priority = $priority; + } + + /** + * {@inheritdoc} + */ + public function getPriority() + { + return $this->priority; + } + + /** + * @return TimeCode + */ + public function getStart() + { + return $this->start; + } + + /** + * @return TimeCode + */ + public function getDuration() + { + return $this->duration; + } + + /** + * {@inheritdoc} + */ + public function apply(Video $video, VideoInterface $format) + { + $commands = array('-ss', (string) $this->start); + + if ($this->duration !== null) { + $commands[] = '-t'; + $commands[] = (string) $this->duration; + } + + return $commands; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/CropFilter.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/CropFilter.php new file mode 100644 index 0000000000..06b2b9c1e1 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/CropFilter.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 FFMpeg\Filters\Video; + +use FFMpeg\Coordinate\Dimension; +use FFMpeg\Coordinate\Point; +use FFMpeg\Format\VideoInterface; +use FFMpeg\Media\Video; + +class CropFilter implements VideoFilterInterface +{ + /** @var integer */ + protected $priority; + /** @var Dimension */ + protected $dimension; + /** @var Point */ + protected $point; + + public function __construct(Point $point, Dimension $dimension, $priority = 0) + { + $this->priority = $priority; + $this->dimension = $dimension; + $this->point = $point; + } + + /** + * {@inheritdoc} + */ + public function getPriority() + { + return $this->priority; + } + + /** + * {@inheritdoc} + */ + public function apply(Video $video, VideoInterface $format) + { + foreach ($video->getStreams()->videos() as $stream) { + if ($stream->has('width') && $stream->has('height')) { + $stream->set('width', $this->dimension->getWidth()); + $stream->set('height', $this->dimension->getHeight()); + } + } + + return array( + '-filter:v', + 'crop=' . + $this->dimension->getWidth() .':' . $this->dimension->getHeight() . ':' . $this->point->getX() . ':' . $this->point->getY() + ); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/CustomFilter.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/CustomFilter.php new file mode 100644 index 0000000000..eb750793a2 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/CustomFilter.php @@ -0,0 +1,52 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace FFMpeg\Filters\Video; + +use FFMpeg\Format\VideoInterface; +use FFMpeg\Media\Video; + +class CustomFilter implements VideoFilterInterface +{ + /** @var string */ + private $filter; + /** @var integer */ + private $priority; + + /** + * A custom filter, useful if you want to build complex filters + * + * @param string $filter + * @param int $priority + */ + public function __construct($filter, $priority = 0) + { + $this->filter = $filter; + $this->priority = $priority; + } + + /** + * {@inheritdoc} + */ + public function getPriority() + { + return $this->priority; + } + + /** + * {@inheritdoc} + */ + public function apply(Video $video, VideoInterface $format) + { + $commands = array('-vf', $this->filter); + + return $commands; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/ExtractMultipleFramesFilter.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/ExtractMultipleFramesFilter.php new file mode 100644 index 0000000000..d2f79bb5fb --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/ExtractMultipleFramesFilter.php @@ -0,0 +1,146 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Filters\Video; + +use FFMpeg\Exception\InvalidArgumentException; +use FFMpeg\Exception\RuntimeException; +use FFMpeg\Media\Video; +use FFMpeg\Format\VideoInterface; + +class ExtractMultipleFramesFilter implements VideoFilterInterface +{ + /** will extract a frame every second */ + const FRAMERATE_EVERY_SEC = '1/1'; + /** will extract a frame every 2 seconds */ + const FRAMERATE_EVERY_2SEC = '1/2'; + /** will extract a frame every 5 seconds */ + const FRAMERATE_EVERY_5SEC = '1/5'; + /** will extract a frame every 10 seconds */ + const FRAMERATE_EVERY_10SEC = '1/10'; + /** will extract a frame every 30 seconds */ + const FRAMERATE_EVERY_30SEC = '1/30'; + /** will extract a frame every minute */ + const FRAMERATE_EVERY_60SEC = '1/60'; + + /** @var integer */ + private $priority; + private $frameRate; + private $destinationFolder; + private $frameFileType = 'jpg'; + + /** @var array */ + private static $supportedFrameFileTypes = ['jpg', 'jpeg', 'png']; + + public function __construct($frameRate = self::FRAMERATE_EVERY_SEC, $destinationFolder = __DIR__, $priority = 0) + { + $this->priority = $priority; + $this->frameRate = $frameRate; + + // Make sure that the destination folder has a trailing slash + if(strcmp( substr($destinationFolder, -1), "/") != 0) + $destinationFolder .= "/"; + + // Set the destination folder + $this->destinationFolder = $destinationFolder; + } + + /** + * @param string $frameFileType + * @throws \FFMpeg\Exception\InvalidArgumentException + * @return ExtractMultipleFramesFilter + */ + public function setFrameFileType($frameFileType) { + if (in_array($frameFileType, self::$supportedFrameFileTypes)) { + $this->frameFileType = $frameFileType; + return $this; + } + + throw new InvalidArgumentException('Invalid frame file type, use: ' . implode(',', self::$supportedFrameFileTypes)); + } + + /** + * {@inheritdoc} + */ + public function getPriority() + { + return $this->priority; + } + + /** + * {@inheritdoc} + */ + public function getFrameRate() + { + return $this->frameRate; + } + + /** + * {@inheritdoc} + */ + public function getDestinationFolder() + { + return $this->destinationFolder; + } + + /** + * {@inheritdoc} + */ + public function apply(Video $video, VideoInterface $format) + { + $commands = array(); + $duration = 0; + + try { + // Get the duration of the video + foreach ($video->getStreams()->videos() as $stream) { + if ($stream->has('duration')) { + $duration = $stream->get('duration'); + } + } + + // Get the number of frames per second we have to extract. + if(preg_match('/(\d+)(?:\s*)([\+\-\*\/])(?:\s*)(\d+)/', $this->frameRate, $matches) !== FALSE){ + $operator = $matches[2]; + + switch($operator){ + case '/': + $nbFramesPerSecond = $matches[1] / $matches[3]; + break; + + default: + throw new InvalidArgumentException('The frame rate is not a proper division: ' . $this->frameRate); + break; + } + } + + // Set the number of digits to use in the exported filenames + $nbImages = ceil( $duration * $nbFramesPerSecond ); + + if($nbImages < 100) + $nbDigitsInFileNames = "02"; + elseif($nbImages < 1000) + $nbDigitsInFileNames = "03"; + else + $nbDigitsInFileNames = "06"; + + // Set the parameters + $commands[] = '-vf'; + $commands[] = 'fps=' . $this->frameRate; + $commands[] = $this->destinationFolder . 'frame-%'.$nbDigitsInFileNames.'d.' . $this->frameFileType; + } + catch (RuntimeException $e) { + throw new RuntimeException('An error occured while extracting the frames: ' . $e->getMessage() . '. The code: ' . $e->getCode()); + } + + return $commands; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/FrameRateFilter.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/FrameRateFilter.php new file mode 100644 index 0000000000..3c3859c7d6 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/FrameRateFilter.php @@ -0,0 +1,82 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Filters\Video; + +use FFMpeg\Coordinate\FrameRate; +use FFMpeg\Media\Video; +use FFMpeg\Format\VideoInterface; + +class FrameRateFilter implements VideoFilterInterface +{ + private $rate; + private $gop; + private $priority; + + public function __construct(FrameRate $rate, $gop, $priority = 0) + { + $this->rate = $rate; + $this->gop = $gop; + $this->priority = $priority; + } + + /** + * {@inheritdoc} + */ + public function getPriority() + { + return $this->priority; + } + + /** + * Returns the frame rate. + * + * @return FrameRate + */ + public function getFrameRate() + { + return $this->rate; + } + + /** + * Returns the GOP size. + * + * @see https://wikipedia.org/wiki/Group_of_pictures + * + * @return Integer + */ + public function getGOP() + { + return $this->gop; + } + + /** + * {@inheritdoc} + */ + public function apply(Video $video, VideoInterface $format) + { + $commands = array('-r', $this->rate->getValue()); + + /** + * @see http://sites.google.com/site/linuxencoding/x264-ffmpeg-mapping + */ + if ($format->supportBFrames()) { + $commands[] = '-b_strategy'; + $commands[] = '1'; + $commands[] = '-bf'; + $commands[] = '3'; + $commands[] = '-g'; + $commands[] = $this->gop; + } + + return $commands; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/PadFilter.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/PadFilter.php new file mode 100644 index 0000000000..2d045c1f8f --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/PadFilter.php @@ -0,0 +1,100 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Filters\Video; + +use FFMpeg\Coordinate\Dimension; +use FFMpeg\Filters\AdvancedMedia\ComplexCompatibleFilter; +use FFMpeg\Format\VideoInterface; +use FFMpeg\Media\AdvancedMedia; +use FFMpeg\Media\Video; + +class PadFilter implements VideoFilterInterface, ComplexCompatibleFilter +{ + /** @var Dimension */ + private $dimension; + /** @var integer */ + private $priority; + + public function __construct(Dimension $dimension, $priority = 0) + { + $this->dimension = $dimension; + $this->priority = $priority; + } + + /** + * {@inheritdoc} + */ + public function getPriority() + { + return $this->priority; + } + + /** + * @return Dimension + */ + public function getDimension() + { + return $this->dimension; + } + + /** + * Get name of the filter. + * + * @return string + */ + public function getName() + { + return 'pad'; + } + + /** + * Get minimal version of ffmpeg starting with which this filter is supported. + * + * @return string + */ + public function getMinimalFFMpegVersion() + { + return '0.4.9'; + } + + /** + * {@inheritdoc} + */ + public function apply(Video $video, VideoInterface $format) + { + return $this->getCommands(); + } + + /** + * {@inheritdoc} + */ + public function applyComplex(AdvancedMedia $media) + { + return $this->getCommands(); + } + + /** + * @return array + */ + protected function getCommands() + { + $commands = array(); + + $commands[] = '-vf'; + $commands[] = 'scale=iw*min(' . $this->dimension->getWidth() . '/iw\,' . $this->dimension->getHeight() + . '/ih):ih*min(' . $this->dimension->getWidth() . '/iw\,' . $this->dimension->getHeight() . '/ih),pad=' + . $this->dimension->getWidth() . ':' . $this->dimension->getHeight() . ':(' . $this->dimension->getWidth() + . '-iw)/2:(' . $this->dimension->getHeight() . '-ih)/2'; + + return $commands; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/ResizeFilter.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/ResizeFilter.php new file mode 100644 index 0000000000..ab8ee03eaa --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/ResizeFilter.php @@ -0,0 +1,143 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Filters\Video; + +use FFMpeg\Coordinate\Dimension; +use FFMpeg\Exception\RuntimeException; +use FFMpeg\Media\Video; +use FFMpeg\Format\VideoInterface; + +class ResizeFilter implements VideoFilterInterface +{ + /** fits to the dimensions, might introduce anamorphosis */ + const RESIZEMODE_FIT = 'fit'; + /** resizes the video inside the given dimension, no anamorphosis */ + const RESIZEMODE_INSET = 'inset'; + /** resizes the video to fit the dimension width, no anamorphosis */ + const RESIZEMODE_SCALE_WIDTH = 'width'; + /** resizes the video to fit the dimension height, no anamorphosis */ + const RESIZEMODE_SCALE_HEIGHT = 'height'; + + /** @var Dimension */ + private $dimension; + /** @var string */ + private $mode; + /** @var Boolean */ + private $forceStandards; + /** @var integer */ + private $priority; + + public function __construct(Dimension $dimension, $mode = self::RESIZEMODE_FIT, $forceStandards = true, $priority = 0) + { + $this->dimension = $dimension; + $this->mode = $mode; + $this->forceStandards = $forceStandards; + $this->priority = $priority; + } + + /** + * {@inheritdoc} + */ + public function getPriority() + { + return $this->priority; + } + + /** + * @return Dimension + */ + public function getDimension() + { + return $this->dimension; + } + + /** + * @return string + */ + public function getMode() + { + return $this->mode; + } + + /** + * @return Boolean + */ + public function areStandardsForced() + { + return $this->forceStandards; + } + + /** + * {@inheritdoc} + */ + public function apply(Video $video, VideoInterface $format) + { + $dimensions = null; + $commands = array(); + + foreach ($video->getStreams() as $stream) { + if ($stream->isVideo()) { + try { + $dimensions = $stream->getDimensions(); + break; + } catch (RuntimeException $e) { + + } + } + } + + if (null !== $dimensions) { + $dimensions = $this->getComputedDimensions($dimensions, $format->getModulus()); + + // Using Filter to have ordering + $commands[] = '-vf'; + $commands[] = '[in]scale=' . $dimensions->getWidth() . ':' . $dimensions->getHeight() . ' [out]'; + + } + + return $commands; + } + + private function getComputedDimensions(Dimension $dimension, $modulus) + { + $originalRatio = $dimension->getRatio($this->forceStandards); + + switch ($this->mode) { + case self::RESIZEMODE_SCALE_WIDTH: + $height = $this->dimension->getHeight(); + $width = $originalRatio->calculateWidth($height, $modulus); + break; + case self::RESIZEMODE_SCALE_HEIGHT: + $width = $this->dimension->getWidth(); + $height = $originalRatio->calculateHeight($width, $modulus); + break; + case self::RESIZEMODE_INSET: + $targetRatio = $this->dimension->getRatio($this->forceStandards); + + if ($targetRatio->getValue() > $originalRatio->getValue()) { + $height = $this->dimension->getHeight(); + $width = $originalRatio->calculateWidth($height, $modulus); + } else { + $width = $this->dimension->getWidth(); + $height = $originalRatio->calculateHeight($width, $modulus); + } + break; + case self::RESIZEMODE_FIT: + default: + $width = $this->dimension->getWidth(); + $height = $this->dimension->getHeight(); + break; + } + + return new Dimension($width, $height); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/RotateFilter.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/RotateFilter.php new file mode 100644 index 0000000000..1ccfff574e --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/RotateFilter.php @@ -0,0 +1,82 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Filters\Video; + +use FFMpeg\Coordinate\Dimension; +use FFMpeg\Exception\InvalidArgumentException; +use FFMpeg\Media\Video; +use FFMpeg\Format\VideoInterface; + +class RotateFilter implements VideoFilterInterface +{ + const ROTATE_90 = 'transpose=1'; + const ROTATE_180 = 'hflip,vflip'; + const ROTATE_270 = 'transpose=2'; + + /** @var string */ + private $angle; + /** @var integer */ + private $priority; + + public function __construct($angle, $priority = 0) + { + $this->setAngle($angle); + $this->priority = (int) $priority; + } + + /** + * {@inheritdoc} + */ + public function getPriority() + { + return $this->priority; + } + + /** + * @return Dimension + */ + public function getAngle() + { + return $this->angle; + } + + /** + * {@inheritdoc} + */ + public function apply(Video $video, VideoInterface $format) + { + if (in_array($this->angle, array(self::ROTATE_90, self::ROTATE_270), true)) { + foreach ($video->getStreams()->videos() as $stream) { + if ($stream->has('width') && $stream->has('height')) { + $width = $stream->get('width'); + $stream->set('width', $stream->get('height')); + $stream->set('height', $width); + } + } + } + + return array('-vf', $this->angle, '-metadata:s:v:0', 'rotate=0'); + } + + private function setAngle($angle) + { + switch ($angle) { + case self::ROTATE_90: + case self::ROTATE_180: + case self::ROTATE_270: + $this->angle = $angle; + break; + default: + throw new InvalidArgumentException('Invalid angle value.'); + } + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/SynchronizeFilter.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/SynchronizeFilter.php new file mode 100644 index 0000000000..97a4043b3e --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/SynchronizeFilter.php @@ -0,0 +1,44 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Filters\Video; + +use FFMpeg\Format\VideoInterface; +use FFMpeg\Media\Video; + +/** + * Synchronizes audio and video in case of desynchronized movies. + */ +class SynchronizeFilter implements VideoFilterInterface +{ + private $priority; + + public function __construct($priority = 12) + { + $this->priority = $priority; + } + + /** + * {@inheritdoc} + */ + public function getPriority() + { + return $this->priority; + } + + /** + * {@inheritdoc} + */ + public function apply(Video $video, VideoInterface $format) + { + return array('-async', '1', '-metadata:s:v:0', 'start_time=0'); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/VideoFilterInterface.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/VideoFilterInterface.php new file mode 100644 index 0000000000..f4cbbcb29c --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/VideoFilterInterface.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Filters\Video; + +use FFMpeg\Filters\FilterInterface; +use FFMpeg\Format\VideoInterface; +use FFMpeg\Media\Video; + +interface VideoFilterInterface extends FilterInterface +{ + /** + * Applies the filter on the the Video media given an format. + * + * @param Video $video + * @param VideoInterface $format + * + * @return array An array of arguments + */ + public function apply(Video $video, VideoInterface $format); +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/VideoFilters.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/VideoFilters.php new file mode 100644 index 0000000000..92eaf60586 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/VideoFilters.php @@ -0,0 +1,178 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Filters\Video; + +use FFMpeg\Coordinate\Point; +use FFMpeg\Media\Video; +use FFMpeg\Coordinate\TimeCode; +use FFMpeg\Coordinate\Dimension; +use FFMpeg\Coordinate\FrameRate; +use FFMpeg\Filters\Audio\AudioResamplableFilter; +use FFMpeg\Filters\Audio\AudioFilters; + +class VideoFilters extends AudioFilters +{ + public function __construct(Video $media) + { + parent::__construct($media); + } + + /** + * Resizes a video to a given dimension. + * + * @param Dimension $dimension + * @param string $mode + * @param Boolean $forceStandards + * + * @return VideoFilters + */ + public function resize(Dimension $dimension, $mode = ResizeFilter::RESIZEMODE_FIT, $forceStandards = true) + { + $this->media->addFilter(new ResizeFilter($dimension, $mode, $forceStandards)); + + return $this; + } + + /** + * Changes the video framerate. + * + * @param FrameRate $framerate + * @param Integer $gop + * + * @return VideoFilters + */ + public function framerate(FrameRate $framerate, $gop) + { + $this->media->addFilter(new FrameRateFilter($framerate, $gop)); + + return $this; + } + + /** + * Extract multiple frames from the video + * + * @param string $frameRate + * @param string $destinationFolder + * + * @return $this + */ + public function extractMultipleFrames($frameRate = ExtractMultipleFramesFilter::FRAMERATE_EVERY_2SEC, $destinationFolder = __DIR__) + { + $this->media->addFilter(new ExtractMultipleFramesFilter($frameRate, $destinationFolder)); + + return $this; + } + + /** + * Synchronizes audio and video. + * + * @return VideoFilters + */ + public function synchronize() + { + $this->media->addFilter(new SynchronizeFilter()); + + return $this; + } + + /** + * Clips (cuts) the video. + * + * @param TimeCode $start + * @param TimeCode $duration + * + * @return VideoFilters + */ + public function clip($start, $duration = null) + { + $this->media->addFilter(new ClipFilter($start, $duration)); + + return $this; + } + + /** + * Resamples the audio file. + * + * @param Integer $rate + * + * @return AudioFilters + */ + public function audioResample($rate) + { + $this->media->addFilter(new AudioResamplableFilter($rate)); + + return $this; + } + + /** + * Adds padding (black bars) to a video. + * + * @param Dimension $dimension + * + * @return VideoFilters + */ + public function pad(Dimension $dimension) + { + $this->media->addFilter(new PadFilter($dimension)); + + return $this; + } + + public function rotate($angle) + { + $this->media->addFilter(new RotateFilter($angle, 30)); + + return $this; + } + + /** + * Crops the video + * + * @param Point $point + * @param Dimension $dimension + * + * @return VideoFilters + */ + public function crop(Point $point, Dimension $dimension) + { + $this->media->addFilter(new CropFilter($point, $dimension)); + + return $this; + } + + /** + * @param string $imagePath + * @param array $coordinates + * + * @return $this + */ + public function watermark($imagePath, array $coordinates = array()) + { + $this->media->addFilter(new WatermarkFilter($imagePath, $coordinates)); + + return $this; + } + + /** + * Applies a custom filter: -vf foo bar + * + * @param string $parameters + * + * @return VideoFilters + */ + public function custom($parameters) + { + $this->media->addFilter(new CustomFilter($parameters)); + + return $this; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/WatermarkFilter.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/WatermarkFilter.php new file mode 100644 index 0000000000..98d21c1ffc --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Video/WatermarkFilter.php @@ -0,0 +1,121 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Filters\Video; + +use FFMpeg\Exception\InvalidArgumentException; +use FFMpeg\Filters\AdvancedMedia\ComplexCompatibleFilter; +use FFMpeg\Format\VideoInterface; +use FFMpeg\Media\AdvancedMedia; +use FFMpeg\Media\Video; + +class WatermarkFilter implements VideoFilterInterface, ComplexCompatibleFilter +{ + /** @var string */ + private $watermarkPath; + /** @var array */ + private $coordinates; + /** @var integer */ + private $priority; + + public function __construct($watermarkPath, array $coordinates = array(), $priority = 0) + { + if (!file_exists($watermarkPath)) { + throw new InvalidArgumentException(sprintf('File %s does not exist', $watermarkPath)); + } + + $this->watermarkPath = $watermarkPath; + $this->coordinates = $coordinates; + $this->priority = $priority; + } + + /** + * {@inheritdoc} + */ + public function getPriority() + { + return $this->priority; + } + + /** + * Get name of the filter. + * + * @return string + */ + public function getName() + { + return 'watermark'; + } + + /** + * Get minimal version of ffmpeg starting with which this filter is supported. + * + * @return string + */ + public function getMinimalFFMpegVersion() + { + return '0.8'; + } + + /** + * {@inheritdoc} + */ + public function apply(Video $video, VideoInterface $format) + { + return $this->getCommands(); + } + + /** + * {@inheritdoc} + */ + public function applyComplex(AdvancedMedia $media) + { + return $this->getCommands(); + } + + /** + * @return array + */ + protected function getCommands() + { + $position = isset($this->coordinates['position']) ? $this->coordinates['position'] : 'absolute'; + + switch ($position) { + case 'relative': + if (isset($this->coordinates['top'])) { + $y = $this->coordinates['top']; + } elseif (isset($this->coordinates['bottom'])) { + $y = 'main_h - ' . $this->coordinates['bottom'] . ' - overlay_h'; + } else { + $y = 0; + } + + if (isset($this->coordinates['left'])) { + $x = $this->coordinates['left']; + } elseif (isset($this->coordinates['right'])) { + $x = 'main_w - ' . $this->coordinates['right'] . ' - overlay_w'; + } else { + $x = 0; + } + + break; + default: + $x = isset($this->coordinates['x']) ? $this->coordinates['x'] : 0; + $y = isset($this->coordinates['y']) ? $this->coordinates['y'] : 0; + break; + } + + return array( + '-vf', + 'movie=' . $this->watermarkPath . ' [watermark]; [in][watermark] overlay=' . $x . ':' . $y . ' [out]', + ); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Waveform/WaveformDownmixFilter.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Waveform/WaveformDownmixFilter.php new file mode 100644 index 0000000000..367e947090 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Waveform/WaveformDownmixFilter.php @@ -0,0 +1,74 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Filters\Waveform; + +use FFMpeg\Exception\RuntimeException; +use FFMpeg\Media\Waveform; + +class WaveformDownmixFilter implements WaveformFilterInterface +{ + + /** @var boolean */ + private $downmix; + /** @var integer */ + private $priority; + + // By default, the downmix value is set to FALSE. + public function __construct($downmix = FALSE, $priority = 0) + { + $this->downmix = $downmix; + $this->priority = $priority; + } + + /** + * {@inheritdoc} + */ + public function getDownmix() + { + return $this->downmix; + } + + /** + * {@inheritdoc} + */ + public function getPriority() + { + return $this->priority; + } + + /** + * {@inheritdoc} + */ + public function apply(Waveform $waveform) + { + $commands = array(); + + foreach ($waveform->getAudio()->getStreams() as $stream) { + if ($stream->isAudio()) { + try { + + // If the downmix parameter is set to TRUE, we add an option to the FFMPEG command + if($this->downmix == TRUE) { + $commands[] = '"aformat=channel_layouts=mono"'; + } + + break; + + } catch (RuntimeException $e) { + + } + } + } + + return $commands; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Waveform/WaveformFilterInterface.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Waveform/WaveformFilterInterface.php new file mode 100644 index 0000000000..51e69bc899 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Waveform/WaveformFilterInterface.php @@ -0,0 +1,20 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Filters\Waveform; + +use FFMpeg\Filters\FilterInterface; +use FFMpeg\Media\Waveform; + +interface WaveformFilterInterface extends FilterInterface +{ + public function apply(Waveform $waveform); +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Waveform/WaveformFilters.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Waveform/WaveformFilters.php new file mode 100644 index 0000000000..6be9068fa7 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Filters/Waveform/WaveformFilters.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 FFMpeg\Filters\Waveform; + +use FFMpeg\Media\Waveform; + +class WaveformFilters +{ + private $waveform; + + public function __construct(Waveform $waveform) + { + $this->waveform = $waveform; + } + + /** + * Sets the downmix of the output waveform. + * + * If you want a simpler waveform, sets the downmix to TRUE. + * + * @return WaveformFilters + */ + public function setDownmix() + { + $this->waveform->addFilter(new WaveformDownmixFilter()); + + return $this; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Audio/Aac.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Audio/Aac.php new file mode 100644 index 0000000000..a9eebde0b3 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Audio/Aac.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 FFMpeg\Format\Audio; + +/** + * The AAC audio format + */ +class Aac extends DefaultAudio +{ + public function __construct() + { + $this->audioCodec = 'libfdk_aac'; + } + + /** + * {@inheritDoc} + */ + public function getAvailableAudioCodecs() + { + return array('libfdk_aac'); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Audio/DefaultAudio.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Audio/DefaultAudio.php new file mode 100644 index 0000000000..03e855c229 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Audio/DefaultAudio.php @@ -0,0 +1,142 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Format\Audio; + +use Evenement\EventEmitter; +use FFMpeg\Exception\InvalidArgumentException; +use FFMpeg\Format\AudioInterface; +use FFMpeg\Media\MediaTypeInterface; +use FFMpeg\Format\ProgressableInterface; +use FFMpeg\Format\ProgressListener\AudioProgressListener; +use FFMpeg\FFProbe; + +abstract class DefaultAudio extends EventEmitter implements AudioInterface, ProgressableInterface +{ + /** @var string */ + protected $audioCodec; + + /** @var integer */ + protected $audioKiloBitrate = 128; + + /** @var integer */ + protected $audioChannels = null; + + /** + * {@inheritdoc} + */ + public function getExtraParams() + { + return array(); + } + + /** + * {@inheritdoc} + */ + public function getAudioCodec() + { + return $this->audioCodec; + } + + /** + * Sets the audio codec, Should be in the available ones, otherwise an + * exception is thrown. + * + * @param string $audioCodec + * + * @throws InvalidArgumentException + */ + public function setAudioCodec($audioCodec) + { + if ( ! in_array($audioCodec, $this->getAvailableAudioCodecs())) { + throw new InvalidArgumentException(sprintf( + 'Wrong audiocodec value for %s, available formats are %s' + , $audioCodec, implode(', ', $this->getAvailableAudioCodecs()) + )); + } + + $this->audioCodec = $audioCodec; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getAudioKiloBitrate() + { + return $this->audioKiloBitrate; + } + + /** + * Sets the kiloBitrate value. + * + * @param integer $kiloBitrate + * @throws InvalidArgumentException + */ + public function setAudioKiloBitrate($kiloBitrate) + { + if ($kiloBitrate < 1) { + throw new InvalidArgumentException('Wrong kiloBitrate value'); + } + + $this->audioKiloBitrate = (int) $kiloBitrate; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getAudioChannels() + { + return $this->audioChannels; + } + + /** + * Sets the channels value. + * + * @param integer $channels + * @throws InvalidArgumentException + */ + public function setAudioChannels($channels) + { + if ($channels < 1) { + throw new InvalidArgumentException('Wrong channels value'); + } + + $this->audioChannels = (int) $channels; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function createProgressListener(MediaTypeInterface $media, FFProbe $ffprobe, $pass, $total, $duration = 0) + { + $format = $this; + $listener = new AudioProgressListener($ffprobe, $media->getPathfile(), $pass, $total, $duration); + $listener->on('progress', function () use ($media, $format) { + $format->emit('progress', array_merge(array($media, $format), func_get_args())); + }); + + return array($listener); + } + + /** + * {@inheritDoc} + */ + public function getPasses() + { + return 1; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Audio/Flac.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Audio/Flac.php new file mode 100644 index 0000000000..28a71973ad --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Audio/Flac.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 FFMpeg\Format\Audio; + +/** + * The Flac audio format + */ +class Flac extends DefaultAudio +{ + public function __construct() + { + $this->audioCodec = 'flac'; + } + + /** + * {@inheritDoc} + */ + public function getAvailableAudioCodecs() + { + return array('flac'); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Audio/Mp3.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Audio/Mp3.php new file mode 100644 index 0000000000..4cd86f5e79 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Audio/Mp3.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 FFMpeg\Format\Audio; + +/** + * The MP3 audio format + */ +class Mp3 extends DefaultAudio +{ + public function __construct() + { + $this->audioCodec = 'libmp3lame'; + } + + /** + * {@inheritDoc} + */ + public function getAvailableAudioCodecs() + { + return array('libmp3lame'); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Audio/Vorbis.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Audio/Vorbis.php new file mode 100644 index 0000000000..fd241fddc1 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Audio/Vorbis.php @@ -0,0 +1,39 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Format\Audio; + +/** + * The Vorbis audio format + */ +class Vorbis extends DefaultAudio +{ + public function __construct() + { + $this->audioCodec = 'vorbis'; + } + + /** + * {@inheritdoc} + */ + public function getExtraParams() + { + return array('-strict', '-2'); + } + + /** + * {@inheritDoc} + */ + public function getAvailableAudioCodecs() + { + return array('vorbis'); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Audio/Wav.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Audio/Wav.php new file mode 100644 index 0000000000..86705992a5 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Audio/Wav.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 FFMpeg\Format\Audio; + +/** + * The WAV audio format + */ +class Wav extends DefaultAudio +{ + public function __construct() + { + $this->audioCodec = 'pcm_s16le'; + } + + /** + * {@inheritDoc} + */ + public function getAvailableAudioCodecs() + { + return array('pcm_s16le'); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/AudioInterface.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/AudioInterface.php new file mode 100644 index 0000000000..1af29c0d36 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/AudioInterface.php @@ -0,0 +1,42 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace FFMpeg\Format; + +interface AudioInterface extends FormatInterface +{ + /** + * Gets the audio kiloBitrate value. + * + * @return integer + */ + public function getAudioKiloBitrate(); + + /** + * Gets the audio channels value. + * + * @return integer + */ + public function getAudioChannels(); + + /** + * Returns the audio codec. + * + * @return string + */ + public function getAudioCodec(); + + /** + * Returns the list of available audio codecs for this format. + * + * @return array + */ + public function getAvailableAudioCodecs(); +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/FormatInterface.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/FormatInterface.php new file mode 100644 index 0000000000..979a09177d --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/FormatInterface.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace FFMpeg\Format; + +interface FormatInterface +{ + /** + * Returns the number of passes. + * + * @return string + */ + public function getPasses(); + + /** + * Returns an array of extra parameters to add to ffmpeg commandline. + * + * @return array() + */ + public function getExtraParams(); +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/FrameInterface.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/FrameInterface.php new file mode 100644 index 0000000000..77a27ab920 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/FrameInterface.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Format; + +interface FrameInterface extends FormatInterface +{ +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/ProgressListener/AbstractProgressListener.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/ProgressListener/AbstractProgressListener.php new file mode 100644 index 0000000000..26eaf553dc --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/ProgressListener/AbstractProgressListener.php @@ -0,0 +1,262 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Format\ProgressListener; + +use Alchemy\BinaryDriver\Listeners\ListenerInterface; +use Evenement\EventEmitter; +use FFMpeg\FFProbe; +use FFMpeg\Exception\RuntimeException; + +/** + * @author Robert Gruendler + */ +abstract class AbstractProgressListener extends EventEmitter implements ListenerInterface +{ + /** @var integer */ + private $duration; + + /** @var integer */ + private $totalSize; + + /** @var integer */ + private $currentSize; + + /** @var integer */ + private $currentTime; + + /** @var double */ + private $lastOutput = null; + + /** @var FFProbe */ + private $ffprobe; + + /** @var string */ + private $pathfile; + + /** @var Boolean */ + private $initialized = false; + + /** @var integer */ + private $currentPass; + + /** @var integer */ + private $totalPass; + + /** + * Transcoding rate in kb/s + * + * @var integer + */ + private $rate; + + /** + * Percentage of transcoding progress (0 - 100) + * + * @var integer + */ + private $percent = 0; + + /** + * Time remaining (seconds) + * + * @var integer + */ + private $remaining = null; + + /** + * @param FFProbe $ffprobe + * @param string $pathfile + * @param integer $currentPass The cureent pass number + * @param integer $totalPass The total number of passes + * + * @throws RuntimeException + */ + public function __construct(FFProbe $ffprobe, $pathfile, $currentPass, $totalPass, $duration = 0) + { + $this->ffprobe = $ffprobe; + $this->pathfile = $pathfile; + $this->currentPass = $currentPass; + $this->totalPass = $totalPass; + $this->duration = $duration; + } + + /** + * @return FFProbe + */ + public function getFFProbe() + { + return $this->ffprobe; + } + + /** + * @return string + */ + public function getPathfile() + { + return $this->pathfile; + } + + /** + * @return integer + */ + public function getCurrentPass() + { + return $this->currentPass; + } + + /** + * @return integer + */ + public function getTotalPass() + { + return $this->totalPass; + } + + /** + * @return int + */ + public function getCurrentTime() + { + return $this->currentTime; + } + + /** + * {@inheritdoc} + */ + public function handle($type, $data) + { + if (null !== $progress = $this->parseProgress($data)) { + $this->emit('progress', array_values($progress)); + } + } + + /** + * {@inheritdoc} + */ + public function forwardedEvents() + { + return array(); + } + + /** + * Get the regex pattern to match a ffmpeg stderr status line + */ + abstract protected function getPattern(); + + /** + * @param string $progress A ffmpeg stderr progress output + * + * @return array the progressinfo array or null if there's no progress available yet. + */ + private function parseProgress($progress) + { + if (!$this->initialized) { + $this->initialize(); + } + + if (null === $this->totalSize || null === $this->duration) { + return; + } + + $matches = array(); + + if (preg_match($this->getPattern(), $progress, $matches) !== 1) { + return null; + } + + $currentDuration = $this->convertDuration($matches[2]); + $currentTime = microtime(true); + $currentSize = trim(str_replace('kb', '', strtolower(($matches[1])))); + $percent = max(0, min(1, $currentDuration / $this->duration)); + + if ($this->lastOutput !== null) { + $delta = $currentTime - $this->lastOutput; + + // Check the type of the currentSize variable and convert it to an integer if needed. + if(!is_numeric($currentSize)) { + $currentSize = (int)$currentSize; + } + + $deltaSize = $currentSize - $this->currentSize; + $rate = $deltaSize * $delta; + if ($rate > 0) { + $totalDuration = $this->totalSize / $rate; + $this->remaining = floor($totalDuration - ($totalDuration * $percent)); + $this->rate = floor($rate); + } else { + $this->remaining = 0; + $this->rate = 0; + } + } + + $percent = $percent / $this->totalPass + ($this->currentPass - 1) / $this->totalPass; + + $this->percent = floor($percent * 100); + $this->lastOutput = $currentTime; + $this->currentSize = (int) $currentSize; + $this->currentTime = $currentDuration; + + return $this->getProgressInfo(); + } + + /** + * + * @param string $rawDuration in the format 00:00:00.00 + * @return number + */ + private function convertDuration($rawDuration) + { + $ar = array_reverse(explode(":", $rawDuration)); + $duration = floatval($ar[0]); + if (!empty($ar[1])) { + $duration += intval($ar[1]) * 60; + } + if (!empty($ar[2])) { + $duration += intval($ar[2]) * 60 * 60; + } + + return $duration; + } + + /** + * @return array + */ + private function getProgressInfo() + { + if ($this->remaining === null) { + return null; + } + + return array( + 'percent' => $this->percent, + 'remaining' => $this->remaining, + 'rate' => $this->rate + ); + } + + private function initialize() + { + try { + $format = $this->ffprobe->format($this->pathfile); + } catch (RuntimeException $e) { + return; + } + + if (false === $format->has('size') || false === $format->has('duration')) { + return; + } + + $this->duration = (int) $this->duration > 0 ? $this->duration : $format->get('duration'); + $this->totalSize = $format->get('size') / 1024 * ($this->duration / $format->get('duration')); + $this->initialized = true; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/ProgressListener/AudioProgressListener.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/ProgressListener/AudioProgressListener.php new file mode 100644 index 0000000000..7fbb0bb1a1 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/ProgressListener/AudioProgressListener.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Format\ProgressListener; + +/** + * Parses ffmpeg stderr progress information. An example: + * + *
+ *       size=    3552kB time=00:03:47.29 bitrate= 128.0kbits/s
+ * 
+ * + * @author Robert Gruendler + */ +class AudioProgressListener extends AbstractProgressListener +{ + public function getPattern() + { + return '/size=(.*?) time=(.*?) /'; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/ProgressListener/VideoProgressListener.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/ProgressListener/VideoProgressListener.php new file mode 100644 index 0000000000..6bfa4a1d47 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/ProgressListener/VideoProgressListener.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Format\ProgressListener; + +/** + * Parses ffmpeg stderr progress information for video files. An example: + * + *
+ *       frame=  171 fps=0.0 q=10.0 size=      18kB time=00:00:05.72 bitrate=  26.4kbits/s dup=8 drop=0
+ * 
+ * + * @author Robert Gruendler + */ +class VideoProgressListener extends AbstractProgressListener +{ + public function getPattern() + { + return '/size=(.*?) time=(.*?) /'; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/ProgressableInterface.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/ProgressableInterface.php new file mode 100644 index 0000000000..497849ce67 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/ProgressableInterface.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Format; + +use Evenement\EventEmitterInterface; +use FFMpeg\FFProbe; +use FFMpeg\Media\MediaTypeInterface; + +interface ProgressableInterface extends EventEmitterInterface +{ + /** + * Creates the progress listener. + * + * @param MediaTypeInterface $media + * @param FFProbe $ffprobe + * @param Integer $pass The current pas snumber + * @param Integer $total The total pass number + * @param Integer $duration The new video duration + * + * @return array An array of listeners + */ + public function createProgressListener(MediaTypeInterface $media, FFProbe $ffprobe, $pass, $total, $duration = 0); +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Video/DefaultVideo.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Video/DefaultVideo.php new file mode 100644 index 0000000000..d45eaf8879 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Video/DefaultVideo.php @@ -0,0 +1,169 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Format\Video; + +use FFMpeg\FFProbe; +use FFMpeg\Exception\InvalidArgumentException; +use FFMpeg\Format\Audio\DefaultAudio; +use FFMpeg\Format\VideoInterface; +use FFMpeg\Media\MediaTypeInterface; +use FFMpeg\Format\ProgressListener\VideoProgressListener; + +/** + * The abstract default Video format + */ +abstract class DefaultVideo extends DefaultAudio implements VideoInterface +{ + /** @var string */ + protected $videoCodec; + + /** @var Integer */ + protected $kiloBitrate = 1000; + + /** @var Integer */ + protected $modulus = 16; + + /** @var Array */ + protected $additionalParamaters; + + /** @var Array */ + protected $initialParamaters; + + /** + * {@inheritdoc} + */ + public function getKiloBitrate() + { + return $this->kiloBitrate; + } + + /** + * Sets the kiloBitrate value. + * + * @param integer $kiloBitrate + * @throws InvalidArgumentException + */ + public function setKiloBitrate($kiloBitrate) + { + if ($kiloBitrate < 1) { + throw new InvalidArgumentException('Wrong kiloBitrate value'); + } + + $this->kiloBitrate = (int) $kiloBitrate; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getVideoCodec() + { + return $this->videoCodec; + } + + /** + * Sets the video codec, Should be in the available ones, otherwise an + * exception is thrown. + * + * @param string $videoCodec + * @throws InvalidArgumentException + */ + public function setVideoCodec($videoCodec) + { + if ( ! in_array($videoCodec, $this->getAvailableVideoCodecs())) { + throw new InvalidArgumentException(sprintf( + 'Wrong videocodec value for %s, available formats are %s' + , $videoCodec, implode(', ', $this->getAvailableVideoCodecs()) + )); + } + + $this->videoCodec = $videoCodec; + + return $this; + } + + /** + * @return integer + */ + public function getModulus() + { + return $this->modulus; + } + + /** + * {@inheritdoc} + */ + public function getAdditionalParameters() + { + return $this->additionalParamaters; + } + + /** + * Sets additional parameters. + * + * @param array $additionalParamaters + * @throws InvalidArgumentException + */ + public function setAdditionalParameters($additionalParamaters) + { + if (!is_array($additionalParamaters)) { + throw new InvalidArgumentException('Wrong additionalParamaters value'); + } + + $this->additionalParamaters = $additionalParamaters; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getInitialParameters() + { + return $this->initialParamaters; + } + + /** + * Sets initial parameters. + * + * @param array $initialParamaters + * @throws InvalidArgumentException + */ + public function setInitialParameters($initialParamaters) + { + if (!is_array($initialParamaters)) { + throw new InvalidArgumentException('Wrong initialParamaters value'); + } + + $this->initialParamaters = $initialParamaters; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function createProgressListener(MediaTypeInterface $media, FFProbe $ffprobe, $pass, $total, $duration = 0) + { + $format = $this; + $listeners = array(new VideoProgressListener($ffprobe, $media->getPathfile(), $pass, $total, $duration)); + + foreach ($listeners as $listener) { + $listener->on('progress', function () use ($format, $media) { + $format->emit('progress', array_merge(array($media, $format), func_get_args())); + }); + } + + return $listeners; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Video/Ogg.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Video/Ogg.php new file mode 100644 index 0000000000..b67fd686a2 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Video/Ogg.php @@ -0,0 +1,49 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Format\Video; + +/** + * The Ogg video format + */ +class Ogg extends DefaultVideo +{ + public function __construct($audioCodec = 'libvorbis', $videoCodec = 'libtheora') + { + $this + ->setAudioCodec($audioCodec) + ->setVideoCodec($videoCodec); + } + + /** + * {@inheritDoc} + */ + public function supportBFrames() + { + return true; + } + + /** + * {@inheritDoc} + */ + public function getAvailableAudioCodecs() + { + return array('libvorbis'); + } + + /** + * {@inheritDoc} + */ + public function getAvailableVideoCodecs() + { + return array('libtheora'); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Video/WMV.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Video/WMV.php new file mode 100644 index 0000000000..56c170e6c5 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Video/WMV.php @@ -0,0 +1,49 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Format\Video; + +/** + * The WMV video format + */ +class WMV extends DefaultVideo +{ + public function __construct($audioCodec = 'wmav2', $videoCodec = 'wmv2') + { + $this + ->setAudioCodec($audioCodec) + ->setVideoCodec($videoCodec); + } + + /** + * {@inheritDoc} + */ + public function supportBFrames() + { + return false; + } + + /** + * {@inheritDoc} + */ + public function getAvailableAudioCodecs() + { + return array('wmav2'); + } + + /** + * {@inheritDoc} + */ + public function getAvailableVideoCodecs() + { + return array('wmv2'); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Video/WMV3.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Video/WMV3.php new file mode 100644 index 0000000000..575936ee12 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Video/WMV3.php @@ -0,0 +1,49 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Format\Video; + +/** + * The WMV video format + */ +class WMV3 extends DefaultVideo +{ + public function __construct($audioCodec = 'wmav3', $videoCodec = 'wmv3') + { + $this + ->setAudioCodec($audioCodec) + ->setVideoCodec($videoCodec); + } + + /** + * {@inheritDoc} + */ + public function supportBFrames() + { + return false; + } + + /** + * {@inheritDoc} + */ + public function getAvailableAudioCodecs() + { + return array('wmav3'); + } + + /** + * {@inheritDoc} + */ + public function getAvailableVideoCodecs() + { + return array('wmv3'); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Video/WebM.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Video/WebM.php new file mode 100644 index 0000000000..59bab2085d --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Video/WebM.php @@ -0,0 +1,57 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Format\Video; + +/** + * The WebM video format + */ +class WebM extends DefaultVideo +{ + public function __construct($audioCodec = 'libvorbis', $videoCodec = 'libvpx') + { + $this + ->setAudioCodec($audioCodec) + ->setVideoCodec($videoCodec); + } + + /** + * {@inheritDoc} + */ + public function supportBFrames() + { + return true; + } + + /** + * {@inheritDoc} + */ + public function getExtraParams() + { + return array('-f', 'webm'); + } + + /** + * {@inheritDoc} + */ + public function getAvailableAudioCodecs() + { + return array('copy', 'libvorbis'); + } + + /** + * {@inheritDoc} + */ + public function getAvailableVideoCodecs() + { + return array('libvpx', 'libvpx-vp9'); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Video/X264.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Video/X264.php new file mode 100644 index 0000000000..54968591c2 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/Video/X264.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 FFMpeg\Format\Video; + +/** + * The X264 video format + */ +class X264 extends DefaultVideo +{ + /** @var boolean */ + private $bframesSupport = true; + + /** @var integer */ + private $passes = 2; + + public function __construct($audioCodec = 'libfaac', $videoCodec = 'libx264') + { + $this + ->setAudioCodec($audioCodec) + ->setVideoCodec($videoCodec); + } + + /** + * {@inheritDoc} + */ + public function supportBFrames() + { + return $this->bframesSupport; + } + + /** + * @param $support + * + * @return X264 + */ + public function setBFramesSupport($support) + { + $this->bframesSupport = $support; + + return $this; + } + + /** + * {@inheritDoc} + */ + public function getAvailableAudioCodecs() + { + return array('copy', 'aac', 'libvo_aacenc', 'libfaac', 'libmp3lame', 'libfdk_aac'); + } + + /** + * {@inheritDoc} + */ + public function getAvailableVideoCodecs() + { + return array('libx264'); + } + + /** + * @param $passes + * + * @return X264 + */ + public function setPasses($passes) + { + $this->passes = $passes; + return $this; + } + + /** + * {@inheritDoc} + */ + public function getPasses() + { + return $this->passes; + } + + /** + * @return int + */ + public function getModulus() + { + return 2; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/VideoInterface.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/VideoInterface.php new file mode 100644 index 0000000000..262045675b --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Format/VideoInterface.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 FFMpeg\Format; + +interface VideoInterface extends AudioInterface +{ + /** + * Gets the kiloBitrate value. + * + * @return integer + */ + public function getKiloBitrate(); + + /** + * Returns the modulus used by the Resizable video. + * + * This used to calculate the target dimensions while maintaining the best + * aspect ratio. + * + * @see http://www.undeadborn.net/tools/rescalculator.php + * + * @return integer + */ + public function getModulus(); + + /** + * Returns the video codec. + * + * @return string + */ + public function getVideoCodec(); + + /** + * Returns true if the current format supports B-Frames. + * + * @see https://wikipedia.org/wiki/Video_compression_picture_types + * + * @return Boolean + */ + public function supportBFrames(); + + /** + * Returns the list of available video codecs for this format. + * + * @return array + */ + public function getAvailableVideoCodecs(); + + /** + * Returns the list of additional parameters for this format. + * + * @return array + */ + public function getAdditionalParameters(); + + /** + * Returns the list of initial parameters for this format + * + * @return array + */ + public function getInitialParameters(); +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/AbstractMediaType.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/AbstractMediaType.php new file mode 100644 index 0000000000..5523c0bfc0 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/AbstractMediaType.php @@ -0,0 +1,113 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Media; + +use FFMpeg\Driver\FFMpegDriver; +use FFMpeg\FFProbe; +use FFMpeg\Filters\FiltersCollection; + +abstract class AbstractMediaType implements MediaTypeInterface +{ + /** @var string */ + protected $pathfile; + /** @var FFMpegDriver */ + protected $driver; + /** @var FFProbe */ + protected $ffprobe; + /** @var FiltersCollection */ + protected $filters; + + public function __construct($pathfile, FFMpegDriver $driver, FFProbe $ffprobe) + { + $this->pathfile = $pathfile; + $this->driver = $driver; + $this->ffprobe = $ffprobe; + $this->filters = new FiltersCollection(); + } + + /** + * @return FFMpegDriver + */ + public function getFFMpegDriver() + { + return $this->driver; + } + + /** + * @param FFMpegDriver $driver + * + * @return MediaTypeInterface + */ + public function setFFMpegDriver(FFMpegDriver $driver) + { + $this->driver = $driver; + + return $this; + } + + /** + * @return FFProbe + */ + public function getFFProbe() + { + return $this->ffprobe; + } + + /** + * @param FFProbe $ffprobe + * + * @return MediaTypeInterface + */ + public function setFFProbe(FFProbe $ffprobe) + { + $this->ffprobe = $ffprobe; + + return $this; + } + + /** + * @return string + */ + public function getPathfile() + { + return $this->pathfile; + } + + /** + * @param FiltersCollection $filters + * + * @return MediaTypeInterface + */ + public function setFiltersCollection(FiltersCollection $filters) + { + $this->filters = $filters; + + return $this; + } + + /** + * @return MediaTypeInterface + */ + public function getFiltersCollection() + { + return $this->filters; + } + + protected function cleanupTemporaryFile($filename) + { + if (file_exists($filename) && is_writable($filename)) { + unlink($filename); + } + + return $this; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/AbstractStreamableMedia.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/AbstractStreamableMedia.php new file mode 100644 index 0000000000..a28b277d03 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/AbstractStreamableMedia.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Media; + +use FFMpeg\FFProbe\DataMapping\Format; +use FFMpeg\FFProbe\DataMapping\StreamCollection; + +abstract class AbstractStreamableMedia extends AbstractMediaType +{ + private $streams; + + /** + * @return StreamCollection + */ + public function getStreams() + { + if (null === $this->streams) { + $this->streams = $this->ffprobe->streams($this->pathfile); + } + + return $this->streams; + } + + /** + * @return Format + */ + public function getFormat() + { + return $this->ffprobe->format($this->pathfile); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/AbstractVideo.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/AbstractVideo.php new file mode 100644 index 0000000000..339e4dace6 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/AbstractVideo.php @@ -0,0 +1,307 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace FFMpeg\Media; + +use Alchemy\BinaryDriver\Exception\ExecutionFailureException; +use FFMpeg\Filters\Audio\SimpleFilter; +use FFMpeg\Exception\InvalidArgumentException; +use FFMpeg\Exception\RuntimeException; +use FFMpeg\Filters\Video\VideoFilters; +use FFMpeg\Filters\FilterInterface; +use FFMpeg\Format\FormatInterface; +use FFMpeg\Format\ProgressableInterface; +use FFMpeg\Format\AudioInterface; +use FFMpeg\Format\VideoInterface; +use Neutron\TemporaryFilesystem\Manager as FsManager; +use FFMpeg\Filters\Video\ClipFilter; + +abstract class AbstractVideo extends Audio +{ + + /** + * FileSystem Manager instance + * @var Manager + */ + protected $fs; + + /** + * FileSystem Manager ID + * @var int + */ + protected $fsId; + + /** + * @inheritDoc + * @return VideoFilters + */ + public function filters() + { + return new VideoFilters($this); + } + + /** + * @inheritDoc + * @return Video + */ + public function addFilter(FilterInterface $filter) + { + $this->filters->add($filter); + + return $this; + } + + /** + * Exports the video in the desired format, applies registered filters. + * + * @param FormatInterface $format + * @param string $outputPathfile + * @return Video + * @throws RuntimeException + */ + public function save(FormatInterface $format, $outputPathfile) + { + $passes = $this->buildCommand($format, $outputPathfile); + + $failure = null; + $totalPasses = $format->getPasses(); + + foreach ($passes as $pass => $passCommands) { + try { + /** add listeners here */ + $listeners = null; + + if ($format instanceof ProgressableInterface) { + $filters = clone $this->filters; + $duration = 0; + + // check the filters of the video, and if the video has the ClipFilter then + // take the new video duration and send to the + // FFMpeg\Format\ProgressListener\AbstractProgressListener class + foreach ($filters as $filter) { + if ($filter instanceof ClipFilter) { + $duration = $filter->getDuration()->toSeconds(); + break; + } + } + $listeners = $format->createProgressListener($this, $this->ffprobe, $pass + 1, $totalPasses, $duration); + } + + $this->driver->command($passCommands, false, $listeners); + } catch (ExecutionFailureException $e) { + $failure = $e; + break; + } + } + + $this->fs->clean($this->fsId); + + if (null !== $failure) { + throw new RuntimeException('Encoding failed', $failure->getCode(), $failure); + } + + return $this; + } + + /** + * NOTE: This method is different to the Audio's one, because Video is using passes. + * @inheritDoc + */ + public function getFinalCommand(FormatInterface $format, $outputPathfile) + { + $finalCommands = array(); + + foreach ($this->buildCommand($format, $outputPathfile) as $pass => $passCommands) { + $finalCommands[] = implode(' ', $passCommands); + } + + $this->fs->clean($this->fsId); + + return $finalCommands; + } + + /** + * **NOTE:** This creates passes instead of a single command! + * + * @inheritDoc + * @return string[][] + */ + protected function buildCommand(FormatInterface $format, $outputPathfile) + { + $commands = $this->basePartOfCommand($format); + + $filters = clone $this->filters; + $filters->add(new SimpleFilter($format->getExtraParams(), 10)); + + if ($this->driver->getConfiguration()->has('ffmpeg.threads')) { + $filters->add(new SimpleFilter(array('-threads', $this->driver->getConfiguration()->get('ffmpeg.threads')))); + } + if ($format instanceof VideoInterface) { + if (null !== $format->getVideoCodec()) { + $filters->add(new SimpleFilter(array('-vcodec', $format->getVideoCodec()))); + } + } + if ($format instanceof AudioInterface) { + if (null !== $format->getAudioCodec()) { + $filters->add(new SimpleFilter(array('-acodec', $format->getAudioCodec()))); + } + } + + foreach ($filters as $filter) { + $commands = array_merge($commands, $filter->apply($this, $format)); + } + + if ($format instanceof VideoInterface) { + $commands[] = '-b:v'; + $commands[] = $format->getKiloBitrate() . 'k'; + $commands[] = '-refs'; + $commands[] = '6'; + $commands[] = '-coder'; + $commands[] = '1'; + $commands[] = '-sc_threshold'; + $commands[] = '40'; + $commands[] = '-flags'; + $commands[] = '+loop'; + $commands[] = '-me_range'; + $commands[] = '16'; + $commands[] = '-subq'; + $commands[] = '7'; + $commands[] = '-i_qfactor'; + $commands[] = '0.71'; + $commands[] = '-qcomp'; + $commands[] = '0.6'; + $commands[] = '-qdiff'; + $commands[] = '4'; + $commands[] = '-trellis'; + $commands[] = '1'; + } + + if ($format instanceof AudioInterface) { + if (null !== $format->getAudioKiloBitrate()) { + $commands[] = '-b:a'; + $commands[] = $format->getAudioKiloBitrate() . 'k'; + } + if (null !== $format->getAudioChannels()) { + $commands[] = '-ac'; + $commands[] = $format->getAudioChannels(); + } + } + + // If the user passed some additional parameters + if ($format instanceof VideoInterface) { + if (null !== $format->getAdditionalParameters()) { + foreach ($format->getAdditionalParameters() as $additionalParameter) { + $commands[] = $additionalParameter; + } + } + } + + // Merge Filters into one command + $videoFilterVars = $videoFilterProcesses = array(); + for ($i = 0; $i < count($commands); $i++) { + $command = $commands[$i]; + if ($command === '-vf') { + $commandSplits = explode(";", $commands[$i + 1]); + if (count($commandSplits) == 1) { + $commandSplit = $commandSplits[0]; + $command = trim($commandSplit); + if (preg_match("/^\[in\](.*?)\[out\]$/is", $command, $match)) { + $videoFilterProcesses[] = $match[1]; + } else { + $videoFilterProcesses[] = $command; + } + } else { + foreach ($commandSplits as $commandSplit) { + $command = trim($commandSplit); + if (preg_match("/^\[[^\]]+\](.*?)\[[^\]]+\]$/is", $command, $match)) { + $videoFilterProcesses[] = $match[1]; + } else { + $videoFilterVars[] = $command; + } + } + } + unset($commands[$i]); + unset($commands[$i + 1]); + $i++; + } + } + $videoFilterCommands = $videoFilterVars; + $lastInput = 'in'; + foreach ($videoFilterProcesses as $i => $process) { + $command = '[' . $lastInput . ']'; + $command .= $process; + $lastInput = 'p' . $i; + if ($i === (count($videoFilterProcesses) - 1)) { + $command .= '[out]'; + } else { + $command .= '[' . $lastInput . ']'; + } + + $videoFilterCommands[] = $command; + } + $videoFilterCommand = implode(';', $videoFilterCommands); + + if ($videoFilterCommand) { + $commands[] = '-vf'; + $commands[] = $videoFilterCommand; + } + + $this->fs = FsManager::create(); + $this->fsId = uniqid('ffmpeg-passes'); + $passPrefix = $this->fs->createTemporaryDirectory(0777, 50, $this->fsId) . '/' . uniqid('pass-'); + $passes = array(); + $totalPasses = $format->getPasses(); + + if (!$totalPasses) { + throw new InvalidArgumentException('Pass number should be a positive value.'); + } + + for ($i = 1; $i <= $totalPasses; $i++) { + $pass = $commands; + + if ($totalPasses > 1) { + $pass[] = '-pass'; + $pass[] = $i; + $pass[] = '-passlogfile'; + $pass[] = $passPrefix; + } + + $pass[] = $outputPathfile; + + $passes[] = $pass; + } + + return $passes; + } + + /** + * Return base part of command. + * + * @param FormatInterface $format + * @return array + */ + protected function basePartOfCommand(FormatInterface $format) + { + $commands = array('-y'); + + // If the user passed some initial parameters + if ($format instanceof VideoInterface) { + if (null !== $format->getInitialParameters()) { + foreach ($format->getInitialParameters() as $initialParameter) { + $commands[] = $initialParameter; + } + } + } + + $commands[] = '-i'; + $commands[] = $this->pathfile; + + return $commands; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/AdvancedMedia.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/AdvancedMedia.php new file mode 100644 index 0000000000..8524f49771 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/AdvancedMedia.php @@ -0,0 +1,424 @@ + 0) { + $pathfile = $inputs[$inputsKeys[0]]; + } + + parent::__construct($pathfile, $driver, $ffprobe); + $this->filters = new FiltersCollection(); + $this->inputs = $inputs; + $this->initialParameters = array(); + $this->additionalParameters = array(); + $this->mapCommands = array(); + $this->listeners = array(); + } + + /** + * Returns the available filters. + * + * @return ComplexFilters + */ + public function filters() + { + return new ComplexFilters($this); + } + + /** + * Add complex filter. + * + * @param string $in + * @param ComplexCompatibleFilter $filter + * @param string $out + * + * @return $this + */ + public function addFilter($in, ComplexCompatibleFilter $filter, $out) + { + $this->filters->add(new ComplexFilterContainer($in, $filter, $out)); + return $this; + } + + /** + * @inheritDoc + */ + public function setFiltersCollection(FiltersCollection $filters) + { + foreach ($filters as $filter) { + if (!($filter instanceof ComplexFilterInterface)) { + throw new RuntimeException ('For AdvancedMedia you can set filters collection' + . ' contains only objects that implement ComplexFilterInterface!'); + } + } + + return parent::setFiltersCollection($filters); + } + + /** + * @return string[] + */ + public function getInitialParameters() + { + return $this->initialParameters; + } + + /** + * @param string[] $initialParameters + * + * @return AdvancedMedia + */ + public function setInitialParameters(array $initialParameters) + { + $this->initialParameters = $initialParameters; + return $this; + } + + /** + * @return string[] + */ + public function getAdditionalParameters() + { + return $this->additionalParameters; + } + + /** + * @param string[] $additionalParameters + * + * @return AdvancedMedia + */ + public function setAdditionalParameters(array $additionalParameters) + { + $this->additionalParameters = $additionalParameters; + return $this; + } + + /** + * @return string[] + */ + public function getInputs() + { + return $this->inputs; + } + + /** + * @return int + */ + public function getInputsCount() + { + return count($this->inputs); + } + + /** + * @return string + */ + public function getFinalCommand() + { + return implode(' ', $this->buildCommand()); + } + + /** + * Select the streams for output. + * + * @param string[] $outs Output labels of the -filter_complex part. + * @param FormatInterface $format Format of the output file. + * @param string $outputFilename Output filename. + * @param bool $forceDisableAudio + * @param bool $forceDisableVideo + * + * @return $this + * @see https://ffmpeg.org/ffmpeg.html#Manual-stream-selection + */ + public function map( + array $outs, + FormatInterface $format, + $outputFilename, + $forceDisableAudio = false, + $forceDisableVideo = false + ) { + $commands = array(); + foreach ($outs as $label) { + $commands[] = '-map'; + $commands[] = $label; + } + + // Apply format params. + $commands = array_merge($commands, + $this->applyFormatParams($format, $forceDisableAudio, $forceDisableVideo)); + + // Set output file. + $commands[] = $outputFilename; + + // Create a listener. + if ($format instanceof ProgressableInterface) { + $listener = $format->createProgressListener($this, $this->ffprobe, 1, 1, 0); + $this->listeners = array_merge($this->listeners, $listener); + } + + $this->mapCommands = array_merge($this->mapCommands, $commands); + return $this; + } + + /** + * Apply added filters and execute ffmpeg command. + * + * @return void + * @throws RuntimeException + */ + public function save() + { + $this->assertFiltersAreCompatibleToCurrentFFMpegVersion(); + $command = $this->buildCommand(); + + try { + $this->driver->command($command, false, $this->listeners); + } catch (ExecutionFailureException $e) { + throw new RuntimeException('Encoding failed', $e->getCode(), $e); + } + } + + /** + * @param FormatInterface $format + * @param bool $forceDisableAudio + * @param bool $forceDisableVideo + * + * @return array + */ + private function applyFormatParams( + FormatInterface $format, + $forceDisableAudio = false, + $forceDisableVideo = false + ) { + // Set format params. + $commands = array(); + if (!$forceDisableVideo && $format instanceof VideoInterface) { + if ($format->getVideoCodec() !== null) { + $commands[] = '-vcodec'; + $commands[] = $format->getVideoCodec(); + } + // If the user passed some additional format parameters. + if ($format->getAdditionalParameters() !== null) { + $commands = array_merge($commands, $format->getAdditionalParameters()); + } + } + if (!$forceDisableAudio && $format instanceof AudioInterface) { + if ($format->getAudioCodec() !== null) { + $commands[] = '-acodec'; + $commands[] = $format->getAudioCodec(); + } + if ($format->getAudioKiloBitrate() !== null) { + $commands[] = '-b:a'; + $commands[] = $format->getAudioKiloBitrate() . 'k'; + } + if ($format->getAudioChannels() !== null) { + $commands[] = '-ac'; + $commands[] = $format->getAudioChannels(); + } + } + + // If the user passed some extra parameters. + if ($format->getExtraParams()) { + $commands = array_merge($commands, $format->getExtraParams()); + } + + return $commands; + } + + /** + * @param ComplexFilterInterface $filter + * + * @return string + */ + private function applyComplexFilter(ComplexFilterInterface $filter) + { + /** @var $format VideoInterface */ + $filterCommands = $filter->applyComplex($this); + foreach ($filterCommands as $index => $command) { + if ($command === '-vf' || $command === '-filter:v' || $command === '-filter_complex') { + unset ($filterCommands[$index]); + } + } + + $strCommand = implode(' ', $filterCommands); + + // Compatibility with the some existed filters: + // If the command contains [in], just replace it to inLabel. If not - to add it manually. + if (stripos($strCommand, '[in]') !== false) { + $strCommand = str_replace('[in]', $filter->getInLabels(), $strCommand); + $in = ''; + } else { + $in = $filter->getInLabels(); + } + + // If the command contains [out], just replace it to outLabel. If not - to add it manually. + if (stripos($strCommand, '[out]') !== false) { + $strCommand = str_replace('[out]', $filter->getOutLabels(), $strCommand); + $out = ''; + } else { + $out = $filter->getOutLabels(); + } + + return $in . $strCommand . $out; + } + + /** + * @return void + * @throws RuntimeException + */ + protected function assertFiltersAreCompatibleToCurrentFFMpegVersion() + { + $messages = array(); + $currentVersion = $this->getFFMpegDriver()->getVersion(); + /** @var ComplexFilterInterface $filter */ + foreach ($this->filters as $filter) { + if (version_compare($currentVersion, $filter->getMinimalFFMpegVersion(), '<')) { + $messages[] = $filter->getName() . ' filter is supported starting from ' + . $filter->getMinimalFFMpegVersion() . ' ffmpeg version'; + } + } + + if (!empty($messages)) { + throw new RuntimeException(implode('; ', $messages) + . '; your ffmpeg version is ' . $currentVersion); + } + } + + /** + * @return array + */ + protected function buildCommand() + { + $globalOptions = array('threads', 'filter_threads', 'filter_complex_threads'); + return array_merge(array('-y'), + $this->buildConfiguredGlobalOptions($globalOptions), + $this->getInitialParameters(), + $this->buildInputsPart($this->inputs), + $this->buildComplexFilterPart($this->filters), + $this->mapCommands, + $this->getAdditionalParameters() + ); + } + + /** + * @param string[] $optionNames + * + * @return array + */ + private function buildConfiguredGlobalOptions($optionNames) + { + $commands = array(); + foreach ($optionNames as $optionName) { + if (!$this->driver->getConfiguration()->has('ffmpeg.' . $optionName)) { + continue; + } + + $commands[] = '-' . $optionName; + $commands[] = $this->driver->getConfiguration()->get('ffmpeg.' . $optionName); + } + + return $commands; + } + + /** + * Build inputs part of the ffmpeg command. + * + * @param string[] $inputs + * + * @return array + */ + private function buildInputsPart(array $inputs) + { + $commands = array(); + foreach ($inputs as $input) { + $commands[] = '-i'; + $commands[] = $input; + } + + return $commands; + } + + /** + * Build "-filter_complex" part of the ffmpeg command. + * + * @param FiltersCollection $complexFilters + * + * @return array + */ + private function buildComplexFilterPart(FiltersCollection $complexFilters) + { + $commands = array(); + /** @var ComplexFilterInterface $filter */ + foreach ($complexFilters as $filter) { + $filterCommand = $this->applyComplexFilter($filter); + $commands[] = $filterCommand; + } + + if (empty($commands)) { + return array(); + } + return array('-filter_complex', implode(';', $commands)); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/Audio.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/Audio.php new file mode 100644 index 0000000000..124460bafb --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/Audio.php @@ -0,0 +1,153 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Media; + +use Alchemy\BinaryDriver\Exception\ExecutionFailureException; +use FFMpeg\Filters\Audio\AudioFilters; +use FFMpeg\Format\FormatInterface; +use FFMpeg\Filters\Audio\SimpleFilter; +use FFMpeg\Exception\RuntimeException; +use FFMpeg\Exception\InvalidArgumentException; +use FFMpeg\Filters\Audio\AudioFilterInterface; +use FFMpeg\Filters\FilterInterface; +use FFMpeg\Format\ProgressableInterface; + +class Audio extends AbstractStreamableMedia +{ + /** + * {@inheritdoc} + * + * @return AudioFilters + */ + public function filters() + { + return new AudioFilters($this); + } + + /** + * {@inheritdoc} + * + * @return Audio + */ + public function addFilter(FilterInterface $filter) + { + if (!$filter instanceof AudioFilterInterface) { + throw new InvalidArgumentException('Audio only accepts AudioFilterInterface filters'); + } + + $this->filters->add($filter); + + return $this; + } + + /** + * Exports the audio in the desired format, applies registered filters. + * + * @param FormatInterface $format + * @param string $outputPathfile + * @return Audio + * @throws RuntimeException + */ + public function save(FormatInterface $format, $outputPathfile) + { + $listeners = null; + + if ($format instanceof ProgressableInterface) { + $listeners = $format->createProgressListener($this, $this->ffprobe, 1, 1, 0); + } + + $commands = $this->buildCommand($format, $outputPathfile); + + try { + $this->driver->command($commands, false, $listeners); + } catch (ExecutionFailureException $e) { + $this->cleanupTemporaryFile($outputPathfile); + throw new RuntimeException('Encoding failed', $e->getCode(), $e); + } + + return $this; + } + + /** + * Returns the final command as a string, useful for debugging purposes. + * + * @param FormatInterface $format + * @param string $outputPathfile + * @return string + * @since 0.11.0 + */ + public function getFinalCommand(FormatInterface $format, $outputPathfile) { + return implode(' ', $this->buildCommand($format, $outputPathfile)); + } + + /** + * Builds the command which will be executed with the provided format + * + * @param FormatInterface $format + * @param string $outputPathfile + * @return string[] An array which are the components of the command + * @since 0.11.0 + */ + protected function buildCommand(FormatInterface $format, $outputPathfile) { + $commands = array('-y', '-i', $this->pathfile); + + $filters = clone $this->filters; + $filters->add(new SimpleFilter($format->getExtraParams(), 10)); + + if ($this->driver->getConfiguration()->has('ffmpeg.threads')) { + $filters->add(new SimpleFilter(array('-threads', $this->driver->getConfiguration()->get('ffmpeg.threads')))); + } + if (null !== $format->getAudioCodec()) { + $filters->add(new SimpleFilter(array('-acodec', $format->getAudioCodec()))); + } + + foreach ($filters as $filter) { + $commands = array_merge($commands, $filter->apply($this, $format)); + } + + if (null !== $format->getAudioKiloBitrate()) { + $commands[] = '-b:a'; + $commands[] = $format->getAudioKiloBitrate() . 'k'; + } + if (null !== $format->getAudioChannels()) { + $commands[] = '-ac'; + $commands[] = $format->getAudioChannels(); + } + $commands[] = $outputPathfile; + + return $commands; + } + + /** + * Gets the waveform of the video. + * + * @param integer $width + * @param integer $height + * @param array $colors Array of colors for ffmpeg to use. Color format is #000000 (RGB hex string with #) + * @return Waveform + */ + public function waveform($width = 640, $height = 120, $colors = array(Waveform::DEFAULT_COLOR)) + { + return new Waveform($this, $this->driver, $this->ffprobe, $width, $height, $colors); + } + + /** + * Concatenates a list of audio files into one unique audio file. + * + * @param array $sources + * @return Concat + */ + public function concat($sources) + { + return new Concat($sources, $this->driver, $this->ffprobe); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/Clip.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/Clip.php new file mode 100644 index 0000000000..095794cbca --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/Clip.php @@ -0,0 +1,62 @@ +start = $start; + $this->duration = $duration; + $this->video = $video; + + parent::__construct($video->getPathfile(), $driver, $ffprobe); + } + + /** + * Returns the video related to the frame. + * + * @param FormatInterface $format + * @return Video + */ + public function getVideo() + { + return $this->video; + } + + /** + * Return base part of command. + * + * @return array + */ + protected function basePartOfCommand(FormatInterface $format) + { + $arr = array('-y', '-ss', (string) $this->start, '-i', $this->pathfile); + + if (is_null($this->duration) === false) { + $arr[] = '-t'; + $arr[] = (string) $this->duration; + } + + return $arr; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/Concat.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/Concat.php new file mode 100644 index 0000000000..29126fd073 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/Concat.php @@ -0,0 +1,265 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Media; + +use Alchemy\BinaryDriver\Exception\ExecutionFailureException; +use Alchemy\BinaryDriver\Exception\InvalidArgumentException; +use FFMpeg\Filters\Concat\ConcatFilterInterface; +use FFMpeg\Filters\Concat\ConcatFilters; +use FFMpeg\Driver\FFMpegDriver; +use FFMpeg\FFProbe; +use FFMpeg\Filters\Audio\SimpleFilter; +use FFMpeg\Exception\RuntimeException; +use FFMpeg\Format\FormatInterface; +use FFMpeg\Filters\FilterInterface; +use FFMpeg\Format\ProgressableInterface; +use FFMpeg\Format\AudioInterface; +use FFMpeg\Format\VideoInterface; +use Neutron\TemporaryFilesystem\Manager as FsManager; + +class Concat extends AbstractMediaType +{ + /** @var array */ + private $sources; + + public function __construct($sources, FFMpegDriver $driver, FFProbe $ffprobe) + { + parent::__construct($sources, $driver, $ffprobe); + $this->sources = $sources; + } + + /** + * Returns the path to the sources. + * + * @return string + */ + public function getSources() + { + return $this->sources; + } + + /** + * {@inheritdoc} + * + * @return ConcatFilters + */ + public function filters() + { + return new ConcatFilters($this); + } + + /** + * {@inheritdoc} + * + * @return Concat + */ + public function addFilter(ConcatFilterInterface $filter) + { + $this->filters->add($filter); + + return $this; + } + + /** + * Saves the concatenated video in the given array, considering that the sources videos are all encoded with the same codec. + * + * @param string $outputPathfile + * @param bool $streamCopy + * + * @return Concat + * + * @throws RuntimeException + */ + public function saveFromSameCodecs($outputPathfile, $streamCopy = TRUE) + { + /** + * @see https://ffmpeg.org/ffmpeg-formats.html#concat + * @see https://trac.ffmpeg.org/wiki/Concatenate + */ + + // Create the file which will contain the list of videos + $fs = FsManager::create(); + $sourcesFile = $fs->createTemporaryFile('ffmpeg-concat'); + + // Set the content of this file + $fileStream = @fopen($sourcesFile, 'w'); + + if($fileStream === false) { + throw new RuntimeException('Cannot open the temporary file.'); + } + + $count_videos = 0; + if(is_array($this->sources) && (count($this->sources) > 0)) { + foreach ($this->sources as $videoPath) { + $line = ""; + + if($count_videos != 0) + $line .= "\n"; + + $line .= "file " . addcslashes($videoPath, '\'"\\\0 '); + + fwrite($fileStream, $line); + + $count_videos++; + } + } + else { + throw new InvalidArgumentException('The list of videos is not a valid array.'); + } + fclose($fileStream); + + + $commands = array( + '-f', 'concat', '-safe', '0', + '-i', $sourcesFile + ); + + // Check if stream copy is activated + if($streamCopy === TRUE) { + $commands[] = '-c'; + $commands[] = 'copy'; + } + + // If not, we can apply filters + else { + foreach ($this->filters as $filter) { + $commands = array_merge($commands, $filter->apply($this)); + } + } + + // Set the output file in the command + $commands = array_merge($commands, array($outputPathfile)); + + // Execute the command + try { + $this->driver->command($commands); + } catch (ExecutionFailureException $e) { + $this->cleanupTemporaryFile($outputPathfile); + // TODO@v1: paste this line into an `finally` block. + $this->cleanupTemporaryFile($sourcesFile); + throw new RuntimeException('Unable to save concatenated video', $e->getCode(), $e); + } + + $this->cleanupTemporaryFile($sourcesFile); + return $this; + } + + /** + * Saves the concatenated video in the given filename, considering that the sources videos are all encoded with the same codec. + * + * @param string $outputPathfile + * + * @return Concat + * + * @throws RuntimeException + */ + public function saveFromDifferentCodecs(FormatInterface $format, $outputPathfile) + { + /** + * @see https://ffmpeg.org/ffmpeg-formats.html#concat + * @see https://trac.ffmpeg.org/wiki/Concatenate + */ + + // Check the validity of the parameter + if(!is_array($this->sources) || (count($this->sources) == 0)) { + throw new InvalidArgumentException('The list of videos is not a valid array.'); + } + + // Create the commands variable + $commands = array(); + + // Prepare the parameters + $nbSources = 0; + $files = array(); + + // For each source, check if this is a legit file + // and prepare the parameters + foreach ($this->sources as $videoPath) { + $files[] = '-i'; + $files[] = $videoPath; + $nbSources++; + } + + $commands = array_merge($commands, $files); + + // Set the parameters of the request + $commands[] = '-filter_complex'; + + $complex_filter = ''; + for($i=0; $i<$nbSources; $i++) { + $complex_filter .= '['.$i.':v:0] ['.$i.':a:0] '; + } + $complex_filter .= 'concat=n='.$nbSources.':v=1:a=1 [v] [a]'; + + $commands[] = $complex_filter; + $commands[] = '-map'; + $commands[] = '[v]'; + $commands[] = '-map'; + $commands[] = '[a]'; + + // Prepare the filters + $filters = clone $this->filters; + $filters->add(new SimpleFilter($format->getExtraParams(), 10)); + + if ($this->driver->getConfiguration()->has('ffmpeg.threads')) { + $filters->add(new SimpleFilter(array('-threads', $this->driver->getConfiguration()->get('ffmpeg.threads')))); + } + if ($format instanceof VideoInterface) { + if (null !== $format->getVideoCodec()) { + $filters->add(new SimpleFilter(array('-vcodec', $format->getVideoCodec()))); + } + } + if ($format instanceof AudioInterface) { + if (null !== $format->getAudioCodec()) { + $filters->add(new SimpleFilter(array('-acodec', $format->getAudioCodec()))); + } + } + + // Add the filters + foreach ($this->filters as $filter) { + $commands = array_merge($commands, $filter->apply($this)); + } + + if ($format instanceof AudioInterface) { + if (null !== $format->getAudioKiloBitrate()) { + $commands[] = '-b:a'; + $commands[] = $format->getAudioKiloBitrate() . 'k'; + } + if (null !== $format->getAudioChannels()) { + $commands[] = '-ac'; + $commands[] = $format->getAudioChannels(); + } + } + + // If the user passed some additional parameters + if ($format instanceof VideoInterface) { + if (null !== $format->getAdditionalParameters()) { + foreach ($format->getAdditionalParameters() as $additionalParameter) { + $commands[] = $additionalParameter; + } + } + } + + // Set the output file in the command + $commands[] = $outputPathfile; + + $failure = null; + + try { + $this->driver->command($commands); + } catch (ExecutionFailureException $e) { + throw new RuntimeException('Encoding failed', $e->getCode(), $e); + } + + return $this; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/Frame.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/Frame.php new file mode 100644 index 0000000000..21499f9c62 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/Frame.php @@ -0,0 +1,135 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Media; + +use Alchemy\BinaryDriver\Exception\ExecutionFailureException; +use FFMpeg\Filters\Frame\FrameFilterInterface; +use FFMpeg\Filters\Frame\FrameFilters; +use FFMpeg\Driver\FFMpegDriver; +use FFMpeg\FFProbe; +use FFMpeg\Exception\RuntimeException; +use FFMpeg\Coordinate\TimeCode; + +class Frame extends AbstractMediaType +{ + /** @var TimeCode */ + private $timecode; + /** @var Video */ + private $video; + + public function __construct(Video $video, FFMpegDriver $driver, FFProbe $ffprobe, TimeCode $timecode) + { + parent::__construct($video->getPathfile(), $driver, $ffprobe); + $this->timecode = $timecode; + $this->video = $video; + } + + /** + * Returns the video related to the frame. + * + * @return Video + */ + public function getVideo() + { + return $this->video; + } + + /** + * {@inheritdoc} + * + * @return FrameFilters + */ + public function filters() + { + return new FrameFilters($this); + } + + /** + * {@inheritdoc} + * + * @return Frame + */ + public function addFilter(FrameFilterInterface $filter) + { + $this->filters->add($filter); + + return $this; + } + + /** + * @return TimeCode + */ + public function getTimeCode() + { + return $this->timecode; + } + + /** + * Saves the frame in the given filename. + * + * Uses the `unaccurate method by default.` + * + * @param string $pathfile + * @param Boolean $accurate + * + * @return Frame + * + * @throws RuntimeException + */ + public function save($pathfile, $accurate = false, $returnBase64 = false) + { + /** + * might be optimized with http://ffmpeg.org/trac/ffmpeg/wiki/Seeking%20with%20FFmpeg + * @see http://ffmpeg.org/ffmpeg.html#Main-options + */ + $outputFormat = $returnBase64 ? "image2pipe" : "image2"; + if (!$accurate) { + $commands = array( + '-y', '-ss', (string) $this->timecode, + '-i', $this->pathfile, + '-vframes', '1', + '-f', $outputFormat + ); + } else { + $commands = array( + '-y', '-i', $this->pathfile, + '-vframes', '1', '-ss', (string) $this->timecode, + '-f', $outputFormat + ); + } + + if($returnBase64) { + array_push($commands, "-"); + } + + foreach ($this->filters as $filter) { + $commands = array_merge($commands, $filter->apply($this)); + } + + if (!$returnBase64) { + $commands = array_merge($commands, array($pathfile)); + } + + try { + if(!$returnBase64) { + $this->driver->command($commands); + return $this; + } + else { + return $this->driver->command($commands); + } + } catch (ExecutionFailureException $e) { + $this->cleanupTemporaryFile($pathfile); + throw new RuntimeException('Unable to save frame', $e->getCode(), $e); + } + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/Gif.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/Gif.php new file mode 100644 index 0000000000..67c640b8a7 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/Gif.php @@ -0,0 +1,137 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Media; + +use Alchemy\BinaryDriver\Exception\ExecutionFailureException; +use FFMpeg\Filters\Gif\GifFilterInterface; +use FFMpeg\Filters\Gif\GifFilters; +use FFMpeg\Driver\FFMpegDriver; +use FFMpeg\FFProbe; +use FFMpeg\Exception\RuntimeException; +use FFMpeg\Coordinate\TimeCode; +use FFMpeg\Coordinate\Dimension; + +class Gif extends AbstractMediaType +{ + /** @var TimeCode */ + private $timecode; + /** @var Dimension */ + private $dimension; + /** @var integer */ + private $duration; + /** @var Video */ + private $video; + + public function __construct(Video $video, FFMpegDriver $driver, FFProbe $ffprobe, TimeCode $timecode, Dimension $dimension, $duration = null) + { + parent::__construct($video->getPathfile(), $driver, $ffprobe); + $this->timecode = $timecode; + $this->dimension = $dimension; + $this->duration = $duration; + $this->video = $video; + } + + /** + * Returns the video related to the gif. + * + * @return Video + */ + public function getVideo() + { + return $this->video; + } + + /** + * {@inheritdoc} + * + * @return GifFilters + */ + public function filters() + { + return new GifFilters($this); + } + + /** + * {@inheritdoc} + * + * @return Gif + */ + public function addFilter(GifFilterInterface $filter) + { + $this->filters->add($filter); + + return $this; + } + + /** + * @return TimeCode + */ + public function getTimeCode() + { + return $this->timecode; + } + + /** + * @return Dimension + */ + public function getDimension() + { + return $this->dimension; + } + + /** + * Saves the gif in the given filename. + * + * @param string $pathfile + * + * @return Gif + * + * @throws RuntimeException + */ + public function save($pathfile) + { + /** + * @see http://ffmpeg.org/ffmpeg.html#Main-options + */ + $commands = array( + '-ss', (string)$this->timecode + ); + + if(null !== $this->duration) { + $commands[] = '-t'; + $commands[] = (string)$this->duration; + } + + $commands[] = '-i'; + $commands[] = $this->pathfile; + $commands[] = '-vf'; + $commands[] = 'scale=' . $this->dimension->getWidth() . ':-1'; + $commands[] = '-gifflags'; + $commands[] = '+transdiff'; + $commands[] = '-y'; + + foreach ($this->filters as $filter) { + $commands = array_merge($commands, $filter->apply($this)); + } + + $commands = array_merge($commands, array($pathfile)); + + try { + $this->driver->command($commands); + } catch (ExecutionFailureException $e) { + $this->cleanupTemporaryFile($pathfile); + throw new RuntimeException('Unable to save gif', $e->getCode(), $e); + } + + return $this; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/MediaTypeInterface.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/MediaTypeInterface.php new file mode 100644 index 0000000000..93cd05d01d --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/MediaTypeInterface.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 FFMpeg\Media; + +interface MediaTypeInterface +{ + /** + * Returns the available filters. + */ + public function filters(); + + /** + * @return string + */ + public function getPathfile(); +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/Video.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/Video.php new file mode 100644 index 0000000000..ef69a03e07 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/Video.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 FFMpeg\Media; + +use FFMpeg\Coordinate\TimeCode; +use FFMpeg\Coordinate\Dimension; + +class Video extends AbstractVideo +{ + + /** + * Gets the frame at timecode. + * + * @param TimeCode $at + * @return Frame + */ + public function frame(TimeCode $at) + { + return new Frame($this, $this->driver, $this->ffprobe, $at); + } + + /** + * Extracts a gif from a sequence of the video. + * + * @param TimeCode $at + * @param Dimension $dimension + * @param integer $duration + * @return Gif + */ + public function gif(TimeCode $at, Dimension $dimension, $duration = null) + { + return new Gif($this, $this->driver, $this->ffprobe, $at, $dimension, $duration); + } + + /** + * Concatenates a list of videos into one unique video. + * + * @param array $sources + * @return Concat + */ + public function concat($sources) + { + return new Concat($sources, $this->driver, $this->ffprobe); + } + + /** + * Clips the video at the given time(s). + * + * @param TimeCode $start Start time + * @param TimeCode $duration Duration + * @return \FFMpeg\Media\Clip + */ + public function clip(TimeCode $start, TimeCode $duration = null) + { + return new Clip($this, $this->driver, $this->ffprobe, $start, $duration); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/Waveform.php b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/Waveform.php new file mode 100644 index 0000000000..94f1907f92 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/Waveform.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 FFMpeg\Media; + +use Alchemy\BinaryDriver\Exception\ExecutionFailureException; +use FFMpeg\Exception\InvalidArgumentException; +use FFMpeg\Filters\Waveform\WaveformFilterInterface; +use FFMpeg\Filters\Waveform\WaveformFilters; +use FFMpeg\Driver\FFMpegDriver; +use FFMpeg\FFProbe; +use FFMpeg\Exception\RuntimeException; + +class Waveform extends AbstractMediaType +{ + const DEFAULT_COLOR = '#000000'; + + /** @var Video */ + protected $audio; + protected $width; + protected $height; + + /** + * @var array + */ + protected $colors; + + public function __construct(Audio $audio, FFMpegDriver $driver, FFProbe $ffprobe, $width, $height, $colors = array(self::DEFAULT_COLOR)) + { + parent::__construct($audio->getPathfile(), $driver, $ffprobe); + $this->audio = $audio; + $this->width = $width; + $this->height = $height; + + $this->setColors($colors); + } + + /** + * Returns the audio related to the waveform. + * + * @return Audio + */ + public function getAudio() + { + return $this->audio; + } + + /** + * {@inheritdoc} + * + * @return WaveformFilters + */ + public function filters() + { + return new WaveformFilters($this); + } + + /** + * {@inheritdoc} + * + * @return Waveform + */ + public function addFilter(WaveformFilterInterface $filter) + { + $this->filters->add($filter); + + return $this; + } + + /** + * Parameter should be an array containing at least one valid color represented as a HTML color string. For + * example #FFFFFF or #000000. By default the color is set to black. Keep in mind that if you save the waveform + * as jpg file, it will appear completely black and to avoid this you can set the waveform color to white (#FFFFFF). + * Saving waveforms to png is strongly suggested. + * + * @param array $colors + */ + public function setColors(array $colors) + { + foreach ($colors as $row => $value) + { + if (!preg_match('/^#(?:[0-9a-fA-F]{6})$/', $value)) + { + //invalid color + //unset($colors[$row]); + + throw new InvalidArgumentException("The provided color '$value' is invalid"); + } + } + + if (count($colors)) + { + $this->colors = $colors; + } + } + + /** + * Returns an array of colors that will be passed to ffmpeg to use for waveform generation. Colors are applied ONLY + * to the waveform. Background cannot be controlled that easily and it is probably easier to save the waveform + * as a transparent png file and then add background of choice. + * + * @return array + */ + public function getColors() + { + return $this->colors; + } + + /** + * Compiles the selected colors into a string, using a pipe separator. + * + * @return string + */ + protected function compileColors() + { + return implode('|', $this->colors); + } + + /** + * Saves the waveform in the given filename. + * + * @param string $pathfile + * + * @return Waveform + * + * @throws RuntimeException + */ + public function save($pathfile) + { + /** + * might be optimized with http://ffmpeg.org/trac/ffmpeg/wiki/Seeking%20with%20FFmpeg + * @see http://ffmpeg.org/ffmpeg.html#Main-options + */ + $commands = array( + '-y', '-i', $this->pathfile, '-filter_complex', + 'showwavespic=colors='.$this->compileColors().':s='.$this->width.'x'.$this->height, + '-frames:v', '1' + ); + + foreach ($this->filters as $filter) { + $commands = array_merge($commands, $filter->apply($this)); + } + + $commands = array_merge($commands, array($pathfile)); + + try { + $this->driver->command($commands); + } catch (ExecutionFailureException $e) { + $this->cleanupTemporaryFile($pathfile); + throw new RuntimeException('Unable to save waveform', $e->getCode(), $e); + } + + return $this; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/BaseTestCase.php b/vendor/php-ffmpeg/php-ffmpeg/tests/BaseTestCase.php new file mode 100644 index 0000000000..f32ff495af --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/BaseTestCase.php @@ -0,0 +1,63 @@ +setExpectedException($exception, $message); + } + + public static function assertStringContainsString($needle, $haystack, $message = '') + { + self::assertContains($needle, $haystack, $message); + } + + public static function assertStringNotContainsString($needle, $haystack, $message = '') + { + self::assertNotContains($needle, $haystack, $message); + } + } +} else { + class BaseTestCase extends TestCase + { + public function assertScalar($value, $message = '') + { + $this->assertTrue(is_scalar($value), $message); + } + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Functional/AdvancedMediaTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Functional/AdvancedMediaTest.php new file mode 100644 index 0000000000..cb6d904b26 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Functional/AdvancedMediaTest.php @@ -0,0 +1,268 @@ +getFFMpeg(); + $inputs = array(realpath(__DIR__ . '/../files/Test.ogv')); + $format = new Mp3(); + $output = __DIR__ . '/' . self::OUTPUT_PATH_PREFIX . 'extracted_with_map.mp3'; + + // You can run it without -filter_complex, just using -map. + $advancedMedia = $ffmpeg->openAdvanced($inputs); + $advancedMedia + ->map(array('0:a'), $format, $output) + ->save(); + + $this->assertFileExists($output); + $this->assertEquals('MP2/3 (MPEG audio layer 2/3)', + $ffmpeg->open($output)->getFormat()->get('format_long_name')); + unlink($output); + } + + public function testAudio() + { + $ffmpeg = $this->getFFMpeg(); + $inputs = array(realpath(__DIR__ . '/../files/Audio.mp3')); + $format = new Mp3(); + $format->setAudioKiloBitrate(30); + $output = __DIR__ . '/' . self::OUTPUT_PATH_PREFIX . 'audio_test.mp3'; + + $advancedMedia = $ffmpeg->openAdvanced($inputs); + $advancedMedia + ->map(array('0:a'), $format, $output) + ->save(); + + $this->assertFileExists($output); + $this->assertEquals('MP2/3 (MPEG audio layer 2/3)', + $ffmpeg->open($output)->getFormat()->get('format_long_name')); + unlink($output); + } + + public function testMultipleInputs() + { + $ffmpeg = $this->getFFMpeg(); + $inputs = array( + realpath(__DIR__ . '/../files/portrait.MOV'), + realpath(__DIR__ . '/../files/portrait.MOV') + ); + $format = new X264('aac', 'libx264'); + $output = __DIR__ . '/' . self::OUTPUT_PATH_PREFIX . 'multiple_inputs_test.mp4'; + + $advancedMedia = $ffmpeg->openAdvanced($inputs); + $advancedMedia->filters() + ->custom('[0:v][1:v]', 'hstack', '[v]'); + $advancedMedia + ->map(array('0:a', '[v]'), $format, $output) + ->save(); + + $this->assertFileExists($output); + $this->assertEquals('QuickTime / MOV', + $ffmpeg->open($output)->getFormat()->get('format_long_name')); + unlink($output); + } + + /** + * @covers \FFMpeg\Media\AdvancedMedia::map + */ + public function testMultipleOutputsTestAbsenceOfInputs() + { + $ffmpeg = $this->getFFMpeg(); + // in this test we use only computed inputs + // and can ignore -i part of the command, pass empty inputs array. + $inputs = array(); + $formatX264 = new X264('aac', 'libx264'); + $formatMp3 = new Mp3(); + + $outputMp3 = __DIR__ . '/' . self::OUTPUT_PATH_PREFIX . 'test_multiple_outputs.mp3'; + $outputVideo1 = __DIR__ . '/' . self::OUTPUT_PATH_PREFIX . 'test_multiple_outputs_v1.mp4'; + $outputVideo2 = __DIR__ . '/' . self::OUTPUT_PATH_PREFIX . 'test_multiple_outputs_v2.mp4'; + + $advancedMedia = $ffmpeg->openAdvanced($inputs); + $advancedMedia->filters() + ->sine('[a]', 5) + ->testSrc('[v1]', TestSrcFilter::TESTSRC, '160x120', 5) + ->testSrc('[v2]', TestSrcFilter::TESTSRC, '160x120', 5) + ->custom('[v1]', 'negate', '[v1negate]') + ->custom('[v2]', 'edgedetect', '[v2edgedetect]'); + $advancedMedia + ->map(array('[a]'), $formatMp3, $outputMp3) + ->map(array('[v1negate]'), $formatX264, $outputVideo1) + ->map(array('[v2edgedetect]'), $formatX264, $outputVideo2) + ->save(); + + + $this->assertFileExists($outputMp3); + $this->assertEquals('MP2/3 (MPEG audio layer 2/3)', + $ffmpeg->open($outputMp3)->getFormat()->get('format_long_name')); + unlink($outputMp3); + + $this->assertFileExists($outputVideo1); + $this->assertEquals('QuickTime / MOV', + $ffmpeg->open($outputVideo1)->getFormat()->get('format_long_name')); + unlink($outputVideo1); + + $this->assertFileExists($outputVideo2); + $this->assertEquals('QuickTime / MOV', + $ffmpeg->open($outputVideo2)->getFormat()->get('format_long_name')); + unlink($outputVideo2); + } + + /** + * @covers \FFMpeg\Filters\AdvancedMedia\TestSrcFilter + * @covers \FFMpeg\Filters\AdvancedMedia\SineFilter + */ + public function testTestSrcFilterTestSineFilter() + { + $ffmpeg = $this->getFFMpeg(); + $inputs = array(realpath(__DIR__ . '/../files/Test.ogv')); + $format = new X264('aac', 'libx264'); + $output = __DIR__ . '/' . self::OUTPUT_PATH_PREFIX . 'testsrc.mp4'; + + $advancedMedia = $ffmpeg->openAdvanced($inputs); + $advancedMedia->filters() + ->sine('[a]', 10) + ->testSrc('[v]', TestSrcFilter::TESTSRC, '160x120', 10); + $advancedMedia + ->map(array('[a]', '[v]'), $format, $output) + ->save(); + + $this->assertFileExists($output); + $this->assertEquals('QuickTime / MOV', + $ffmpeg->open($output)->getFormat()->get('format_long_name')); + unlink($output); + } + + /** + * XStack filter is supported starting from 4.1 ffmpeg version. + * + * @covers \FFMpeg\Filters\AdvancedMedia\XStackFilter + * @covers \FFMpeg\Filters\AdvancedMedia\SineFilter + */ + public function testXStackFilter() + { + $xStack = new XStackFilter('', 0); + $ffmpeg = $this->getFFMpeg(); + $ffmpegVersion = $ffmpeg->getFFMpegDriver()->getVersion(); + if (version_compare($ffmpegVersion, $xStack->getMinimalFFMpegVersion(), '<')) { + $this->markTestSkipped('XStack filter is supported starting from ffmpeg version ' + . $xStack->getMinimalFFMpegVersion() . ', your version is ' + . $ffmpegVersion); + return; + } + + $inputs = array(realpath(__DIR__ . '/../files/Test.ogv')); + $format = new X264('aac', 'libx264'); + $output = __DIR__ . '/' . self::OUTPUT_PATH_PREFIX . 'xstack_test.mp4'; + + $advancedMedia = $ffmpeg->openAdvanced($inputs); + $advancedMedia->filters() + ->sine('[a]', 5) + ->testSrc('[v1]', TestSrcFilter::TESTSRC, '160x120', 5) + ->testSrc('[v2]', TestSrcFilter::TESTSRC, '160x120', 5) + ->testSrc('[v3]', TestSrcFilter::TESTSRC, '160x120', 5) + ->testSrc('[v4]', TestSrcFilter::TESTSRC, '160x120', 5) + ->xStack('[v1][v2][v3][v4]', + XStackFilter::LAYOUT_2X2, 4, '[v]'); + $advancedMedia + ->map(array('[a]', '[v]'), $format, $output) + ->save(); + + $this->assertFileExists($output); + $this->assertEquals('QuickTime / MOV', + $ffmpeg->open($output)->getFormat()->get('format_long_name')); + unlink($output); + } + + public function testOfCompatibilityWithExistedFilters() + { + $ffmpeg = $this->getFFMpeg(); + $inputs = array(realpath(__DIR__ . '/../files/Test.ogv')); + $watermark = realpath(__DIR__ . '/../files/watermark.png'); + $format = new X264('aac', 'libx264'); + $output = __DIR__ . '/' . self::OUTPUT_PATH_PREFIX . 'test_of_compatibility_with_existed_filters.mp4'; + + $advancedMedia = $ffmpeg->openAdvanced($inputs); + $advancedMedia->filters() + // For unknown reasons WatermarkFilter produce an error on Windows, + // because the path to the watermark becomes corrupted. + // This behaviour related with Alchemy\BinaryDriver\AbstractBinary::command(). + // The path inside filter becomes like + // "D:ServerswwwPHP-FFMpegtestsfileswatermark.png" (without slashes). + // But on Linux systems filter works as expected. + //->watermark('[0:v]', $watermark, '[v]') + ->pad('[0:v]', new Dimension(300, 100), '[v]'); + $advancedMedia + ->map(array('0:a', '[v]'), $format, $output) + ->save(); + + $this->assertFileExists($output); + $this->assertEquals('QuickTime / MOV', + $ffmpeg->open($output)->getFormat()->get('format_long_name')); + unlink($output); + } + + public function testForceDisableAudio() + { + $ffmpeg = $this->getFFMpeg(); + $format = new X264(); + + $advancedMedia1 = $ffmpeg->openAdvanced(array(__FILE__)); + $advancedMedia1 + ->map(array('test'), $format, 'outputFile.mp4', false); + $this->assertStringContainsString('acodec', $advancedMedia1->getFinalCommand()); + + $advancedMedia2 = $ffmpeg->openAdvanced(array(__FILE__)); + $advancedMedia2 + ->map(array('test'), $format, 'outputFile.mp4', true); + $this->assertStringNotContainsString('acodec', $advancedMedia2->getFinalCommand()); + } + + public function testForceDisableVideo() + { + $ffmpeg = $this->getFFMpeg(); + $format = new X264(); + + $advancedMedia1 = $ffmpeg->openAdvanced(array(__FILE__)); + $advancedMedia1->map(array('test'), $format, + 'outputFile.mp4', false, false); + $this->assertStringContainsString('vcodec', $advancedMedia1->getFinalCommand()); + + $advancedMedia2 = $ffmpeg->openAdvanced(array(__FILE__)); + $advancedMedia2->map(array('test'), $format, + 'outputFile.mp4', false, true); + $this->assertStringNotContainsString('vcodec', $advancedMedia2->getFinalCommand()); + } + + public function testGlobalOptions() + { + $configuration = array( + 'ffmpeg.threads' => 3, + 'ffmpeg.filter_threads' => 13, + 'ffmpeg.filter_complex_threads' => 24, + ); + + $ffmpeg = $this->getFFMpeg($configuration); + $advancedMedia = $ffmpeg->openAdvanced(array(__FILE__)); + $command = $advancedMedia->getFinalCommand(); + + foreach ($configuration as $optionName => $optionValue) { + $optionName = str_replace('ffmpeg.', '', $optionName); + $this->assertStringContainsString('-' . $optionName . ' ' . $optionValue, $command); + } + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Functional/AudioConcatenationTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Functional/AudioConcatenationTest.php new file mode 100644 index 0000000000..f4ca19783e --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Functional/AudioConcatenationTest.php @@ -0,0 +1,31 @@ +getFFMpeg(); + + $files = [ + __DIR__ . '/../files/Jahzzar_-_05_-_Siesta.mp3', + __DIR__ . '/../files/02_-_Favorite_Secrets.mp3', + ]; + + $audio = $ffmpeg->open(reset($files)); + + $this->assertInstanceOf('FFMpeg\Media\Audio', $audio); + + clearstatcache(); + $filename = __DIR__ . '/output/concat-output.mp3'; + + $audio->concat($files)->saveFromSameCodecs($filename, TRUE); + + $this->assertFileExists($filename); + unlink($filename); + } +} \ No newline at end of file diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Functional/FFProbeTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Functional/FFProbeTest.php new file mode 100644 index 0000000000..160793fa52 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Functional/FFProbeTest.php @@ -0,0 +1,41 @@ +assertGreaterThan(0, count($ffprobe->streams(__DIR__ . '/../files/Audio.mp3'))); + } + + public function testValidateExistingFile() + { + $ffprobe = FFProbe::create(); + $this->assertTrue($ffprobe->isValid(__DIR__ . '/../files/sample.3gp')); + } + + + public function testValidateNonExistingFile() + { + $ffprobe = FFProbe::create(); + $this->assertFalse($ffprobe->isValid(__DIR__ . '/../files/WrongFile.mp4')); + } + + public function testProbeOnNonExistantFile() + { + $this->expectException('\FFMpeg\Exception\RuntimeException'); + + $ffprobe = FFProbe::create(); + $ffprobe->streams('/path/to/no/file'); + } + + public function testProbeOnRemoteFile() + { + $ffprobe = FFProbe::create(); + $this->assertGreaterThan(0, count($ffprobe->streams('http://vjs.zencdn.net/v/oceans.mp4'))); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Functional/FunctionalTestCase.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Functional/FunctionalTestCase.php new file mode 100644 index 0000000000..6a2656a0a2 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Functional/FunctionalTestCase.php @@ -0,0 +1,19 @@ + 300), $configuration)); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Functional/VideoTranscodeTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Functional/VideoTranscodeTest.php new file mode 100644 index 0000000000..bc5dfe057f --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Functional/VideoTranscodeTest.php @@ -0,0 +1,148 @@ +getFFMpeg(); + $video = $ffmpeg->open(__DIR__ . '/../files/Test.ogv'); + + $this->assertInstanceOf('FFMpeg\Media\Video', $video); + + $lastPercentage = null; + $phpunit = $this; + + $codec = new X264('aac'); + $codec->on('progress', function ($video, $codec, $percentage) use ($phpunit, &$lastPercentage) { + if (null !== $lastPercentage) { + $phpunit->assertGreaterThanOrEqual($lastPercentage, $percentage); + } + $lastPercentage = $percentage; + $phpunit->assertGreaterThanOrEqual(0, $percentage); + $phpunit->assertLessThanOrEqual(100, $percentage); + }); + + $video->save($codec, $filename); + $this->assertFileExists($filename); + unlink($filename); + } + + public function testAacTranscodeX264() + { + $filename = __DIR__ . '/output/output-x264_2.mp4'; + if (is_file($filename)) { + unlink(__DIR__ . '/output/output-x264_2.mp4'); + } + + $ffmpeg = $this->getFFMpeg(); + $video = $ffmpeg->open(__DIR__ . '/../files/sample.3gp'); + + $this->assertInstanceOf('FFMpeg\Media\Video', $video); + + $lastPercentage = null; + $phpunit = $this; + + $codec = new X264('aac'); + $codec->on('progress', function ($video, $codec, $percentage) use ($phpunit, &$lastPercentage) { + if (null !== $lastPercentage) { + $phpunit->assertGreaterThanOrEqual($lastPercentage, $percentage); + } + $lastPercentage = $percentage; + $phpunit->assertGreaterThanOrEqual(0, $percentage); + $phpunit->assertLessThanOrEqual(100, $percentage); + }); + + $video->save($codec, $filename); + $this->assertFileExists($filename); + unlink($filename); + } + + /** + */ + public function testTranscodeInvalidFile() + { + $this->expectException('\FFMpeg\Exception\RuntimeException'); + $ffmpeg = $this->getFFMpeg(); + $ffmpeg->open(__DIR__ . '/../files/UnknownFileTest.ogv'); + } + + public function testSaveInvalidForgedVideo() + { + $ffmpeg = $this->getFFMpeg(); + $video = new Video(__DIR__ . '/../files/UnknownFileTest.ogv', $ffmpeg->getFFMpegDriver(), $ffmpeg->getFFProbe()); + + $this->expectException('\FFMpeg\Exception\RuntimeException'); + $video->save(new X264('aac'), __DIR__ . '/output/output-x264.mp4'); + } + + public function testTranscodePortraitVideo() + { + $info = $this->getNameAndVersion(); + + if ($info['name'] === 'avconv' && version_compare($info['version'], '0.9', '<')) { + $this->markTestSkipped('This version of avconv is buggy and does not support this test.'); + } + + $filename = __DIR__ . '/output/output-x264.mp4'; + if (is_file($filename)) { + unlink(__DIR__ . '/output/output-x264.mp4'); + } + + $ffmpeg = $this->getFFMpeg(); + $video = $ffmpeg->open(__DIR__ . '/../files/portrait.MOV'); + + $video->filters() + ->resize(new Dimension(320, 240), ResizeFilter::RESIZEMODE_INSET) + ->rotate(RotateFilter::ROTATE_90); + $video->save(new X264('aac'), $filename); + + $dimension = $ffmpeg->getFFProbe() + ->streams($filename) + ->videos() + ->first() + ->getDimensions(); + + $this->assertLessThan(1, $dimension->getRatio(false)->getValue()); + $this->assertEquals(240, $dimension->getHeight()); + + $this->assertFileExists($filename); + unlink($filename); + } + + private function getNameAndVersion() + { + $binary = $this + ->getFFMpeg() + ->getFFMpegDriver() + ->getProcessBuilderFactory() + ->getBinary(); + + $output = $matches = null; + exec($binary . ' -version 2>&1', $output); + + if (!isset($output[0])) { + return array('name' => null, 'version' => null); + } + + preg_match('/^([a-z]+)\s+version\s+([0-9\.]+)/i', $output[0], $matches); + + if (count($matches) > 0) { + return array('name' => $matches[1], 'version' => $matches[2]); + } + + return array('name' => null, 'version' => null); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Functional/output/.placeholder b/vendor/php-ffmpeg/php-ffmpeg/tests/Functional/output/.placeholder new file mode 100644 index 0000000000..e69de29bb2 diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Coordinate/AspectRatioTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Coordinate/AspectRatioTest.php new file mode 100644 index 0000000000..100b6b79fa --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Coordinate/AspectRatioTest.php @@ -0,0 +1,83 @@ +assertEquals($expected, $ratio->getValue()); + + $this->assertEquals($calculatedHeight, $ratio->calculateHeight(240, $modulus)); + $this->assertEquals($calculatedWidth, $ratio->calculateWidth(320, $modulus)); + } + + public function provideDimensionsAndExpectedratio() + { + return array( + //AR_5_4 + array(720, 576, false, 5/4, 400, 192), + array(720, 577, false, 5/4, 400, 192), + array(720, 620, false, 720/620, 372, 206), + array(720, 576, true, 5/4, 400, 192), + //AR_ROTATED_4_5 + array(576, 720, false, 4/5, 256, 300), + array(576, 720, true, 4/5, 256, 300), + //AR_4_3 + array(320, 240, false, 4/3, 426, 180), + array(320, 240, true, 4/3, 426, 180), + //AR_ROTATED_3_4 + array(240, 320, false, 3/4, 240, 320), + array(240, 320, true, 3/4, 240, 320), + //AR_16_9 + array(1920, 1080, false, 16/9, 568, 136), + array(1920, 1080, true, 16/9, 568, 136), + array(1280, 720, false, 16/9, 568, 136), + array(1280, 720, true, 16/9, 568, 136), + array(3840, 2160, false, 16/9, 568, 136), + array(3840, 2160, true, 16/9, 568, 136), + // modulus 4 + array(1920, 1080, false, 16/9, 568, 136, 4), + array(1920, 1080, true, 16/9, 568, 136, 4), + array(1280, 720, false, 16/9, 568, 136, 4), + array(1280, 720, true, 16/9, 568, 136, 4), + array(3840, 2160, false, 16/9, 568, 136, 4), + array(3840, 2160, true, 16/9, 568, 136, 4), + // modulus 16 + array(1920, 1080, false, 16/9, 576, 128, 16), + array(1920, 1080, true, 16/9, 576, 128, 16), + array(1280, 720, false, 16/9, 576, 128, 16), + array(1280, 720, true, 16/9, 576, 128, 16), + array(3840, 2160, false, 16/9, 576, 128, 16), + array(3840, 2160, true, 16/9, 576, 128, 16), + //AR_ROTATED_9_16 + array(1080, 1920, false, 9/16, 180, 426), + array(1080, 1920, true, 9/16, 180, 426), + array(720, 1280, false, 9/16, 180, 426), + array(720, 1280, true, 9/16, 180, 426), + array(2160, 3840, false, 9/16, 180, 426), + array(2160, 3840, true, 9/16, 180, 426), + //AR_3_2 + array(360, 240, false, 3/2, 480, 160), + array(360, 240, true, 3/2, 480, 160), + //AR_ROTATED_2_3 + array(240, 360, false, 2/3, 214, 360), + array(240, 360, true, 2/3, 214, 360), + //AR_5_3 + //AR_ROTATED_3_5 + //AR_1_1 + //AR_1_DOT_85_1 + //AR_ROTATED_1_DOT_85 + //AR_2_DOT_39_1 + //AR_ROTATED_2_DOT_39 + ); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Coordinate/DimensionTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Coordinate/DimensionTest.php new file mode 100644 index 0000000000..13854fcd7a --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Coordinate/DimensionTest.php @@ -0,0 +1,38 @@ +expectException('\FFMpeg\Exception\InvalidArgumentException'); + new Dimension($width, $height); + } + + public function provideInvalidDimensions() + { + return array( + array(320, 0), + array(320, -10), + array(0, 240), + array(-10, 240), + array(0, 0), + array(0, -10), + array(-10, 0), + ); + } + + public function testGetters() + { + $dimension = new Dimension(320, 240); + $this->assertEquals(320, $dimension->getWidth()); + $this->assertEquals(240, $dimension->getHeight()); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Coordinate/FrameRateTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Coordinate/FrameRateTest.php new file mode 100644 index 0000000000..da561c8ff1 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Coordinate/FrameRateTest.php @@ -0,0 +1,31 @@ +assertEquals(23.997, $fr->getValue()); + } + + /** + * @dataProvider provideInvalidFrameRates + */ + public function testInvalidFrameRate($value) + { + $this->expectException('\FFMpeg\Exception\InvalidArgumentException'); + new FrameRate($value); + } + + public function provideInvalidFrameRates() + { + return array( + array(0), array(-1.5), array(-2), + ); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Coordinate/PointTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Coordinate/PointTest.php new file mode 100644 index 0000000000..4d633ce781 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Coordinate/PointTest.php @@ -0,0 +1,23 @@ +assertEquals(4, $point->getX()); + $this->assertEquals(25, $point->getY()); + } + + public function testDynamicPointGetters() + { + $point = new Point("t*100", "t", true); + $this->assertEquals("t*100", $point->getX()); + $this->assertEquals("t", $point->getY()); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Coordinate/TimeCodeTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Coordinate/TimeCodeTest.php new file mode 100644 index 0000000000..a91b3660d1 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Coordinate/TimeCodeTest.php @@ -0,0 +1,58 @@ +assertEquals((string) $tc, $expected); + } + + public function provideTimeCodes() + { + return array( + array('1:02:04:05:20', '26:04:05.20'), + array('1:02:04:05.20', '26:04:05.20'), + array('02:04:05:20', '02:04:05.20'), + array('02:04:05.20', '02:04:05.20'), + array('00:00:05.20', '00:00:05.20'), + array('00:00:00.00', '00:00:00.00'), + ); + } + + public function testFromInvalidString() + { + $this->expectException('\FFMpeg\Exception\InvalidArgumentException'); + TimeCode::fromString('lalali lala'); + } + + /** + * @dataProvider provideSeconds + */ + public function testFromSeconds($seconds, $expected) + { + $tc = TimeCode::fromSeconds($seconds); + $this->assertEquals($expected, (string) $tc); + } + + public function provideSeconds() + { + return array( + array(0.467, '00:00:00.47'), + array(12.467, '00:00:12.47'), + array(59.867, '00:00:59.87'), + array(72.467, '00:01:12.47'), + array(3599.467, '00:59:59.47'), + array(3600.467, '01:00:00.47'), + array(86422.467, '24:00:22.47'), + ); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Driver/FFMpegDriverTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Driver/FFMpegDriverTest.php new file mode 100644 index 0000000000..ec4acbd326 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Driver/FFMpegDriverTest.php @@ -0,0 +1,49 @@ +find($name)) { + $found = true; + break; + } + } + + if (!$found) { + $this->markTestSkipped('Neither ffmpeg or avconv found'); + } + } + + public function testCreate() + { + $logger = $this->getLoggerMock(); + $ffmpeg = FFMpegDriver::create($logger, array()); + $this->assertInstanceOf('FFMpeg\Driver\FFMpegDriver', $ffmpeg); + $this->assertEquals($logger, $ffmpeg->getProcessRunner()->getLogger()); + } + + public function testCreateWithConfig() + { + $conf = new Configuration(); + $ffmpeg = FFMpegDriver::create($this->getLoggerMock(), $conf); + $this->assertEquals($conf, $ffmpeg->getConfiguration()); + } + + public function testCreateFailureThrowsAnException() + { + $this->expectException('\FFMpeg\Exception\ExecutableNotFoundException'); + FFMpegDriver::create($this->getLoggerMock(), array('ffmpeg.binaries' => '/path/to/nowhere')); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Driver/FFProbeDriverTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Driver/FFProbeDriverTest.php new file mode 100644 index 0000000000..d42074e69b --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Driver/FFProbeDriverTest.php @@ -0,0 +1,49 @@ +find($name)) { + $found = true; + break; + } + } + + if (!$found) { + $this->markTestSkipped('Neither ffprobe or avprobe found'); + } + } + + public function testCreate() + { + $logger = $this->getLoggerMock(); + $ffprobe = FFProbeDriver::create(array(), $logger); + $this->assertInstanceOf('FFMpeg\Driver\FFProbeDriver', $ffprobe); + $this->assertEquals($logger, $ffprobe->getProcessRunner()->getLogger()); + } + + public function testCreateWithConfig() + { + $conf = new Configuration(); + $ffprobe = FFProbeDriver::create($conf, $this->getLoggerMock()); + $this->assertEquals($conf, $ffprobe->getConfiguration()); + } + + public function testCreateFailureThrowsAnException() + { + $this->expectException('\FFMpeg\Exception\ExecutableNotFoundException'); + FFProbeDriver::create(array('ffprobe.binaries' => '/path/to/nowhere')); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/FFMpegServiceProviderTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/FFMpegServiceProviderTest.php new file mode 100644 index 0000000000..a15e679752 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/FFMpegServiceProviderTest.php @@ -0,0 +1,69 @@ +register(new FFMpegServiceProvider(), array( + 'ffmpeg.configuration' => array( + 'ffmpeg.threads' => 12, + 'ffmpeg.timeout' => 10666, + 'ffprobe.timeout' => 4242, + ) + )); + + $this->assertInstanceOf('FFMpeg\FFMpeg', $app['ffmpeg']); + $this->assertSame($app['ffmpeg'], $app['ffmpeg.ffmpeg']); + $this->assertInstanceOf('FFMpeg\FFProbe', $app['ffmpeg.ffprobe']); + + $this->assertEquals(12, $app['ffmpeg']->getFFMpegDriver()->getConfiguration()->get('ffmpeg.threads')); + $this->assertEquals(10666, $app['ffmpeg']->getFFMpegDriver()->getProcessBuilderFactory()->getTimeout()); + $this->assertEquals(4242, $app['ffmpeg.ffprobe']->getFFProbeDriver()->getProcessBuilderFactory()->getTimeout()); + } + + public function testWithoutConfig() + { + $app = new Application(); + $app->register(new FFMpegServiceProvider()); + + $this->assertInstanceOf('FFMpeg\FFMpeg', $app['ffmpeg']); + $this->assertSame($app['ffmpeg'], $app['ffmpeg.ffmpeg']); + $this->assertInstanceOf('FFMpeg\FFProbe', $app['ffmpeg.ffprobe']); + + $this->assertEquals(4, $app['ffmpeg']->getFFMpegDriver()->getConfiguration()->get('ffmpeg.threads')); + $this->assertEquals(300, $app['ffmpeg']->getFFMpegDriver()->getProcessBuilderFactory()->getTimeout()); + $this->assertEquals(30, $app['ffmpeg.ffprobe']->getFFProbeDriver()->getProcessBuilderFactory()->getTimeout()); + } + + public function testWithFFMpegBinaryConfig() + { + $app = new Application(); + $app->register(new FFMpegServiceProvider(), array( + 'ffmpeg.configuration' => array( + 'ffmpeg.binaries' => '/path/to/ffmpeg', + ) + )); + + $this->expectException('\FFMpeg\Exception\ExecutableNotFoundException', 'Unable to load FFMpeg'); + $app['ffmpeg']; + } + + public function testWithFFMprobeBinaryConfig() + { + $app = new Application(); + $app->register(new FFMpegServiceProvider(), array( + 'ffmpeg.configuration' => array( + 'ffprobe.binaries' => '/path/to/ffprobe', + ) + )); + + $this->expectException('\FFMpeg\Exception\ExecutableNotFoundException', 'Unable to load FFProbe'); + $app['ffmpeg.ffprobe']; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/FFMpegTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/FFMpegTest.php new file mode 100644 index 0000000000..08043d6e3b --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/FFMpegTest.php @@ -0,0 +1,110 @@ +expectException( + '\FFMpeg\Exception\RuntimeException', + 'Unable to probe "/path/to/unknown/file"' + ); + $ffmpeg = new FFMpeg($this->getFFMpegDriverMock(), $this->getFFProbeMock()); + $ffmpeg->open('/path/to/unknown/file'); + } + + public function testOpenAudio() + { + $streams = $this->getStreamCollectionMock(); + $streams->expects($this->once()) + ->method('audios') + ->will($this->returnValue(new StreamCollection(array(new Stream(array()))))); + $streams->expects($this->once()) + ->method('videos') + ->will($this->returnValue(array())); + + $ffprobe = $this->getFFProbeMock(); + $ffprobe->expects($this->once()) + ->method('streams') + ->with(__FILE__) + ->will($this->returnValue($streams)); + + $ffmpeg = new FFMpeg($this->getFFMpegDriverMock(), $ffprobe); + $this->assertInstanceOf('FFMpeg\Media\Audio', $ffmpeg->open(__FILE__)); + } + + public function testOpenVideo() + { + $streams = $this->getStreamCollectionMock(); + $streams->expects($this->once()) + ->method('videos') + ->will($this->returnValue(new StreamCollection(array(new Stream(array()))))); + $streams->expects($this->never()) + ->method('audios'); + + $ffprobe = $this->getFFProbeMock(); + $ffprobe->expects($this->once()) + ->method('streams') + ->with(__FILE__) + ->will($this->returnValue($streams)); + + $ffmpeg = new FFMpeg($this->getFFMpegDriverMock(), $ffprobe); + $this->assertInstanceOf('FFMpeg\Media\Video', $ffmpeg->open(__FILE__)); + } + + public function testOpenUnknown() + { + $this->expectException('\FFMpeg\Exception\InvalidArgumentException'); + $ffprobe = $this->getFFProbeMock(); + $ffprobe->expects($this->once()) + ->method('streams') + ->with(__FILE__) + ->will($this->returnValue(new StreamCollection())); + + $ffmpeg = new FFMpeg($this->getFFMpegDriverMock(), $ffprobe); + $ffmpeg->open(__FILE__); + } + + public function testCreateWithoutLoggerOrProbe() + { + $this->assertInstanceOf('FFMpeg\FFMpeg', FFMpeg::create()); + } + + public function testCreateWithLoggerAndProbe() + { + $logger = $this->getLoggerMock(); + $ffprobe = $this->getFFProbeMock(); + + $ffmpeg = FFMpeg::create(array('timeout' => 42), $logger, $ffprobe); + $this->assertInstanceOf('FFMpeg\FFMpeg', $ffmpeg); + + $this->assertSame($logger, $ffmpeg->getFFMpegDriver()->getProcessRunner()->getLogger()); + $this->assertSame($ffprobe, $ffmpeg->getFFProbe()); + $this->assertSame(42, $ffmpeg->getFFMpegDriver()->getProcessBuilderFactory()->getTimeout()); + } + + public function testGetSetFFProbe() + { + $ffprobe = $this->getFFProbeMock(); + $ffmpeg = new FFMpeg($this->getFFMpegDriverMock(), $ffprobe); + $this->assertSame($ffprobe, $ffmpeg->getFFProbe()); + $anotherFFProbe = $this->getFFProbeMock(); + $ffmpeg->setFFProbe($anotherFFProbe); + $this->assertSame($anotherFFProbe, $ffmpeg->getFFProbe()); + } + + public function testGetSetDriver() + { + $driver = $this->getFFMpegDriverMock(); + $ffmpeg = new FFMpeg($driver, $this->getFFProbeMock()); + $this->assertSame($driver, $ffmpeg->getFFMpegDriver()); + $anotherDriver = $this->getFFMpegDriverMock(); + $ffmpeg->setFFMpegDriver($anotherDriver); + $this->assertSame($anotherDriver, $ffmpeg->getFFMpegDriver()); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/FFProbe/DataMapping/AbstractDataTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/FFProbe/DataMapping/AbstractDataTest.php new file mode 100644 index 0000000000..a870ae6645 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/FFProbe/DataMapping/AbstractDataTest.php @@ -0,0 +1,52 @@ + 'value1', 'key2' => 'value2')); + + $this->assertTrue($imp->has('key1')); + $this->assertTrue($imp->has('key2')); + $this->assertFalse($imp->has('value1')); + $this->assertFalse($imp->has('key3')); + } + + public function testGet() + { + $imp = new Implementation(array('key1' => 'value1', 'key2' => 'value2')); + + $this->assertEquals('value1', $imp->get('key1')); + $this->assertEquals('value2', $imp->get('key2')); + } + + public function testGetDefault() + { + $imp = new Implementation(array('key1' => 'value1', 'key2' => 'value2')); + $this->assertSame('yololo', $imp->get('key3', 'yololo')); + } + + public function testKeys() + { + $imp = new Implementation(array('key1' => 'value1', 'key2' => 'value2')); + + $this->assertEquals(array('key1', 'key2'), $imp->keys()); + } + + public function testAll() + { + $values = array('key1' => 'value1', 'key2' => 'value2'); + $imp = new Implementation($values); + + $this->assertEquals($values, $imp->all()); + } +} + +class Implementation extends AbstractData +{ +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/FFProbe/DataMapping/StreamCollectionTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/FFProbe/DataMapping/StreamCollectionTest.php new file mode 100644 index 0000000000..64937cc39f --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/FFProbe/DataMapping/StreamCollectionTest.php @@ -0,0 +1,89 @@ +getStreamMock(); + + $collection = new StreamCollection(); + $this->assertEquals(array(), $collection->all()); + $collection->add($stream); + $this->assertEquals(array($stream), $collection->all()); + $collection->add($stream); + $this->assertEquals(array($stream, $stream), $collection->all()); + } + + public function testVideos() + { + $audio = $this->getStreamMock(); + $audio->expects($this->once()) + ->method('isVideo') + ->will($this->returnValue(false)); + + $video = $this->getStreamMock(); + $video->expects($this->once()) + ->method('isVideo') + ->will($this->returnValue(true)); + + $collection = new StreamCollection(array($audio, $video)); + $videos = $collection->videos(); + + $this->assertInstanceOf('FFMpeg\FFProbe\DataMapping\StreamCollection', $videos); + $this->assertCount(1, $videos); + $this->assertEquals(array($video), $videos->all()); + } + + public function testAudios() + { + $audio = $this->getStreamMock(); + $audio->expects($this->once()) + ->method('isAudio') + ->will($this->returnValue(true)); + + $video = $this->getStreamMock(); + $video->expects($this->once()) + ->method('isAudio') + ->will($this->returnValue(false)); + + $collection = new StreamCollection(array($audio, $video)); + $audios = $collection->audios(); + + $this->assertInstanceOf('FFMpeg\FFProbe\DataMapping\StreamCollection', $audios); + $this->assertCount(1, $audios); + $this->assertEquals(array($audio), $audios->all()); + } + + public function testCount() + { + $stream = $this->getStreamMock(); + + $collection = new StreamCollection(array($stream)); + $this->assertCount(1, $collection); + } + + public function testGetIterator() + { + $audio = $this->getStreamMock(); + $video = $this->getStreamMock(); + + $collection = new StreamCollection(array($audio, $video)); + $this->assertInstanceOf('\Iterator', $collection->getIterator()); + $this->assertCount(2, $collection->getIterator()); + } + + public function testFirst() + { + $stream1 = $this->getStreamMock(); + $stream2 = $this->getStreamMock(); + + $coll = new StreamCollection(array($stream1, $stream2)); + + $this->assertSame($stream1, $coll->first()); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/FFProbe/DataMapping/StreamTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/FFProbe/DataMapping/StreamTest.php new file mode 100644 index 0000000000..0eaee6aef3 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/FFProbe/DataMapping/StreamTest.php @@ -0,0 +1,136 @@ +assertTrue($isAudio === $stream->isAudio()); + } + + public function provideAudioCases() + { + return array( + array(true, array('codec_type' => 'audio')), + array(false, array('codec_type' => 'video')), + ); + } + + /** + * @dataProvider provideVideoCases + */ + public function testIsVideo($isVideo, $properties) + { + $stream = new Stream($properties); + $this->assertTrue($isVideo === $stream->isVideo()); + } + + public function provideVideoCases() + { + return array( + array(true, array('codec_type' => 'video')), + array(false, array('codec_type' => 'audio')), + ); + } + + public function testGetDimensionsFromAudio() + { + $this->expectException( + '\FFMpeg\Exception\LogicException', + 'Dimensions can only be retrieved from video streams.' + ); + $stream = new Stream(array('codec_type' => 'audio')); + $stream->getDimensions(); + } + + public function testGetDimensionsFromVideo() + { + $stream = new Stream(array('codec_type' => 'video', 'width' => 960, 'height' => 720)); + $this->assertEquals(new Dimension(960, 720), $stream->getDimensions()); + } + + /** + * @dataProvider provideInvalidPropertiesForDimensionsExtraction + */ + public function testUnableToGetDimensionsFromVideo($properties) + { + $this->expectException( + '\FFMpeg\Exception\RuntimeException', + 'Unable to extract dimensions.' + ); + $stream = new Stream(array('codec_type' => 'video', 'width' => 960)); + $stream->getDimensions(); + } + + public function provideInvalidPropertiesForDimensionsExtraction() + { + return array( + array('codec_type' => 'video', 'width' => 960), + array('codec_type' => 'video', 'height' => 960), + ); + } + + /** + * @dataProvider providePropertiesForDimensionsExtraction + */ + public function testGetDimensionsFromVideoWithDisplayRatio($data) + { + $stream = new Stream(array( + 'codec_type' => 'video', + 'width' => $data['width'], + 'height' => $data['height'], + 'sample_aspect_ratio' => $data['sar'], + 'display_aspect_ratio' => $data['dar'] + )); + $this->assertEquals(new Dimension($data['result_width'], $data['result_height']), $stream->getDimensions()); + } + + /** + * @dataProvider provideInvalidRatios + */ + public function testGetDimensionsFromVideoWithInvalidDisplayRatio($invalidRatio) + { + $stream = new Stream(array('codec_type' => 'video', 'width' => 960, 'height' => 720, 'sample_aspect_ratio' => $invalidRatio, 'display_aspect_ratio' => '16:9')); + $this->assertEquals(new Dimension(960, 720), $stream->getDimensions()); + } + + public function provideInvalidRatios() + { + return array(array('0:1'), array('2:1:3')); + } + + public function providePropertiesForDimensionsExtraction() + { + return array( + array( + array('width' => '960', 'height' => '720', + 'sar' => '4:3', 'dar' => '16:9', + 'result_width' => '1280', 'result_height' => '720'), + ), + array( + array('width' => '1920', 'height' => '1080', + 'sar' => '1:1', 'dar' => '16:9', + 'result_width' => '1920', 'result_height' => '1080'), + ), + array( + array('width' => '640', 'height' => '480', + 'sar' => '75:74', 'dar' => '50:37', + 'result_width' => '649', 'result_height' => '480'), + ), + array( + array('width' => '720', 'height' => '576', + 'sar' => '52:28', 'dar' => '16:9', + 'result_width' => '1337', 'result_height' => '752'), + ), + ); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/FFProbe/MapperTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/FFProbe/MapperTest.php new file mode 100644 index 0000000000..2ed5360741 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/FFProbe/MapperTest.php @@ -0,0 +1,42 @@ +assertEquals($expected, $mapper->map($type, $data)); + } + + public function testMapInvalidArgument() + { + $this->expectException('\FFMpeg\Exception\InvalidArgumentException'); + $mapper = new Mapper(); + $mapper->map('cool type', 'data'); + } + + public function provideMappings() + { + $format = json_decode(file_get_contents(__DIR__ . '/../../fixtures/ffprobe/show_format.json'), true); + $streams = json_decode(file_get_contents(__DIR__ . '/../../fixtures/ffprobe/show_streams.json'), true); + + return array( + array(FFProbe::TYPE_FORMAT, $format, new Format($format['format'])), + array(FFProbe::TYPE_STREAMS, $streams, new StreamCollection(array_map(function ($streamData) { + return new Stream($streamData); + }, $streams['streams']))), + ); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/FFProbe/OptionsTesterTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/FFProbe/OptionsTesterTest.php new file mode 100644 index 0000000000..44369289e3 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/FFProbe/OptionsTesterTest.php @@ -0,0 +1,123 @@ +expectException( + '\FFMpeg\Exception\RuntimeException', + 'Your FFProbe version is too old and does not support `-help` option, please upgrade.' + ); + $cache = $this->getCacheMock(); + + $executionFailerExceptionMock = $this->getMockBuilder('Alchemy\BinaryDriver\Exception\ExecutionFailureException') + ->disableOriginalConstructor() + ->getMock(); + + $ffprobe = $this->getFFProbeDriverMock(); + $ffprobe->expects($this->once()) + ->method('command') + ->with(array('-help', '-loglevel', 'quiet')) + ->will($this->throwException($executionFailerExceptionMock)); + + $tester = new OptionsTester($ffprobe, $cache); + $tester->has('-print_format'); + } + + /** + * @dataProvider provideOptions + */ + public function testHasOptionWithCacheEmpty($isPresent, $data, $optionName) + { + $cache = $this->getCacheMock(); + + $cache->expects($this->never()) + ->method('fetch'); + + $cache->expects($this->exactly(2)) + ->method('contains') + ->will($this->returnValue(false)); + + $cache->expects($this->exactly(2)) + ->method('save'); + + $ffprobe = $this->getFFProbeDriverMock(); + $ffprobe->expects($this->once()) + ->method('command') + ->with(array('-help', '-loglevel', 'quiet')) + ->will($this->returnValue($data)); + + $tester = new OptionsTester($ffprobe, $cache); + $this->assertTrue($isPresent === $tester->has($optionName)); + } + + public function provideOptions() + { + $data = file_get_contents(__DIR__ . '/../../fixtures/ffprobe/help.raw'); + + return array( + array(true, $data, '-print_format'), + array(false, $data, '-another_print_format'), + ); + } + + /** + * @dataProvider provideOptions + */ + public function testHasOptionWithHelpCacheLoaded($isPresent, $data, $optionName) + { + $cache = $this->getCacheMock(); + + $cache->expects($this->once()) + ->method('fetch') + ->will($this->returnValue($data)); + + $cache->expects($this->at(0)) + ->method('contains') + ->will($this->returnValue(false)); + + $cache->expects($this->at(1)) + ->method('contains') + ->will($this->returnValue(true)); + + $cache->expects($this->once()) + ->method('save'); + + $ffprobe = $this->getFFProbeDriverMock(); + $ffprobe->expects($this->never()) + ->method('command'); + + $tester = new OptionsTester($ffprobe, $cache); + $this->assertTrue($isPresent === $tester->has($optionName)); + } + + /** + * @dataProvider provideOptions + */ + public function testHasOptionWithCacheFullyLoaded($isPresent, $data, $optionName) + { + $cache = $this->getCacheMock(); + + $cache->expects($this->once()) + ->method('fetch') + ->with('option-' . $optionName) + ->will($this->returnValue($isPresent)); + + $cache->expects($this->once()) + ->method('contains') + ->with('option-' . $optionName) + ->will($this->returnValue(true)); + + $ffprobe = $this->getFFProbeDriverMock(); + $ffprobe->expects($this->never()) + ->method('command'); + + $tester = new OptionsTester($ffprobe, $cache); + $this->assertTrue($isPresent === $tester->has($optionName)); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/FFProbe/OutputParserTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/FFProbe/OutputParserTest.php new file mode 100644 index 0000000000..91b7160d1e --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/FFProbe/OutputParserTest.php @@ -0,0 +1,40 @@ +assertEquals($expectedOutput, $parser->parse($type, $data)); + } + + public function testParseWithInvalidArgument() + { + $this->expectException('\FFMpeg\Exception\InvalidArgumentException'); + $parser = new OutputParser(); + $parser->parse('comme ca', 'data'); + } + + public function provideTypeDataAndOutput() + { + $expectedFormat = json_decode(file_get_contents(__DIR__ . '/../../fixtures/ffprobe/show_format.json'), true); + $expectedStreams = json_decode(file_get_contents(__DIR__ . '/../../fixtures/ffprobe/show_streams.json'), true); + + $rawFormat = file_get_contents(__DIR__ . '/../../fixtures/ffprobe/show_format.raw'); + $rawStreams = file_get_contents(__DIR__ . '/../../fixtures/ffprobe/show_streams.raw'); + + return array( + array(FFProbe::TYPE_FORMAT, $rawFormat, $expectedFormat), + array(FFProbe::TYPE_STREAMS, $rawStreams, $expectedStreams), + ); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/FFProbeTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/FFProbeTest.php new file mode 100644 index 0000000000..d927ab985c --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/FFProbeTest.php @@ -0,0 +1,295 @@ +getFFProbeDriverMock(), $this->getCacheMock()); + $parser = $this->getFFProbeParserMock(); + + $ffprobe->setParser($parser); + $this->assertSame($parser, $ffprobe->getParser()); + } + + public function testGetSetFFProbeDriver() + { + $ffprobe = new FFProbe($this->getFFProbeDriverMock(), $this->getCacheMock()); + $driver = $this->getFFProbeDriverMock(); + + $ffprobe->setFFProbeDriver($driver); + $this->assertSame($driver, $ffprobe->getFFProbeDriver()); + } + + public function testGetSetFFProbeMapper() + { + $ffprobe = new FFProbe($this->getFFProbeDriverMock(), $this->getCacheMock()); + $mapper = $this->getFFProbeMapperMock(); + + $ffprobe->setMapper($mapper); + $this->assertSame($mapper, $ffprobe->getMapper()); + } + + public function testGetSetOptionsTester() + { + $ffprobe = new FFProbe($this->getFFProbeDriverMock(), $this->getCacheMock()); + $tester = $this->getFFProbeOptionsTesterMock(); + + $ffprobe->setOptionsTester($tester); + $this->assertSame($tester, $ffprobe->getOptionsTester()); + } + + public function testGetSetCache() + { + $ffprobe = new FFProbe($this->getFFProbeDriverMock(), $this->getCacheMock()); + $cache = $this->getCacheMock(); + + $ffprobe->setCache($cache); + $this->assertSame($cache, $ffprobe->getCache()); + } + + public function provideDataWhitoutCache() + { + $stream = $this->getStreamMock(); + $format = $this->getFormatMock(); + + return array( + array($stream, 'streams', array('-show_streams', '-print_format'), FFProbe::TYPE_STREAMS, array(__FILE__, '-show_streams', '-print_format', 'json'), false), + array($format, 'format', array('-show_format', '-print_format'), FFProbe::TYPE_FORMAT, array(__FILE__, '-show_format', '-print_format', 'json'), false), + array($stream, 'streams', array('-show_streams'), FFProbe::TYPE_STREAMS, array(__FILE__, '-show_streams'), true), + array($format, 'format', array('-show_format'), FFProbe::TYPE_FORMAT, array(__FILE__, '-show_format'), true), + ); + } + + /** + * @dataProvider provideDataWhitoutCache + */ + public function testProbeWithoutCache($output, $method, $commands, $type, $caughtCommands, $isRaw) + { + $pathfile = __FILE__; + $data = array('key' => 'value'); + $rawData = 'raw data'; + + $ffprobe = new FFProbe($this->getFFProbeDriverMock(), $this->getCacheMock()); + + $mapper = $this->getFFProbeMapperMock(); + $mapper->expects($this->once()) + ->method('map') + ->with($type, $data) + ->will($this->returnValue($output)); + + $parser = $this->getFFProbeParserMock(); + + if ($isRaw) { + $parser->expects($this->once()) + ->method('parse') + ->with($type, $rawData) + ->will($this->returnValue($data)); + } else { + $parser->expects($this->never()) + ->method('parse'); + } + + $tester = $this->getFFProbeOptionsTesterMockWithOptions($commands); + + $cache = $this->getCacheMock(); + $cache->expects($this->once()) + ->method('contains') + ->will($this->returnValue(false)); + $cache->expects($this->never()) + ->method('fetch'); + $cache->expects($this->once()) + ->method('save') + ->with($this->anything(), $output); + + $driver = $this->getFFProbeDriverMock(); + $driver->expects($this->once()) + ->method('command') + ->with($caughtCommands) + ->will($this->returnValue($isRaw ? $rawData : json_encode($data))); + + $ffprobe->setOptionsTester($tester) + ->setCache($cache) + ->setMapper($mapper) + ->setFFProbeDriver($driver) + ->setParser($parser); + + $this->assertEquals($output, call_user_func(array($ffprobe, $method), $pathfile)); + } + + public function provideDataForInvalidJson() + { + $stream = $this->getStreamMock(); + $format = $this->getFormatMock(); + + return array( + array($stream, 'streams', array('-show_streams', '-print_format'), FFProbe::TYPE_STREAMS, array(__FILE__, '-show_streams', '-print_format', 'json')), + array($format, 'format', array('-show_format', '-print_format'), FFProbe::TYPE_FORMAT, array(__FILE__, '-show_format', '-print_format', 'json')), + ); + } + + /** + * @dataProvider provideDataForInvalidJson + */ + public function testProbeWithWrongJson($output, $method, $commands, $type, $caughtCommands) + { + $pathfile = __FILE__; + $data = array('key' => 'value'); + + $ffprobe = new FFProbe($this->getFFProbeDriverMock(), $this->getCacheMock()); + + $mapper = $this->getFFProbeMapperMock(); + $mapper->expects($this->once()) + ->method('map') + ->with($this->isType('string'), 'good data parsed') + ->will($this->returnValue($output)); + + $parser = $this->getFFProbeParserMock(); + $parser->expects($this->once()) + ->method('parse') + ->with($this->isType('string', json_encode($data) . 'lala')) + ->will($this->returnValue('good data parsed')); + + $tester = $this->getFFProbeOptionsTesterMockWithOptions($commands); + + $cache = $this->getCacheMock(); + $cache->expects($this->exactly(2)) + ->method('contains') + ->will($this->returnValue(false)); + $cache->expects($this->never()) + ->method('fetch'); + + $driver = $this->getFFProbeDriverMock(); + $driver->expects($this->exactly(2)) + ->method('command') + ->will($this->returnValue(json_encode($data) . 'lala')); + + $ffprobe->setOptionsTester($tester) + ->setCache($cache) + ->setMapper($mapper) + ->setFFProbeDriver($driver) + ->setParser($parser); + + $this->assertEquals($output, call_user_func(array($ffprobe, $method), $pathfile)); + } + + public function provideProbingDataWithCache() + { + $stream = $this->getStreamMock(); + $format = $this->getFormatMock(); + + return array( + array($stream, 'streams'), + array($format, 'format'), + ); + } + + /** + * @dataProvider provideProbingDataWithCache + */ + public function testProbeWithCache($output, $method) + { + $pathfile = __FILE__; + + $ffprobe = new FFProbe($this->getFFProbeDriverMock(), $this->getCacheMock()); + + $mapper = $this->getFFProbeMapperMock(); + $mapper->expects($this->never()) + ->method('map'); + + $tester = $this->getFFProbeOptionsTesterMock(); + + $cache = $this->getCacheMock(); + $cache->expects($this->once()) + ->method('contains') + ->will($this->returnValue(true)); + $cache->expects($this->once()) + ->method('fetch') + ->will($this->returnValue($output)); + $cache->expects($this->never()) + ->method('save'); + + $driver = $this->getFFProbeDriverMock(); + $driver->expects($this->never()) + ->method('command'); + + $ffprobe->setOptionsTester($tester) + ->setCache($cache) + ->setMapper($mapper) + ->setFFProbeDriver($driver); + + $this->assertEquals($output, call_user_func(array($ffprobe, $method), $pathfile)); + } + + public function provideProbeMethod() + { + return array( + array('streams'), + array('format'), + ); + } + + /** + * @dataProvider provideProbeMethod + */ + public function testProbeWithoutShowStreamsAvailable($method) + { + $this->expectException('\FFMpeg\Exception\RuntimeException'); + $pathfile = __FILE__; + + $ffprobe = new FFProbe($this->getFFProbeDriverMock(), $this->getCacheMock()); + $ffprobe->setOptionsTester($this->getFFProbeOptionsTesterMock()); + call_user_func(array($ffprobe, $method), $pathfile); + } + + /** + * @dataProvider provideCreateOptions + */ + public function testCreate($logger, $conf, $cache) + { + $finder = new ExecutableFinder(); + + $found = false; + foreach (array('avprobe', 'ffprobe') as $name) { + if (null !== $finder->find($name)) { + $found = true; + } + } + + if (!$found) { + $this->markTestSkipped("Unable to find avprobe or ffprobe on system"); + } + + $ffprobe = FFProbe::create(); + $this->assertInstanceOf('FFMpeg\FFprobe', $ffprobe); + + $ffprobe = FFProbe::create($conf, $logger, $cache); + $this->assertInstanceOf('FFMpeg\FFprobe', $ffprobe); + + if (null !== $cache) { + $this->assertSame($cache, $ffprobe->getCache()); + } + if (null !== $logger) { + $this->assertSame($logger, $ffprobe->getFFProbeDriver()->getProcessRunner()->getLogger()); + } + if ($conf instanceof ConfigurationInterface) { + $this->assertSame($conf, $ffprobe->getFFProbeDriver()->getConfiguration()); + } + } + + public function provideCreateOptions() + { + return array( + array(null, array('key' => 'value'), null), + array($this->getLoggerMock(), array('key' => 'value'), null), + array(null, new Configuration(), null), + array(null, array('key' => 'value'), $this->getCacheMock()), + ); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Audio/AudioClipTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Audio/AudioClipTest.php new file mode 100644 index 0000000000..1450e52f38 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Audio/AudioClipTest.php @@ -0,0 +1,47 @@ +getAudioMock(); + $audio->expects($this->once()) + ->method('addFilter') + ->with($this->isInstanceOf('FFMpeg\Filters\Audio\AudioClipFilter')) + ->will($this->returnCallback(function ($filter) use (&$capturedFilter) { + $capturedFilter = $filter; + })); + $format = $this->getMockBuilder('FFMpeg\Format\AudioInterface')->getMock(); + + $filters = new AudioFilters($audio); + + $filters->clip(TimeCode::fromSeconds(5)); + $this->assertEquals(array(0 => '-ss', 1 => '00:00:05.00', 2 => '-acodec', 3 => 'copy'), $capturedFilter->apply($audio, $format)); + } + + public function testClippingWithDuration() { + $capturedFilter = null; + + $audio = $this->getAudioMock(); + $audio->expects($this->once()) + ->method('addFilter') + ->with($this->isInstanceOf('FFMpeg\Filters\Audio\AudioClipFilter')) + ->will($this->returnCallback(function ($filter) use (&$capturedFilter) { + $capturedFilter = $filter; + })); + $format = $this->getMockBuilder('FFMpeg\Format\AudioInterface')->getMock(); + + $filters = new AudioFilters($audio); + + $filters->clip(TimeCode::fromSeconds(5), TimeCode::fromSeconds(5)); + $this->assertEquals(array(0 => '-ss', 1 => '00:00:05.00', 2 => '-t', 3 => '00:00:05.00', 4 => '-acodec', 5 => 'copy'), $capturedFilter->apply($audio, $format)); + } + +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Audio/AudioFiltersTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Audio/AudioFiltersTest.php new file mode 100644 index 0000000000..3bbeae9792 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Audio/AudioFiltersTest.php @@ -0,0 +1,26 @@ +getAudioMock(); + $audio->expects($this->once()) + ->method('addFilter') + ->with($this->isInstanceOf('FFMpeg\Filters\Audio\AudioResamplableFilter')) + ->will($this->returnCallback(function ($filter) use (&$capturedFilter) { + $capturedFilter = $filter; + })); + + $filters = new AudioFilters($audio); + $filters->resample(8000); + $this->assertEquals(8000, $capturedFilter->getRate()); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Audio/AudioMetadataTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Audio/AudioMetadataTest.php new file mode 100644 index 0000000000..dc20879730 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Audio/AudioMetadataTest.php @@ -0,0 +1,64 @@ +getAudioMock(); + $audio->expects($this->once()) + ->method('addFilter') + ->with($this->isInstanceOf('FFMpeg\Filters\Audio\AddMetadataFilter')) + ->will($this->returnCallback(function ($filter) use (&$capturedFilter) { + $capturedFilter = $filter; + })); + $format = $this->getMockBuilder('FFMpeg\Format\AudioInterface')->getMock(); + + $filters = new AudioFilters($audio); + $filters->addMetadata(array('title' => "Hello World")); + $this->assertEquals(array(0 => "-metadata", 1 => "title=Hello World"), $capturedFilter->apply($audio, $format)); + } + + public function testAddArtwork() + { + $capturedFilter = null; + + $audio = $this->getAudioMock(); + $audio->expects($this->once()) + ->method('addFilter') + ->with($this->isInstanceOf('FFMpeg\Filters\Audio\AddMetadataFilter')) + ->will($this->returnCallback(function ($filter) use (&$capturedFilter) { + $capturedFilter = $filter; + })); + $format = $this->getMockBuilder('FFMpeg\Format\AudioInterface')->getMock(); + + $filters = new AudioFilters($audio); + $filters->addMetadata(array('genre' => 'Some Genre', 'artwork' => "/path/to/file.jpg")); + $this->assertEquals(array(0 => "-i", 1 => "/path/to/file.jpg", 2 => "-map", 3 => "0", 4 => "-map", 5 => "1", 6 => "-metadata", 7 => "genre=Some Genre"), $capturedFilter->apply($audio, $format)); + $this->assertEquals(array(0 => "-i", 1 => "/path/to/file.jpg", 2 => "-map", 3 => "0", 4 => "-map", 5 => "1", 6 => "-metadata", 7 => "genre=Some Genre"), $capturedFilter->apply($audio, $format)); + } + + public function testRemoveMetadata() + { + $capturedFilter = null; + + $audio = $this->getAudioMock(); + $audio->expects($this->once()) + ->method('addFilter') + ->with($this->isInstanceOf('FFMpeg\Filters\Audio\AddMetadataFilter')) + ->will($this->returnCallback(function ($filter) use (&$capturedFilter) { + $capturedFilter = $filter; + })); + $format = $this->getMockBuilder('FFMpeg\Format\AudioInterface')->getMock(); + + $filters = new AudioFilters($audio); + $filters->addMetadata(); + $this->assertEquals(array(0 => "-map_metadata", 1 => "-1", 2 => "-vn"), $capturedFilter->apply($audio, $format)); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Audio/AudioResamplableFilterTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Audio/AudioResamplableFilterTest.php new file mode 100644 index 0000000000..ffdc3ead89 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Audio/AudioResamplableFilterTest.php @@ -0,0 +1,24 @@ +assertEquals(500, $filter->getRate()); + } + + public function testApply() + { + $audio = $this->getAudioMock(); + $format = $this->getMockBuilder('FFMpeg\Format\AudioInterface')->getMock(); + + $filter = new AudioResamplableFilter(500); + $this->assertEquals(array('-ac', 2, '-ar', 500), $filter->apply($audio, $format)); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Audio/CustomFilterTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Audio/CustomFilterTest.php new file mode 100644 index 0000000000..df80f481c6 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Audio/CustomFilterTest.php @@ -0,0 +1,20 @@ +getAudioMock(); + $format = $this->getMockBuilder('FFMpeg\Format\AudioInterface')->getMock(); + + $filter = new CustomFilter('whatever i put would end up as a filter'); + $this->assertEquals(array('-af', 'whatever i put would end up as a filter'), $filter->apply($audio, $format)); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/FiltersCollectionTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/FiltersCollectionTest.php new file mode 100644 index 0000000000..55c09eb60d --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/FiltersCollectionTest.php @@ -0,0 +1,62 @@ +assertCount(0, $coll); + + $coll->add($this->getMockBuilder('FFMpeg\Filters\FilterInterface')->getMock()); + $this->assertCount(1, $coll); + + $coll->add($this->getMockBuilder('FFMpeg\Filters\FilterInterface')->getMock()); + $this->assertCount(2, $coll); + } + + public function testIterator() + { + $coll = new FiltersCollection(); + $coll->add($this->getMockBuilder('FFMpeg\Filters\FilterInterface')->getMock()); + $coll->add($this->getMockBuilder('FFMpeg\Filters\FilterInterface')->getMock()); + + $this->assertInstanceOf('\ArrayIterator', $coll->getIterator()); + $this->assertCount(2, $coll->getIterator()); + } + + public function testEmptyIterator() + { + $coll = new FiltersCollection(); + $this->assertInstanceOf('\ArrayIterator', $coll->getIterator()); + } + + public function testIteratorSort() + { + $coll = new FiltersCollection(); + $coll->add(new SimpleFilter(array('a'))); + $coll->add(new SimpleFilter(array('1'), 12)); + $coll->add(new SimpleFilter(array('b'))); + $coll->add(new SimpleFilter(array('2'), 12)); + $coll->add(new SimpleFilter(array('c'))); + $coll->add(new SimpleFilter(array('3'), 10)); + $coll->add(new SimpleFilter(array('d'))); + $coll->add(new SimpleFilter(array('4'), -2)); + $coll->add(new SimpleFilter(array('e'))); + + $data = array(); + $video = $this->getVideoMock(); + $format = $this->getMockBuilder('FFMpeg\Format\AudioInterface')->getMock(); + + foreach ($coll as $filter) { + $data = array_merge($data, $filter->apply($video, $format)); + } + + $this->assertEquals(array('1', '2', '3', 'a', 'b', 'c', 'd', 'e', '4'), $data); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Frame/CustomFrameFilterTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Frame/CustomFrameFilterTest.php new file mode 100644 index 0000000000..98869af0d8 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Frame/CustomFrameFilterTest.php @@ -0,0 +1,17 @@ +getFrameMock(); + + $filter = new CustomFrameFilter('whatever i put would end up as a filter'); + $this->assertEquals(array('-vf', 'whatever i put would end up as a filter'), $filter->apply($frame)); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Frame/DisplayRatioFixerFilterTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Frame/DisplayRatioFixerFilterTest.php new file mode 100644 index 0000000000..5b40b327ab --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Frame/DisplayRatioFixerFilterTest.php @@ -0,0 +1,28 @@ + 'video', 'width' => 960, 'height' => 720)); + $streams = new StreamCollection(array($stream)); + + $video = $this->getVideoMock(__FILE__); + $video->expects($this->once()) + ->method('getStreams') + ->will($this->returnValue($streams)); + + $frame = new Frame($video, $this->getFFMpegDriverMock(), $this->getFFProbeMock(), new TimeCode(0, 0, 0, 0)); + $filter = new DisplayRatioFixerFilter(); + $this->assertEquals(array('-s', '960x720'), $filter->apply($frame)); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Frame/FrameFiltersTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Frame/FrameFiltersTest.php new file mode 100644 index 0000000000..891ba4fc46 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Frame/FrameFiltersTest.php @@ -0,0 +1,21 @@ +getFrameMock(); + $filters = new FrameFilters($frame); + + $frame->expects($this->once()) + ->method('addFilter') + ->with($this->isInstanceOf('FFMpeg\Filters\Frame\DisplayRatioFixerFilter')); + + $filters->fixDisplayRatio(); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Video/CropFilterTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Video/CropFilterTest.php new file mode 100644 index 0000000000..54afadbd6c --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Video/CropFilterTest.php @@ -0,0 +1,40 @@ + 320, 'height' => 240, 'codec_type' => 'video')); + $streams = new StreamCollection(array($stream)); + + $video = $this->getVideoMock(); + $video->expects($this->once()) + ->method('getStreams') + ->will($this->returnValue($streams)); + + $format = $this->getMockBuilder('FFMpeg\Format\VideoInterface')->getMock(); + + $dimension = new Dimension(200, 150); + $point = new Point(25, 35); + $filter = new CropFilter($point, $dimension); + $expected = array( + '-filter:v', + 'crop=' . $dimension->getWidth() . ":" . $dimension->getHeight() . ":" . $point->getX() . ":" . $point->getY() + ); + $this->assertEquals($expected, $filter->apply($video, $format)); + + $this->assertEquals(200, $stream->get('width')); + $this->assertEquals(150, $stream->get('height')); + } + +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Video/CustomFilterTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Video/CustomFilterTest.php new file mode 100644 index 0000000000..403c29d731 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Video/CustomFilterTest.php @@ -0,0 +1,20 @@ +getVideoMock(); + $format = $this->getMockBuilder('FFMpeg\Format\VideoInterface')->getMock(); + + $filter = new CustomFilter('whatever i put would end up as a filter'); + $this->assertEquals(array('-vf', 'whatever i put would end up as a filter'), $filter->apply($video, $format)); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Video/ExtractMultipleFramesFilterTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Video/ExtractMultipleFramesFilterTest.php new file mode 100644 index 0000000000..23981c290a --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Video/ExtractMultipleFramesFilterTest.php @@ -0,0 +1,72 @@ +getVideoMock(); + $pathfile = '/path/to/file'.mt_rand(); + + $format = $this->getMockBuilder('FFMpeg\Format\VideoInterface')->getMock(); + $format->expects($this->any()) + ->method('getModulus') + ->will($this->returnValue($modulus)); + + $streams = new StreamCollection(array( + new Stream(array( + 'codec_type' => 'video', + 'duration' => $duration, + )) + )); + + $video->expects($this->once()) + ->method('getStreams') + ->will($this->returnValue($streams)); + + $filter = new ExtractMultipleFramesFilter($frameRate, $destinationFolder); + $filter->setFrameFileType($frameFileType); + $this->assertEquals($expected, $filter->apply($video, $format)); + } + + public function provideFrameRates() + { + return array( + array(ExtractMultipleFramesFilter::FRAMERATE_EVERY_SEC, 'jpg', '/', 100, 2, array('-vf', 'fps=1/1', '/frame-%03d.jpg')), + array(ExtractMultipleFramesFilter::FRAMERATE_EVERY_2SEC, 'jpg', '/', 100, 2, array('-vf', 'fps=1/2', '/frame-%02d.jpg')), + array(ExtractMultipleFramesFilter::FRAMERATE_EVERY_5SEC, 'jpg', '/', 100, 2, array('-vf', 'fps=1/5', '/frame-%02d.jpg')), + array(ExtractMultipleFramesFilter::FRAMERATE_EVERY_10SEC, 'jpg', '/', 100, 2, array('-vf', 'fps=1/10', '/frame-%02d.jpg')), + array(ExtractMultipleFramesFilter::FRAMERATE_EVERY_30SEC, 'jpg', '/', 100, 2, array('-vf', 'fps=1/30', '/frame-%02d.jpg')), + array(ExtractMultipleFramesFilter::FRAMERATE_EVERY_60SEC, 'jpg', '/', 100, 2, array('-vf', 'fps=1/60', '/frame-%02d.jpg')), + + array(ExtractMultipleFramesFilter::FRAMERATE_EVERY_SEC, 'jpeg', '/', 100, 2, array('-vf', 'fps=1/1', '/frame-%03d.jpeg')), + array(ExtractMultipleFramesFilter::FRAMERATE_EVERY_2SEC, 'jpeg', '/', 100, 2, array('-vf', 'fps=1/2', '/frame-%02d.jpeg')), + array(ExtractMultipleFramesFilter::FRAMERATE_EVERY_5SEC, 'jpeg', '/', 100, 2, array('-vf', 'fps=1/5', '/frame-%02d.jpeg')), + array(ExtractMultipleFramesFilter::FRAMERATE_EVERY_10SEC, 'jpeg', '/', 100, 2, array('-vf', 'fps=1/10', '/frame-%02d.jpeg')), + array(ExtractMultipleFramesFilter::FRAMERATE_EVERY_30SEC, 'jpeg', '/', 100, 2, array('-vf', 'fps=1/30', '/frame-%02d.jpeg')), + array(ExtractMultipleFramesFilter::FRAMERATE_EVERY_60SEC, 'jpeg', '/', 100, 2, array('-vf', 'fps=1/60', '/frame-%02d.jpeg')), + + array(ExtractMultipleFramesFilter::FRAMERATE_EVERY_SEC, 'png', '/', 100, 2, array('-vf', 'fps=1/1', '/frame-%03d.png')), + array(ExtractMultipleFramesFilter::FRAMERATE_EVERY_2SEC, 'png', '/', 100, 2, array('-vf', 'fps=1/2', '/frame-%02d.png')), + array(ExtractMultipleFramesFilter::FRAMERATE_EVERY_5SEC, 'png', '/', 100, 2, array('-vf', 'fps=1/5', '/frame-%02d.png')), + array(ExtractMultipleFramesFilter::FRAMERATE_EVERY_10SEC, 'png', '/', 100, 2, array('-vf', 'fps=1/10', '/frame-%02d.png')), + array(ExtractMultipleFramesFilter::FRAMERATE_EVERY_30SEC, 'png', '/', 100, 2, array('-vf', 'fps=1/30', '/frame-%02d.png')), + array(ExtractMultipleFramesFilter::FRAMERATE_EVERY_60SEC, 'png', '/', 100, 2, array('-vf', 'fps=1/60', '/frame-%02d.png')), + ); + } + + public function testInvalidFrameFileType() { + $this->expectException('\FFMpeg\Exception\InvalidArgumentException'); + $filter = new ExtractMultipleFramesFilter('1/1', '/'); + $filter->setFrameFileType('webm'); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Video/FrameRateFilterTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Video/FrameRateFilterTest.php new file mode 100644 index 0000000000..8e3693bf2f --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Video/FrameRateFilterTest.php @@ -0,0 +1,44 @@ +getVideoMock(); + $format = $this->getMockBuilder('FFMpeg\Format\VideoInterface')->getMock(); + $format->expects($this->any()) + ->method('supportBFrames') + ->will($this->returnValue(true)); + + $expected = array('-r', 54, '-b_strategy', '1', '-bf', '3', '-g', 42); + + $filter = new FrameRateFilter($framerate, $gop); + $this->assertEquals($expected, $filter->apply($video, $format)); + } + + public function testApplyWithAFormatThatDoesNotSupportsBFrames() + { + $framerate = new FrameRate(54); + $gop = 42; + + $video = $this->getVideoMock(); + $format = $this->getMockBuilder('FFMpeg\Format\VideoInterface')->getMock(); + $format->expects($this->any()) + ->method('supportBFrames') + ->will($this->returnValue(false)); + + $expected = array('-r', 54); + + $filter = new FrameRateFilter($framerate, $gop); + $this->assertEquals($expected, $filter->apply($video, $format)); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Video/PadFilterTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Video/PadFilterTest.php new file mode 100644 index 0000000000..04b9ae57e2 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Video/PadFilterTest.php @@ -0,0 +1,44 @@ +getVideoMock(); + $pathfile = '/path/to/file'.mt_rand(); + + $format = $this->getMockBuilder('FFMpeg\Format\VideoInterface')->getMock(); + + $streams = new StreamCollection(array( + new Stream(array( + 'codec_type' => 'video', + 'width' => $width, + 'height' => $height, + )) + )); + + $filter = new PadFilter($dimension); + $this->assertEquals($expected, $filter->apply($video, $format)); + } + + public function provideDimensions() + { + return array( + array(new Dimension(1000, 800), 640, 480, array('-vf', 'scale=iw*min(1000/iw\,800/ih):ih*min(1000/iw\,800/ih),pad=1000:800:(1000-iw)/2:(800-ih)/2')), + array(new Dimension(300, 600), 640, 480, array('-vf', 'scale=iw*min(300/iw\,600/ih):ih*min(300/iw\,600/ih),pad=300:600:(300-iw)/2:(600-ih)/2')), + array(new Dimension(100, 900), 640, 480, array('-vf', 'scale=iw*min(100/iw\,900/ih):ih*min(100/iw\,900/ih),pad=100:900:(100-iw)/2:(900-ih)/2')), + array(new Dimension(1200, 200), 640, 480, array('-vf', 'scale=iw*min(1200/iw\,200/ih):ih*min(1200/iw\,200/ih),pad=1200:200:(1200-iw)/2:(200-ih)/2')), + ); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Video/ResizeFilterTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Video/ResizeFilterTest.php new file mode 100644 index 0000000000..82eebf80dc --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Video/ResizeFilterTest.php @@ -0,0 +1,75 @@ +getVideoMock(); + $pathfile = '/path/to/file'.mt_rand(); + + $format = $this->getMockBuilder('FFMpeg\Format\VideoInterface')->getMock(); + $format->expects($this->any()) + ->method('getModulus') + ->will($this->returnValue($modulus)); + + $streams = new StreamCollection(array( + new Stream(array( + 'codec_type' => 'video', + 'width' => $width, + 'height' => $height, + )) + )); + + $video->expects($this->once()) + ->method('getStreams') + ->will($this->returnValue($streams)); + + $filter = new ResizeFilter($dimension, $mode, $forceStandards); + $this->assertEquals($expected, $filter->apply($video, $format)); + } + + public function provideDimensions() + { + return array( + array(new Dimension(320, 240), ResizeFilter::RESIZEMODE_FIT, 640, 480, 2, array('-vf', '[in]scale=320:240 [out]')), + array(new Dimension(320, 240), ResizeFilter::RESIZEMODE_INSET, 640, 480, 2, array('-vf', '[in]scale=320:240 [out]')), + array(new Dimension(320, 240), ResizeFilter::RESIZEMODE_SCALE_HEIGHT, 640, 480, 2, array('-vf', '[in]scale=320:240 [out]')), + array(new Dimension(320, 240), ResizeFilter::RESIZEMODE_SCALE_WIDTH, 640, 480, 2, array('-vf', '[in]scale=320:240 [out]')), + + array(new Dimension(640, 480), ResizeFilter::RESIZEMODE_FIT, 320, 240, 2, array('-vf', '[in]scale=640:480 [out]')), + array(new Dimension(640, 480), ResizeFilter::RESIZEMODE_INSET, 320, 240, 2, array('-vf', '[in]scale=640:480 [out]')), + array(new Dimension(640, 480), ResizeFilter::RESIZEMODE_SCALE_HEIGHT, 320, 240, 2, array('-vf', '[in]scale=640:480 [out]')), + array(new Dimension(640, 480), ResizeFilter::RESIZEMODE_SCALE_WIDTH, 320, 240, 2, array('-vf', '[in]scale=640:480 [out]')), + + array(new Dimension(640, 360), ResizeFilter::RESIZEMODE_FIT, 1280, 720, 2, array('-vf', '[in]scale=640:360 [out]')), + array(new Dimension(640, 360), ResizeFilter::RESIZEMODE_INSET, 1280, 720, 2, array('-vf', '[in]scale=640:360 [out]')), + array(new Dimension(640, 360), ResizeFilter::RESIZEMODE_SCALE_HEIGHT, 1280, 720, 2, array('-vf', '[in]scale=640:360 [out]')), + array(new Dimension(640, 360), ResizeFilter::RESIZEMODE_SCALE_WIDTH, 1280, 720, 2, array('-vf', '[in]scale=640:360 [out]')), + + array(new Dimension(640, 360), ResizeFilter::RESIZEMODE_FIT, 1280, 720, 2, array('-vf', '[in]scale=640:360 [out]')), + array(new Dimension(640, 360), ResizeFilter::RESIZEMODE_INSET, 1280, 720, 2, array('-vf', '[in]scale=640:360 [out]')), + array(new Dimension(640, 360), ResizeFilter::RESIZEMODE_SCALE_HEIGHT, 1280, 720, 2, array('-vf', '[in]scale=640:360 [out]')), + array(new Dimension(640, 360), ResizeFilter::RESIZEMODE_SCALE_WIDTH, 1280, 720, 2, array('-vf', '[in]scale=640:360 [out]')), + + // test non standard dimension + array(new Dimension(700, 150), ResizeFilter::RESIZEMODE_INSET, 123, 456, 2, array('-vf', '[in]scale=62:150 [out]'), true), + array(new Dimension(700, 150), ResizeFilter::RESIZEMODE_INSET, 123, 456, 2, array('-vf', '[in]scale=40:150 [out]'), false), + + array(new Dimension(320, 320), ResizeFilter::RESIZEMODE_FIT, 640, 480, 2, array('-vf', '[in]scale=320:320 [out]')), + array(new Dimension(320, 320), ResizeFilter::RESIZEMODE_INSET, 640, 480, 2, array('-vf', '[in]scale=320:240 [out]')), + array(new Dimension(320, 320), ResizeFilter::RESIZEMODE_SCALE_HEIGHT, 640, 480, 2, array('-vf', '[in]scale=320:240 [out]')), + array(new Dimension(320, 320), ResizeFilter::RESIZEMODE_SCALE_WIDTH, 640, 480, 2, array('-vf', '[in]scale=426:320 [out]')), + ); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Video/RotateFilterTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Video/RotateFilterTest.php new file mode 100644 index 0000000000..7aa956a609 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Video/RotateFilterTest.php @@ -0,0 +1,72 @@ + 320, 'height' => 240, 'codec_type' => 'video')); + $streams = new StreamCollection(array($stream)); + + $video = $this->getVideoMock(); + $video->expects($this->once()) + ->method('getStreams') + ->will($this->returnValue($streams)); + + $format = $this->getMockBuilder('FFMpeg\Format\VideoInterface')->getMock(); + + $filter = new RotateFilter($value); + $this->assertEquals(array('-vf', $value, '-metadata:s:v:0', 'rotate=0'), $filter->apply($video, $format)); + + $this->assertEquals(240, $stream->get('width')); + $this->assertEquals(320, $stream->get('height')); + } + + public function provide90degresTranspositions() + { + return array( + array(RotateFilter::ROTATE_90), + array(RotateFilter::ROTATE_270), + ); + } + + /** + * @dataProvider provideDegresWithoutTranspositions + */ + public function testApplyWithoutSizeTransformation($value) + { + $video = $this->getVideoMock(); + $video->expects($this->never()) + ->method('getStreams'); + + $format = $this->getMockBuilder('FFMpeg\Format\VideoInterface')->getMock(); + + $filter = new RotateFilter($value); + $this->assertEquals(array('-vf', $value, '-metadata:s:v:0', 'rotate=0'), $filter->apply($video, $format)); + } + + public function provideDegresWithoutTranspositions() + { + return array( + array(RotateFilter::ROTATE_180), + ); + } + + public function testApplyInvalidAngle() + { + $this->expectException( + '\FFMpeg\Exception\InvalidArgumentException', + 'Invalid angle value.' + ); + new RotateFilter('90'); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Video/SynchronizeFilterTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Video/SynchronizeFilterTest.php new file mode 100644 index 0000000000..7986d76cb6 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Video/SynchronizeFilterTest.php @@ -0,0 +1,18 @@ +getVideoMock(); + $format = $this->getMockBuilder('FFMpeg\Format\VideoInterface')->getMock(); + + $filter = new SynchronizeFilter(); + $this->assertEquals(array('-async', '1', '-metadata:s:v:0', 'start_time=0'), $filter->apply($video, $format)); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Video/VideoFiltersTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Video/VideoFiltersTest.php new file mode 100644 index 0000000000..7ca3fe9220 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Video/VideoFiltersTest.php @@ -0,0 +1,79 @@ +getVideoMock(); + $filters = new VideoFilters($video); + $dimension = $this->getDimensionMock(); + + $video->expects($this->once()) + ->method('addFilter') + ->with($this->isInstanceOf('FFMpeg\Filters\Video\ResizeFilter')) + ->will($this->returnCallback(function ($filter) use (&$capturedFilter) { + $capturedFilter = $filter; + })); + + $filters->resize($dimension, $mode, $forceStandards); + + $this->assertSame($mode, $capturedFilter->getMode()); + $this->assertSame($forceStandards, $capturedFilter->areStandardsForced()); + $this->assertSame($dimension, $capturedFilter->getDimension()); + } + + public function provideResizeOptions() + { + return array( + array(ResizeFilter::RESIZEMODE_FIT, true), + array(ResizeFilter::RESIZEMODE_SCALE_WIDTH, true), + array(ResizeFilter::RESIZEMODE_SCALE_HEIGHT, false), + array(ResizeFilter::RESIZEMODE_INSET, false), + ); + } + + public function testResample() + { + $capturedFilter = null; + + $video = $this->getVideoMock(); + $filters = new VideoFilters($video); + $framerate = $this->getFramerateMock(); + $gop = 42; + + $video->expects($this->once()) + ->method('addFilter') + ->with($this->isInstanceOf('FFMpeg\Filters\Video\FrameRateFilter')) + ->will($this->returnCallback(function ($filter) use (&$capturedFilter) { + $capturedFilter = $filter; + })); + + $filters->framerate($framerate, $gop); + + $this->assertSame($framerate, $capturedFilter->getFramerate()); + $this->assertSame($gop, $capturedFilter->getGOP()); + } + + public function testSynchronize() + { + $video = $this->getVideoMock(); + $filters = new VideoFilters($video); + + $video->expects($this->once()) + ->method('addFilter') + ->with($this->isInstanceOf('FFMpeg\Filters\Video\SynchronizeFilter')); + + $filters->synchronize(); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Video/WatermarkFilterTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Video/WatermarkFilterTest.php new file mode 100644 index 0000000000..8fd43a8f5e --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Video/WatermarkFilterTest.php @@ -0,0 +1,63 @@ + 320, 'height' => 240, 'codec_type' => 'video')); + $streams = new StreamCollection(array($stream)); + + $video = $this->getVideoMock(); + + $format = $this->getMockBuilder('FFMpeg\Format\VideoInterface')->getMock(); + + $filter = new WatermarkFilter(__DIR__ . '/../../../files/watermark.png'); + $this->assertEquals(array('-vf', 'movie='.__DIR__ .'/../../../files/watermark.png [watermark]; [in][watermark] overlay=0:0 [out]'), $filter->apply($video, $format)); + + // check size of video is unchanged + $this->assertEquals(320, $stream->get('width')); + $this->assertEquals(240, $stream->get('height')); + } + + public function testDifferentCoordinaates() + { + $video = $this->getVideoMock(); + $format = $this->getMockBuilder('FFMpeg\Format\VideoInterface')->getMock(); + + // test position absolute + $filter = new WatermarkFilter(__DIR__ . '/../../../files/watermark.png', array( + 'position' => 'absolute', + 'x' => 10, 'y' => 5 + )); + $this->assertEquals(array('-vf', 'movie='.__DIR__ .'/../../../files/watermark.png [watermark]; [in][watermark] overlay=10:5 [out]'), $filter->apply($video, $format)); + + // test position relative + $filter = new WatermarkFilter(__DIR__ . '/../../../files/watermark.png', array( + 'position' => 'relative', + 'bottom' => 10, 'left' => 5 + )); + $this->assertEquals(array('-vf', 'movie='.__DIR__ .'/../../../files/watermark.png [watermark]; [in][watermark] overlay=5:main_h - 10 - overlay_h [out]'), $filter->apply($video, $format)); + + // test position relative + $filter = new WatermarkFilter(__DIR__ . '/../../../files/watermark.png', array( + 'position' => 'relative', + 'bottom' => 5, 'right' => 4 + )); + $this->assertEquals(array('-vf', 'movie='.__DIR__ .'/../../../files/watermark.png [watermark]; [in][watermark] overlay=main_w - 4 - overlay_w:main_h - 5 - overlay_h [out]'), $filter->apply($video, $format)); + + // test position relative + $filter = new WatermarkFilter(__DIR__ . '/../../../files/watermark.png', array( + 'position' => 'relative', + 'left' => 5, 'top' => 11 + )); + $this->assertEquals(array('-vf', 'movie='.__DIR__ .'/../../../files/watermark.png [watermark]; [in][watermark] overlay=5:11 [out]'), $filter->apply($video, $format)); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Waveform/WaveformDownmixFilterTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Waveform/WaveformDownmixFilterTest.php new file mode 100644 index 0000000000..527d0013ca --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Waveform/WaveformDownmixFilterTest.php @@ -0,0 +1,28 @@ + 'audio', 'width' => 960, 'height' => 720)); + $streams = new StreamCollection(array($stream)); + + $audio = $this->getAudioMock(__FILE__); + $audio->expects($this->once()) + ->method('getStreams') + ->will($this->returnValue($streams)); + + $waveform = new Waveform($audio, $this->getFFMpegDriverMock(), $this->getFFProbeMock(), 640, 120); + $filter = new WaveformDownmixFilter(TRUE); + $this->assertEquals(array('"aformat=channel_layouts=mono"'), $filter->apply($waveform)); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Waveform/WaveformFiltersTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Waveform/WaveformFiltersTest.php new file mode 100644 index 0000000000..b35c7a3abc --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Filters/Waveform/WaveformFiltersTest.php @@ -0,0 +1,21 @@ +getWaveformMock(); + $filters = new WaveformFilters($Waveform); + + $Waveform->expects($this->once()) + ->method('addFilter') + ->with($this->isInstanceOf('FFMpeg\Filters\Waveform\WaveformDownmixFilter')); + + $filters->setDownmix(); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Format/Audio/AacTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Format/Audio/AacTest.php new file mode 100644 index 0000000000..7c316b5ce7 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Format/Audio/AacTest.php @@ -0,0 +1,13 @@ +getFormat()->getExtraParams(); + + $this->assertIsArray($extraParams); + + foreach ($extraParams as $param) { + $this->assertScalar($param); + } + } + + public function testGetAudioCodec() + { + $this->assertScalar($this->getFormat()->getAudioCodec()); + $this->assertContains($this->getFormat()->getAudioCodec(), $this->getFormat()->getAvailableAudioCodecs()); + } + + public function testSetAudioCodec() + { + $format = $this->getFormat(); + + foreach ($format->getAvailableAudioCodecs() as $codec) { + $format->setAudioCodec($codec); + $this->assertEquals($codec, $format->getAudioCodec()); + } + } + + public function testSetInvalidAudioCodec() + { + $this->expectException('\FFMpeg\Exception\InvalidArgumentException'); + $this->getFormat()->setAudioCodec('invalid-random-audio-codec'); + } + + public function testGetAvailableAudioCodecs() + { + $this->assertGreaterThan(0, count($this->getFormat()->getAvailableAudioCodecs())); + } + + public function testGetAudioKiloBitrate() + { + $this->assertIsInt($this->getFormat()->getAudioKiloBitrate()); + } + + public function testSetAudioKiloBitrate() + { + $format = $this->getFormat(); + $format->setAudioKiloBitrate(256); + $this->assertEquals(256, $format->getAudioKiloBitrate()); + } + + public function testSetInvalidKiloBitrate() + { + $this->expectException('\FFMpeg\Exception\InvalidArgumentException'); + $this->getFormat()->setAudioKiloBitrate(0); + } + + public function testSetNegativeKiloBitrate() + { + $this->expectException('\FFMpeg\Exception\InvalidArgumentException'); + $this->getFormat()->setAudioKiloBitrate(-10); + } + + public function testGetAudioChannels() + { + $this->assertNull($this->getFormat()->getAudioChannels()); + } + + public function testSetAudioChannels() + { + $format = $this->getFormat(); + $format->setAudioChannels(2); + $this->assertEquals(2, $format->getAudioChannels()); + } + + public function testSetInvalidChannels() + { + $this->expectException('\FFMpeg\Exception\InvalidArgumentException'); + $this->getFormat()->setAudioChannels(0); + } + + public function testSetNegativeChannels() + { + $this->expectException('\FFMpeg\Exception\InvalidArgumentException'); + $this->getFormat()->setAudioChannels(-10); + } + + public function testCreateProgressListener() + { + $media = $this->getMockBuilder('FFMpeg\Media\MediaTypeInterface')->getMock(); + $media->expects($this->any()) + ->method('getPathfile') + ->will($this->returnValue(__FILE__)); + $format = $this->getFormat(); + $ffprobe = $this->getFFProbeMock(); + + foreach ($format->createProgressListener($media, $ffprobe, 1, 3) as $listener) { + $this->assertInstanceOf('FFMpeg\Format\ProgressListener\AudioProgressListener', $listener); + $this->assertSame($ffprobe, $listener->getFFProbe()); + $this->assertSame(__FILE__, $listener->getPathfile()); + $this->assertSame(1, $listener->getCurrentPass()); + $this->assertSame(3, $listener->getTotalPass()); + } + } + + /** + * @return DefaultAudio + */ + abstract public function getFormat(); +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Format/Audio/FlacTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Format/Audio/FlacTest.php new file mode 100644 index 0000000000..cbcc2f4956 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Format/Audio/FlacTest.php @@ -0,0 +1,13 @@ +getFFProbeMock(); + $ffprobe->expects($this->once()) + ->method('format') + ->with(__FILE__) + ->will($this->returnValue(new Format(array( + 'size' => $size, + 'duration' => $duration, + )))); + + $listener = new AudioProgressListener($ffprobe, __FILE__, $currentPass, $totalPass); + $phpunit = $this; + $n = 0; + $listener->on('progress', function ($percent, $remaining, $rate) use (&$n, $phpunit, $expectedPercent, $expectedRemaining, $expectedRate, $expectedPercent2, $expectedRemaining2, $expectedRate2) { + if (0 === $n) { + $phpunit->assertEquals($expectedPercent, $percent); + $phpunit->assertEquals($expectedRemaining, $remaining); + $phpunit->assertEquals($expectedRate, $rate); + } elseif (1 === $n) { + $phpunit->assertEquals($expectedPercent2, $percent); + $phpunit->assertEquals($expectedRemaining2, $remaining); + $phpunit->assertLessThan($expectedRate2 + 3, $rate); + $phpunit->assertGreaterThan($expectedRate2 - 3, $rate); + } + $n++; + }); + // first one does not trigger progress event + $listener->handle('any-type'.mt_rand(), $data); + sleep(1); + $listener->handle('any-type'.mt_rand(), $data); + sleep(1); + $listener->handle('any-type'.mt_rand(), $data2); + $this->assertEquals(2, $n); + } + + public function provideData() + { + return array( + array( + 2894412, + 180.900750, + 'size= 712kB time=00:00:45.50 bitrate= 128.1kbits/s', + 25, + 0, + 0, + 'size= 1274kB time=00:01:29.32 bitrate= 142.8kbits/s', + 49, + 2, + 563, + 1, + 1 + ), + array( + 2894412, + 180.900750, + 'size= 712kB time=00:00:45.50 bitrate= 128.1kbits/s', + 12, + 0, + 0, + 'size= 1274kB time=00:01:29.32 bitrate= 142.8kbits/s', + 24, + 2, + 563, + 1, + 2 + ) + ); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Format/ProgressListener/VideoProgressListenerTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Format/ProgressListener/VideoProgressListenerTest.php new file mode 100644 index 0000000000..9e0bd28a59 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Format/ProgressListener/VideoProgressListenerTest.php @@ -0,0 +1,104 @@ +getFFProbeMock(); + $ffprobe->expects($this->once()) + ->method('format') + ->with(__FILE__) + ->will($this->returnValue(new Format(array( + 'size' => $size, + 'duration' => $duration, + )))); + + $listener = new VideoProgressListener($ffprobe, __FILE__, $currentPass, $totalPass, $newVideoDuration); + $phpunit = $this; + $n = 0; + $listener->on('progress', function ($percent, $remaining, $rate) use (&$n, $phpunit, $expectedPercent, $expectedRemaining, $expectedRate, $expectedPercent2, $expectedRemaining2, $expectedRate2) { + if (0 === $n) { + $phpunit->assertEquals($expectedPercent, $percent); + $phpunit->assertEquals($expectedRemaining, $remaining); + $phpunit->assertEquals($expectedRate, $rate); + } elseif (1 === $n) { + $phpunit->assertEquals($expectedPercent2, $percent); + $phpunit->assertEquals($expectedRemaining2, $remaining); + $phpunit->assertLessThan($expectedRate2 + 10, $rate); + $phpunit->assertGreaterThan($expectedRate2 - 10, $rate); + } + $n++; + }); + // first one does not trigger progress event + $listener->handle('any-type'.mt_rand(), $data); + sleep(1); + $listener->handle('any-type'.mt_rand(), $data); + sleep(1); + $listener->handle('any-type'.mt_rand(), $data2); + $this->assertEquals(2, $n); + } + + public function provideData() + { + return array( + array( + 147073958, + 281.147533, + 281.147533, + 'frame= 206 fps=202 q=10.0 size= 571kB time=00:00:07.12 bitrate= 656.8kbits/s dup=9 drop=0', + 2, + 0, + 0, + 'frame= 854 fps=113 q=20.0 size= 4430kB time=00:00:33.04 bitrate=1098.5kbits/s dup=36 drop=0', + 11, + 32, + 3868, + 1, + 1 + ), + array( + 147073958, + 281.147533, + 281.147533, + 'frame= 206 fps=202 q=10.0 size= 571kB time=00:00:07.12 bitrate= 656.8kbits/s dup=9 drop=0', + 1, + 0, + 0, + 'frame= 854 fps=113 q=20.0 size= 4430kB time=00:00:33.04 bitrate=1098.5kbits/s dup=36 drop=0', + 5, + 32, + 3868, + 1, + 2 + ), + array( + 147073958, + 281.147533, + 35, + 'frame= 206 fps=202 q=10.0 size= 571kB time=00:00:07.12 bitrate= 656.8kbits/s dup=9 drop=0', + 60, + 0, + 0, + 'frame= 854 fps=113 q=20.0 size= 4430kB time=00:00:33.04 bitrate=1098.5kbits/s dup=36 drop=0', + 97, + 0, + 3868, + 2, + 2 + ) + ); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Format/Video/InitialParametersTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Format/Video/InitialParametersTest.php new file mode 100644 index 0000000000..932be07973 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Format/Video/InitialParametersTest.php @@ -0,0 +1,16 @@ +setInitialParameters(array('-acodec', 'libopus')); + $this->assertEquals(array('-acodec', 'libopus'), $format->getInitialParameters()); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Format/Video/OggTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Format/Video/OggTest.php new file mode 100644 index 0000000000..56f03db767 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Format/Video/OggTest.php @@ -0,0 +1,13 @@ +assertScalar($this->getFormat()->getVideoCodec()); + $this->assertContains($this->getFormat()->getVideoCodec(), $this->getFormat()->getAvailableVideoCodecs()); + } + + public function testSupportBFrames() + { + $this->assertIsBool($this->getFormat()->supportBFrames()); + } + + public function testSetVideoCodec() + { + $format = $this->getFormat(); + + foreach ($format->getAvailableVideoCodecs() as $codec) { + $format->setVideoCodec($codec); + $this->assertEquals($codec, $format->getVideoCodec()); + } + } + + public function testGetKiloBitrate() + { + $this->assertIsInt($this->getFormat()->getKiloBitrate()); + } + + public function testSetKiloBitrate() + { + $format = $this->getFormat(); + $format->setKiloBitrate(2560); + $this->assertEquals(2560, $format->getKiloBitrate()); + } + + public function testSetInvalidVideoCodec() + { + $this->expectException('\FFMpeg\Exception\InvalidArgumentException'); + $this->getFormat()->setVideoCodec('invalid-random-video-codec'); + } + + public function testGetAvailableVideoCodecs() + { + $this->assertGreaterThan(0, count($this->getFormat()->getAvailableVideoCodecs())); + } + + public function testCreateProgressListener() + { + $media = $this->getMockBuilder('FFMpeg\Media\MediaTypeInterface')->getMock(); + $media->expects($this->any()) + ->method('getPathfile') + ->will($this->returnValue(__FILE__)); + $format = $this->getFormat(); + $ffprobe = $this->getFFProbeMock(); + + foreach ($format->createProgressListener($media, $ffprobe, 1, 3) as $listener) { + $this->assertInstanceOf('FFMpeg\Format\ProgressListener\VideoProgressListener', $listener); + $this->assertSame($ffprobe, $listener->getFFProbe()); + $this->assertSame(__FILE__, $listener->getPathfile()); + $this->assertSame(1, $listener->getCurrentPass()); + $this->assertSame(3, $listener->getTotalPass()); + } + } + + public function testGetPasses() + { + $this->assertIsInt($this->getFormat()->getPasses()); + $this->assertGreaterThan(0, $this->getFormat()->getPasses()); + } + + public function testGetModulus() + { + $this->assertIsInt($this->getFormat()->getModulus()); + $this->assertGreaterThan(0, $this->getFormat()->getModulus()); + $this->assertEquals(0, $this->getFormat()->getModulus() % 2); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Format/Video/WMV3Test.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Format/Video/WMV3Test.php new file mode 100644 index 0000000000..edfccd79c5 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Format/Video/WMV3Test.php @@ -0,0 +1,13 @@ +getClassName(); + $ffprobe = $this->getFFProbeMock(); + $format = $this->getFormatMock(); + + $ffprobe->expects($this->once()) + ->method('format') + ->with(__FILE__) + ->will($this->returnValue($format)); + + $media = new $classname(__FILE__, $this->getFFMpegDriverMock(), $ffprobe); + $this->assertSame($format, $media->getFormat()); + } + + public function testGetFormat() + { + $classname = $this->getClassName(); + $ffprobe = $this->getFFProbeMock(); + $streams = $this->getStreamCollectionMock(); + + $ffprobe->expects($this->once()) + ->method('streams') + ->with(__FILE__) + ->will($this->returnValue($streams)); + + $media = new $classname(__FILE__, $this->getFFMpegDriverMock(), $ffprobe); + $this->assertSame($streams, $media->getStreams()); + } + + abstract protected function getClassName(); +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Media/AdvancedMediaTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Media/AdvancedMediaTest.php new file mode 100644 index 0000000000..3310e12472 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Media/AdvancedMediaTest.php @@ -0,0 +1,35 @@ +getFFMpegDriverMock(); + $ffprobe = $this->getFFProbeMock(); + + $advancedMedia = new AdvancedMedia(array(__FILE__, __FILE__), $driver, $ffprobe); + $this->assertSame(array(__FILE__, __FILE__), $advancedMedia->getInputs()); + } + + public function testGetInputsCount() + { + $driver = $this->getFFMpegDriverMock(); + $ffprobe = $this->getFFProbeMock(); + + $advancedMedia = new AdvancedMedia(array(__FILE__, __FILE__), $driver, $ffprobe); + $this->assertEquals(2, $advancedMedia->getInputsCount()); + } + + public function testFiltersReturnFilters() + { + $driver = $this->getFFMpegDriverMock(); + $ffprobe = $this->getFFProbeMock(); + + $advancedMedia = new AdvancedMedia(array(__FILE__, __FILE__), $driver, $ffprobe); + $this->assertInstanceOf('FFMpeg\Filters\AdvancedMedia\ComplexFilters', $advancedMedia->filters()); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Media/AudioProg.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Media/AudioProg.php new file mode 100644 index 0000000000..3765a1be65 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Media/AudioProg.php @@ -0,0 +1,10 @@ +getFFMpegDriverMock(); + $ffprobe = $this->getFFProbeMock(); + + $audio = new Audio(__FILE__, $driver, $ffprobe); + $this->assertInstanceOf('FFMpeg\Filters\Audio\AudioFilters', $audio->filters()); + } + + public function testAddFiltersAddsAFilter() + { + $driver = $this->getFFMpegDriverMock(); + $ffprobe = $this->getFFProbeMock(); + + $filters = $this->getMockBuilder('FFMpeg\Filters\FiltersCollection') + ->disableOriginalConstructor() + ->getMock(); + + $audio = new Audio(__FILE__, $driver, $ffprobe); + $audio->setFiltersCollection($filters); + + $filter = $this->getMockBuilder('FFMpeg\Filters\Audio\AudioFilterInterface')->getMock(); + + $filters->expects($this->once()) + ->method('add') + ->with($filter); + + $audio->addFilter($filter); + } + + public function testAddAVideoFilterThrowsException() + { + $driver = $this->getFFMpegDriverMock(); + $ffprobe = $this->getFFProbeMock(); + + $filters = $this->getMockBuilder('FFMpeg\Filters\FiltersCollection') + ->disableOriginalConstructor() + ->getMock(); + + $audio = new Audio(__FILE__, $driver, $ffprobe); + $audio->setFiltersCollection($filters); + + $filter = $this->getMockBuilder('FFMpeg\Filters\Video\VideoFilterInterface')->getMock(); + + $filters->expects($this->never()) + ->method('add'); + + $this->expectException('\FFMpeg\Exception\InvalidArgumentException'); + $audio->addFilter($filter); + } + + public function testSaveWithFailure() + { + $driver = $this->getFFMpegDriverMock(); + $ffprobe = $this->getFFProbeMock(); + $outputPathfile = '/target/file'; + + $format = $this->getMockBuilder('FFMpeg\Format\AudioInterface')->getMock(); + $format->expects($this->any()) + ->method('getExtraParams') + ->will($this->returnValue(array())); + + $configuration = $this->getMockBuilder('Alchemy\BinaryDriver\ConfigurationInterface')->getMock(); + + $driver->expects($this->any()) + ->method('getConfiguration') + ->will($this->returnValue($configuration)); + + $failure = new RuntimeException('failed to encode'); + $driver->expects($this->once()) + ->method('command') + ->will($this->throwException($failure)); + + $audio = new Audio(__FILE__, $driver, $ffprobe); + $this->expectException('\FFMpeg\Exception\RuntimeException'); + $audio->save($format, $outputPathfile); + } + + public function testSaveAppliesFilters() + { + $driver = $this->getFFMpegDriverMock(); + $ffprobe = $this->getFFProbeMock(); + $outputPathfile = '/target/file'; + $format = $this->getMockBuilder('FFMpeg\Format\AudioInterface')->getMock(); + $format->expects($this->any()) + ->method('getExtraParams') + ->will($this->returnValue(array())); + + $configuration = $this->getMockBuilder('Alchemy\BinaryDriver\ConfigurationInterface')->getMock(); + + $driver->expects($this->any()) + ->method('getConfiguration') + ->will($this->returnValue($configuration)); + + $audio = new Audio(__FILE__, $driver, $ffprobe); + + $filter = $this->getMockBuilder('FFMpeg\Filters\Audio\AudioFilterInterface')->getMock(); + $filter->expects($this->once()) + ->method('apply') + ->with($audio, $format) + ->will($this->returnValue(array('extra-filter-command'))); + + $capturedCommands = array(); + + $driver->expects($this->once()) + ->method('command') + ->with($this->isType('array'), false, $this->anything()) + ->will($this->returnCallback(function ($commands, $errors, $listeners) use (&$capturedCommands) { + $capturedCommands[] = $commands; + })); + + $audio->addFilter($filter); + $audio->save($format, $outputPathfile); + + foreach ($capturedCommands as $commands) { + $this->assertEquals('-y', $commands[0]); + $this->assertEquals('-i', $commands[1]); + $this->assertEquals(__FILE__, $commands[2]); + $this->assertEquals('extra-filter-command', $commands[3]); + } + } + + /** + * @dataProvider provideSaveData + */ + public function testSaveShouldSave($threads, $expectedCommands, $expectedListeners, $format) + { + $driver = $this->getFFMpegDriverMock(); + $ffprobe = $this->getFFProbeMock(); + + $configuration = $this->getMockBuilder('Alchemy\BinaryDriver\ConfigurationInterface')->getMock(); + + $driver->expects($this->any()) + ->method('getConfiguration') + ->will($this->returnValue($configuration)); + + $configuration->expects($this->once()) + ->method('has') + ->with($this->equalTo('ffmpeg.threads')) + ->will($this->returnValue($threads)); + + if ($threads) { + $configuration->expects($this->once()) + ->method('get') + ->with($this->equalTo('ffmpeg.threads')) + ->will($this->returnValue(24)); + } else { + $configuration->expects($this->never()) + ->method('get'); + } + + $capturedCommand = $capturedListeners = null; + + $driver->expects($this->once()) + ->method('command') + ->with($this->isType('array'), false, $this->anything()) + ->will($this->returnCallback(function ($commands, $errors, $listeners) use (&$capturedCommand, &$capturedListeners) { + $capturedCommand = $commands; + $capturedListeners = $listeners; + })); + + $outputPathfile = '/target/file'; + + $audio = new Audio(__FILE__, $driver, $ffprobe); + $audio->save($format, $outputPathfile); + + $this->assertEquals($expectedCommands, $capturedCommand); + $this->assertEquals($expectedListeners, $capturedListeners); + } + + public function provideSaveData() + { + $format = $this->getMockBuilder('FFMpeg\Format\AudioInterface')->getMock(); + $format->expects($this->any()) + ->method('getExtraParams') + ->will($this->returnValue(array())); + $format->expects($this->any()) + ->method('getAudioKiloBitrate') + ->will($this->returnValue(663)); + $format->expects($this->any()) + ->method('getAudioChannels') + ->will($this->returnValue(5)); + + $audioFormat = $this->getMockBuilder('FFMpeg\Format\AudioInterface')->getMock(); + $audioFormat->expects($this->any()) + ->method('getExtraParams') + ->will($this->returnValue(array())); + $audioFormat->expects($this->any()) + ->method('getAudioKiloBitrate') + ->will($this->returnValue(664)); + $audioFormat->expects($this->any()) + ->method('getAudioChannels') + ->will($this->returnValue(5)); + $audioFormat->expects($this->any()) + ->method('getAudioCodec') + ->will($this->returnValue('patati-patata-audio')); + + $formatExtra = $this->getMockBuilder('FFMpeg\Format\AudioInterface')->getMock(); + $formatExtra->expects($this->any()) + ->method('getExtraParams') + ->will($this->returnValue(array('extra', 'param'))); + $formatExtra->expects($this->any()) + ->method('getAudioKiloBitrate') + ->will($this->returnValue(665)); + $formatExtra->expects($this->any()) + ->method('getAudioChannels') + ->will($this->returnValue(5)); + + $listeners = array($this->getMockBuilder('Alchemy\BinaryDriver\Listeners\ListenerInterface')->getMock()); + + $progressableFormat = $this->getMockBuilder('Tests\FFMpeg\Unit\Media\AudioProg') + ->disableOriginalConstructor()->getMock(); + $progressableFormat->expects($this->any()) + ->method('getExtraParams') + ->will($this->returnValue(array())); + $progressableFormat->expects($this->any()) + ->method('createProgressListener') + ->will($this->returnValue($listeners)); + $progressableFormat->expects($this->any()) + ->method('getAudioKiloBitrate') + ->will($this->returnValue(666)); + $progressableFormat->expects($this->any()) + ->method('getAudioChannels') + ->will($this->returnValue(5)); + + return array( + array(false, array( + '-y', '-i', __FILE__, + '-b:a', '663k', + '-ac', '5', + '/target/file', + ), null, $format), + array(false, array( + '-y', '-i', __FILE__, + '-acodec', 'patati-patata-audio', + '-b:a', '664k', + '-ac', '5', + '/target/file', + ), null, $audioFormat), + array(false, array( + '-y', '-i', __FILE__, + 'extra', 'param', + '-b:a', '665k', + '-ac', '5', + '/target/file', + ), null, $formatExtra), + array(true, array( + '-y', '-i', __FILE__, + '-threads', 24, + '-b:a', '663k', + '-ac', '5', + '/target/file', + ), null, $format), + array(true, array( + '-y', '-i', __FILE__, + 'extra', 'param', + '-threads', 24, + '-b:a', '665k', + '-ac', '5', + '/target/file', + ), null, $formatExtra), + array(false, array( + '-y', '-i', __FILE__, + '-b:a', '666k', + '-ac', '5', + '/target/file', + ), $listeners, $progressableFormat), + array(true, array( + '-y', '-i', __FILE__, + '-threads', 24, + '-b:a', '666k', + '-ac', '5', + '/target/file', + ), $listeners, $progressableFormat), + ); + } + + public function testSaveShouldNotStoreCodecFiltersInTheMedia() + { + $driver = $this->getFFMpegDriverMock(); + $ffprobe = $this->getFFProbeMock(); + + $configuration = $this->getMockBuilder('Alchemy\BinaryDriver\ConfigurationInterface')->getMock(); + + $driver->expects($this->any()) + ->method('getConfiguration') + ->will($this->returnValue($configuration)); + + $configuration->expects($this->any()) + ->method('has') + ->with($this->equalTo('ffmpeg.threads')) + ->will($this->returnValue(true)); + + $configuration->expects($this->any()) + ->method('get') + ->with($this->equalTo('ffmpeg.threads')) + ->will($this->returnValue(24)); + + $capturedCommands = array(); + + $driver->expects($this->exactly(2)) + ->method('command') + ->with($this->isType('array'), false, $this->anything()) + ->will($this->returnCallback(function ($commands, $errors, $listeners) use (&$capturedCommands, &$capturedListeners) { + $capturedCommands[] = $commands; + })); + + $outputPathfile = '/target/file'; + + $format = $this->getMockBuilder('FFMpeg\Format\AudioInterface')->getMock(); + $format->expects($this->any()) + ->method('getExtraParams') + ->will($this->returnValue(array('param'))); + + $audio = new Audio(__FILE__, $driver, $ffprobe); + $audio->save($format, $outputPathfile); + $audio->save($format, $outputPathfile); + + $expected = array( + '-y', '-i', __FILE__, 'param', '-threads', 24, '/target/file', + ); + + foreach ($capturedCommands as $capturedCommand) { + $this->assertEquals($expected, $capturedCommand); + } + } + + public function getClassName() + { + return 'FFMpeg\Media\Audio'; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Media/ClipTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Media/ClipTest.php new file mode 100644 index 0000000000..ab1b6569ae --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Media/ClipTest.php @@ -0,0 +1,67 @@ +getConfigurationMock(); + + $driver = $this->getFFMpegDriverMock(); + $driver->expects($this->any()) + ->method('getConfiguration') + ->will($this->returnValue($configuration)); + + $ffprobe = $this->getFFProbeMock(); + + $start = $this->getTimeCodeMock(); + $start->expects($this->once()) + ->method('__toString') + ->will($this->returnValue($startValue)); + + $duration = null; + if (null !== $durationValue) { + $duration = $this->getTimeCodeMock(); + $duration->expects($this->once()) + ->method('__toString') + ->will($this->returnValue($durationValue)); + } + + $outputPathfile = '/target/file'; + + $format = $this->getMockBuilder('FFMpeg\Format\VideoInterface')->getMock(); + $format->expects($this->any()) + ->method('getPasses') + ->will($this->returnValue(1)); + $format->expects($this->any()) + ->method('getExtraParams') + ->will($this->returnValue(array())); + + $clip = new Clip($this->getVideoMock(__FILE__), $driver, $ffprobe, $start, $duration); + $fc = $clip->getFinalCommand($format, $outputPathfile); + + $this->assertCount(1, $fc); + $this->assertStringStartsWith(implode(' ', $commands), $fc[0]); + } + + public function provideBuildOptions() + { + return array( + array('SS01', null, array( + '-y', '-ss', 'SS01', + '-i', __FILE__) + ), + array('SS02', 'D02', array( + '-y', '-ss', 'SS02', + '-i', __FILE__, + '-t', 'D02') + ) + ); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Media/ConcatTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Media/ConcatTest.php new file mode 100644 index 0000000000..28de35e3ee --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Media/ConcatTest.php @@ -0,0 +1,147 @@ +getFFMpegDriverMock(); + $ffprobe = $this->getFFProbeMock(); + + $concat = new Concat(array(__FILE__, __FILE__), $driver, $ffprobe); + $this->assertSame(array(__FILE__, __FILE__), $concat->getSources()); + } + + public function testFiltersReturnFilters() + { + $driver = $this->getFFMpegDriverMock(); + $ffprobe = $this->getFFProbeMock(); + + $concat = new Concat(array(__FILE__, __FILE__), $driver, $ffprobe); + $this->assertInstanceOf('FFMpeg\Filters\Concat\ConcatFilters', $concat->filters()); + } + + public function testAddFiltersAddsAFilter() + { + $driver = $this->getFFMpegDriverMock(); + $ffprobe = $this->getFFProbeMock(); + + $filters = $this->getMockBuilder('FFMpeg\Filters\FiltersCollection') + ->disableOriginalConstructor() + ->getMock(); + + $filter = $this->getMockBuilder('FFMpeg\Filters\Concat\ConcatFilterInterface')->getMock(); + + $filters->expects($this->once()) + ->method('add') + ->with($filter); + + $concat = new Concat(array(__FILE__, __FILE__), $driver, $ffprobe); + $concat->setFiltersCollection($filters); + $concat->addFilter($filter); + } + + /** + * @dataProvider provideSaveFromSameCodecsOptions + */ + public function testSaveFromSameCodecs($streamCopy, $commands) + { + $driver = $this->getFFMpegDriverMock(); + $ffprobe = $this->getFFProbeMock(); + + $pathfile = '/target/destination'; + + array_push($commands, $pathfile); + + $driver->expects($this->exactly(1)) + ->method('command') + ->with($this->isType('array'), false, $this->anything()) + ->will($this->returnCallback(function ($commands, $errors, $listeners) {})); + + $concat = new Concat(array(__FILE__, 'concat-2.mp4'), $driver, $ffprobe); + $concat->saveFromSameCodecs($pathfile, $streamCopy); + + $this->assertEquals('-f', $commands[0]); + $this->assertEquals('concat', $commands[1]); + $this->assertEquals('-safe', $commands[2]); + $this->assertEquals('0', $commands[3]); + $this->assertEquals('-i', $commands[4]); + if(isset($commands[6]) && (strcmp($commands[6], "-c") == 0)) { + $this->assertEquals('-c', $commands[6]); + $this->assertEquals('copy', $commands[7]); + } + } + + public function provideSaveFromSameCodecsOptions() + { + $fs = FsManager::create(); + $tmpFile = $fs->createTemporaryFile('ffmpeg-concat'); + + return array( + array( + TRUE, + array( + '-f', 'concat', + '-safe', '0', + '-i', $tmpFile, + '-c', 'copy' + ), + ), + array( + FALSE, + array( + '-f', 'concat', + '-safe', '0', + '-i', $tmpFile + ) + ), + ); + } + + /** + * @dataProvider provideSaveFromDifferentCodecsOptions + */ + public function testSaveFromDifferentCodecs($commands) + { + $driver = $this->getFFMpegDriverMock(); + $ffprobe = $this->getFFProbeMock(); + $format = $this->getFormatInterfaceMock(); + + $pathfile = '/target/destination'; + + array_push($commands, $pathfile); + + $configuration = $this->getMockBuilder('Alchemy\BinaryDriver\ConfigurationInterface')->getMock(); + + $driver->expects($this->any()) + ->method('getConfiguration') + ->will($this->returnValue($configuration)); + + $driver->expects($this->once()) + ->method('command') + ->with($commands); + + $concat = new Concat(array(__FILE__, 'concat-2.mp4'), $driver, $ffprobe); + $this->assertSame($concat, $concat->saveFromDifferentCodecs($format, $pathfile)); + } + + public function provideSaveFromDifferentCodecsOptions() + { + return array( + array( + array( + '-i', __FILE__, + '-i', 'concat-2.mp4', + '-filter_complex', + '[0:v:0] [0:a:0] [1:v:0] [1:a:0] concat=n=2:v=1:a=1 [v] [a]', + '-map', '[v]', + '-map', '[a]' + ), + ), + ); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Media/FrameTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Media/FrameTest.php new file mode 100644 index 0000000000..88c0befdf5 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Media/FrameTest.php @@ -0,0 +1,109 @@ +getFFMpegDriverMock(); + $ffprobe = $this->getFFProbeMock(); + $timecode = $this->getTimeCodeMock(); + + $frame = new Frame($this->getVideoMock(__FILE__), $driver, $ffprobe, $timecode); + $this->assertSame($timecode, $frame->getTimeCode()); + } + + public function testFiltersReturnFilters() + { + $driver = $this->getFFMpegDriverMock(); + $ffprobe = $this->getFFProbeMock(); + $timecode = $this->getTimeCodeMock(); + + $frame = new Frame($this->getVideoMock(__FILE__), $driver, $ffprobe, $timecode); + $this->assertInstanceOf('FFMpeg\Filters\Frame\FrameFilters', $frame->filters()); + } + + public function testAddFiltersAddsAFilter() + { + $driver = $this->getFFMpegDriverMock(); + $ffprobe = $this->getFFProbeMock(); + $timecode = $this->getTimeCodeMock(); + + $filters = $this->getMockBuilder('FFMpeg\Filters\FiltersCollection') + ->disableOriginalConstructor() + ->getMock(); + + $filter = $this->getMockBuilder('FFMpeg\Filters\Frame\FrameFilterInterface')->getMock(); + + $filters->expects($this->once()) + ->method('add') + ->with($filter); + + $frame = new Frame($this->getVideoMock(__FILE__), $driver, $ffprobe, $timecode); + $frame->setFiltersCollection($filters); + $frame->addFilter($filter); + } + + /** + * @dataProvider provideSaveOptions + */ + public function testSave($accurate, $base64, $commands) + { + $driver = $this->getFFMpegDriverMock(); + $ffprobe = $this->getFFProbeMock(); + $timecode = $this->getTimeCodeMock(); + $timecode->expects($this->once()) + ->method('__toString') + ->will($this->returnValue('timecode')); + + $pathfile = '/target/destination'; + + if (!$base64) { + array_push($commands, $pathfile); + } + + $driver->expects($this->once()) + ->method('command') + ->with($commands); + + if(!$base64) { + $frame = new Frame($this->getVideoMock(__FILE__), $driver, $ffprobe, $timecode); + $this->assertSame($frame, $frame->save($pathfile, $accurate, $base64)); + } + else { + $frame = new Frame($this->getVideoMock(__FILE__), $driver, $ffprobe, $timecode); + $frame->save($pathfile, $accurate, $base64); + } + } + + public function provideSaveOptions() + { + return array( + array(false, false, array( + '-y', '-ss', 'timecode', + '-i', __FILE__, + '-vframes', '1', + '-f', 'image2') + ), + array(true, false, array( + '-y', '-i', __FILE__, + '-vframes', '1', '-ss', 'timecode', + '-f', 'image2') + ), + array(false, true, array( + '-y', '-ss', 'timecode', + '-i', __FILE__, + '-vframes', '1', + '-f', 'image2pipe', '-') + ), + array(true, true, array( + '-y', '-i', __FILE__, + '-vframes', '1', '-ss', 'timecode', + '-f', 'image2pipe', '-') + ) + ); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Media/GifTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Media/GifTest.php new file mode 100644 index 0000000000..a2dfe915d6 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Media/GifTest.php @@ -0,0 +1,116 @@ +getFFMpegDriverMock(); + $ffprobe = $this->getFFProbeMock(); + $timecode = $this->getTimeCodeMock(); + $dimension = $this->getDimensionMock(); + + $gif = new Gif($this->getVideoMock(__FILE__), $driver, $ffprobe, $timecode, $dimension); + $this->assertSame($timecode, $gif->getTimeCode()); + } + + public function testGetDimension() + { + $driver = $this->getFFMpegDriverMock(); + $ffprobe = $this->getFFProbeMock(); + $timecode = $this->getTimeCodeMock(); + $dimension = $this->getDimensionMock(); + + $gif = new Gif($this->getVideoMock(__FILE__), $driver, $ffprobe, $timecode, $dimension); + $this->assertSame($dimension, $gif->getDimension()); + } + + public function testFiltersReturnFilters() + { + $driver = $this->getFFMpegDriverMock(); + $ffprobe = $this->getFFProbeMock(); + $timecode = $this->getTimeCodeMock(); + $dimension = $this->getDimensionMock(); + + $gif = new Gif($this->getVideoMock(__FILE__), $driver, $ffprobe, $timecode, $dimension); + $this->assertInstanceOf('FFMpeg\Filters\Gif\GifFilters', $gif->filters()); + } + + public function testAddFiltersAddsAFilter() + { + $driver = $this->getFFMpegDriverMock(); + $ffprobe = $this->getFFProbeMock(); + $timecode = $this->getTimeCodeMock(); + $dimension = $this->getDimensionMock(); + + $filters = $this->getMockBuilder('FFMpeg\Filters\FiltersCollection') + ->disableOriginalConstructor() + ->getMock(); + + $filter = $this->getMockBuilder('FFMpeg\Filters\Gif\GifFilterInterface')->getMock(); + + $filters->expects($this->once()) + ->method('add') + ->with($filter); + + $gif = new Gif($this->getVideoMock(__FILE__), $driver, $ffprobe, $timecode, $dimension); + $gif->setFiltersCollection($filters); + $gif->addFilter($filter); + } + + /** + * @dataProvider provideSaveOptions + */ + public function testSave($dimension, $duration, $commands) + { + $driver = $this->getFFMpegDriverMock(); + $ffprobe = $this->getFFProbeMock(); + $timecode = $this->getTimeCodeMock(); + + $timecode->expects($this->once()) + ->method('__toString') + ->will($this->returnValue('timecode')); + + $pathfile = '/target/destination'; + + array_push($commands, $pathfile); + + $driver->expects($this->once()) + ->method('command') + ->with($commands); + + $gif = new Gif($this->getVideoMock(__FILE__), $driver, $ffprobe, $timecode, $dimension, $duration); + $this->assertSame($gif, $gif->save($pathfile)); + } + + public function provideSaveOptions() + { + return array( + array( + new Dimension(320, 240), 3, + array( + '-ss', 'timecode', + '-t', '3', + '-i', __FILE__, + '-vf', + 'scale=320:-1', '-gifflags', + '+transdiff', '-y' + ), + ), + array( + new Dimension(320, 240), null, + array( + '-ss', 'timecode', + '-i', __FILE__, + '-vf', + 'scale=320:-1', '-gifflags', + '+transdiff', '-y' + ) + ), + ); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Media/Prog.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Media/Prog.php new file mode 100644 index 0000000000..6cdc3456bd --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Media/Prog.php @@ -0,0 +1,10 @@ +getFFMpegDriverMock(); + $ffprobe = $this->getFFProbeMock(); + + $video = new Video(__FILE__, $driver, $ffprobe); + $this->assertInstanceOf('FFMpeg\Filters\Video\VideoFilters', $video->filters()); + } + + public function testAddFiltersAddsAFilter() + { + $driver = $this->getFFMpegDriverMock(); + $ffprobe = $this->getFFProbeMock(); + + $filters = $this->getMockBuilder('FFMpeg\Filters\FiltersCollection') + ->disableOriginalConstructor() + ->getMock(); + + $video = new Video(__FILE__, $driver, $ffprobe); + $video->setFiltersCollection($filters); + + $filter = $this->getMockBuilder('FFMpeg\Filters\Video\VideoFilterInterface')->getMock(); + + $filters->expects($this->once()) + ->method('add') + ->with($filter); + + $video->addFilter($filter); + } + + public function testAddAudioFilterAddsAFilter() + { + $driver = $this->getFFMpegDriverMock(); + $ffprobe = $this->getFFProbeMock(); + + $filters = $this->getMockBuilder('FFMpeg\Filters\FiltersCollection') + ->disableOriginalConstructor() + ->getMock(); + + $video = new Video(__FILE__, $driver, $ffprobe); + $video->setFiltersCollection($filters); + + $filter = $this->getMockBuilder('FFMpeg\Filters\Audio\AudioFilterInterface')->getMock(); + + $filters->expects($this->once()) + ->method('add') + ->with($filter); + + $video->addFilter($filter); + } + + public function testFrameShouldReturnAFrame() + { + $driver = $this->getFFMpegDriverMock(); + $ffprobe = $this->getFFProbeMock(); + + $at = $this->getTimeCodeMock(); + + $video = new Video(__FILE__, $driver, $ffprobe); + $frame = $video->frame($at); + + $this->assertInstanceOf('FFMpeg\Media\Frame', $frame); + $this->assertSame($at, $frame->getTimeCode()); + $this->assertSame(__FILE__, $frame->getPathfile()); + } + + public function testSaveWithFailure() + { + $driver = $this->getFFMpegDriverMock(); + $ffprobe = $this->getFFProbeMock(); + $outputPathfile = '/target/file'; + $format = $this->getMockBuilder('FFMpeg\Format\VideoInterface')->getMock(); + $format->expects($this->any()) + ->method('getPasses') + ->will($this->returnValue(1)); + $format->expects($this->any()) + ->method('getExtraParams') + ->will($this->returnValue(array())); + + $configuration = $this->getMockBuilder('Alchemy\BinaryDriver\ConfigurationInterface')->getMock(); + + $driver->expects($this->any()) + ->method('getConfiguration') + ->will($this->returnValue($configuration)); + + $failure = new RuntimeException('failed to encode'); + $driver->expects($this->once()) + ->method('command') + ->will($this->throwException($failure)); + + $video = new Video(__FILE__, $driver, $ffprobe); + $this->expectException('\FFMpeg\Exception\RuntimeException'); + $video->save($format, $outputPathfile); + } + + public function testSaveAppliesFilters() + { + $driver = $this->getFFMpegDriverMock(); + $ffprobe = $this->getFFProbeMock(); + $outputPathfile = '/target/file'; + $format = $this->getMockBuilder('FFMpeg\Format\VideoInterface')->getMock(); + $format->expects($this->any()) + ->method('getExtraParams') + ->will($this->returnValue(array())); + $format->expects($this->any()) + ->method('getPasses') + ->will($this->returnValue(2)); + + $configuration = $this->getMockBuilder('Alchemy\BinaryDriver\ConfigurationInterface')->getMock(); + + $driver->expects($this->any()) + ->method('getConfiguration') + ->will($this->returnValue($configuration)); + + $video = new Video(__FILE__, $driver, $ffprobe); + + $filter = $this->getMockBuilder('FFMpeg\Filters\Video\VideoFilterInterface')->getMock(); + $filter->expects($this->once()) + ->method('apply') + ->with($video, $format) + ->will($this->returnValue(array('extra-filter-command'))); + + $capturedCommands = array(); + + $driver->expects($this->exactly(2)) + ->method('command') + ->with($this->isType('array'), false, $this->anything()) + ->will($this->returnCallback(function ($commands, $errors, $listeners) use (&$capturedCommands) { + $capturedCommands[] = $commands; + })); + + $video->addFilter($filter); + $video->save($format, $outputPathfile); + + foreach ($capturedCommands as $commands) { + $this->assertEquals('-y', $commands[0]); + $this->assertEquals('-i', $commands[1]); + $this->assertEquals(__FILE__, $commands[2]); + $this->assertEquals('extra-filter-command', $commands[3]); + } + } + + /** + * @dataProvider provideSaveData + */ + public function testSaveShouldSave($threads, $expectedCommands, $expectedListeners, $format) + { + $driver = $this->getFFMpegDriverMock(); + $ffprobe = $this->getFFProbeMock(); + + $configuration = $this->getMockBuilder('Alchemy\BinaryDriver\ConfigurationInterface')->getMock(); + + $driver->expects($this->any()) + ->method('getConfiguration') + ->will($this->returnValue($configuration)); + + $configuration->expects($this->once()) + ->method('has') + ->with($this->equalTo('ffmpeg.threads')) + ->will($this->returnValue($threads)); + + if ($threads) { + $configuration->expects($this->once()) + ->method('get') + ->with($this->equalTo('ffmpeg.threads')) + ->will($this->returnValue(24)); + } else { + $configuration->expects($this->never()) + ->method('get'); + } + + $capturedCommands = array(); + $capturedListeners = null; + + $driver->expects($this->exactly(count($expectedCommands))) + ->method('command') + ->with($this->isType('array'), false, $this->anything()) + ->will($this->returnCallback(function ($commands, $errors, $listeners) use (&$capturedCommands, &$capturedListeners) { + $capturedCommands[] = $commands; + $capturedListeners = $listeners; + })); + + $outputPathfile = '/target/file'; + + $video = new Video(__FILE__, $driver, $ffprobe); + $video->save($format, $outputPathfile); + + foreach ($capturedCommands as $passKey => $pass) { + $prefix = null; + if (count($expectedCommands) > 1) { + // look for pass commands only in multipass cases + foreach ($pass as $command) { + $prefix = null; + if (false !== strpos($command, '/pass-')) { + $prefix = $command; + break; + } + } + + if (null === $prefix) { + $this->fail('Unable to find pass prefix command.'); + } + } + + $found = false || (null === $prefix); + foreach ($pass as $key => $command) { + if ($command === $prefix) { + $found = true; + unset($capturedCommands[$passKey][$key]); + $capturedCommands[$passKey] = array_values($capturedCommands[$passKey]); + break; + } + } + + if (!$found) { + $this->fail('Unable to find pass prefix command back.'); + } + } + + $this->assertEquals($expectedCommands, $capturedCommands); + $this->assertEquals($expectedListeners, $capturedListeners); + } + + public function provideSaveData() + { + $format = $this->getMockBuilder('FFMpeg\Format\VideoInterface')->getMock(); + $format->expects($this->any()) + ->method('getExtraParams') + ->will($this->returnValue(array())); + $format->expects($this->any()) + ->method('getKiloBitrate') + ->will($this->returnValue(663)); + $format->expects($this->any()) + ->method('getAudioKiloBitrate') + ->will($this->returnValue(92)); + $format->expects($this->any()) + ->method('getAudioChannels') + ->will($this->returnValue(2)); + $format->expects($this->any()) + ->method('getPasses') + ->will($this->returnValue(2)); + $format->expects($this->any()) + ->method('getAdditionalParameters') + ->will($this->returnValue(array('foo', 'bar'))); + + $format2 = $this->getMockBuilder('FFMpeg\Format\VideoInterface')->getMock(); + $format2->expects($this->any()) + ->method('getExtraParams') + ->will($this->returnValue(array())); + $format2->expects($this->any()) + ->method('getKiloBitrate') + ->will($this->returnValue(663)); + $format2->expects($this->any()) + ->method('getAudioKiloBitrate') + ->will($this->returnValue(92)); + $format2->expects($this->any()) + ->method('getAudioChannels') + ->will($this->returnValue(2)); + $format2->expects($this->any()) + ->method('getPasses') + ->will($this->returnValue(2)); + $format2->expects($this->any()) + ->method('getAdditionalParameters') + ->will($this->returnValue(array('foo', 'bar'))); + + $audioFormat = $this->getMockBuilder('FFMpeg\Format\AudioInterface')->getMock(); + $audioFormat->expects($this->any()) + ->method('getExtraParams') + ->will($this->returnValue(array())); + $audioFormat->expects($this->any()) + ->method('getAudioCodec') + ->will($this->returnValue('patati-patata-audio')); + $audioFormat->expects($this->any()) + ->method('getAudioKiloBitrate') + ->will($this->returnValue(92)); + $audioFormat->expects($this->any()) + ->method('getAudioChannels') + ->will($this->returnValue(2)); + $audioFormat->expects($this->any()) + ->method('getPasses') + ->will($this->returnValue(1)); + + $audioVideoFormat = $this->getMockBuilder('FFMpeg\Format\VideoInterface')->getMock(); + $audioVideoFormat->expects($this->any()) + ->method('getExtraParams') + ->will($this->returnValue(array())); + $audioVideoFormat->expects($this->any()) + ->method('getVideoCodec') + ->will($this->returnValue('gloubi-boulga-video')); + $audioVideoFormat->expects($this->any()) + ->method('getAudioCodec') + ->will($this->returnValue('patati-patata-audio')); + $audioVideoFormat->expects($this->any()) + ->method('getKiloBitrate') + ->will($this->returnValue(664)); + $audioVideoFormat->expects($this->any()) + ->method('getAudioKiloBitrate') + ->will($this->returnValue(92)); + $audioVideoFormat->expects($this->any()) + ->method('getAudioChannels') + ->will($this->returnValue(2)); + $audioVideoFormat->expects($this->any()) + ->method('getPasses') + ->will($this->returnValue(2)); + $audioVideoFormat->expects($this->any()) + ->method('getAdditionalParameters') + ->will($this->returnValue(array())); + + $audioVideoFormatSinglePass = $this->getMockBuilder('FFMpeg\Format\VideoInterface')->getMock(); + $audioVideoFormatSinglePass->expects($this->any()) + ->method('getExtraParams') + ->will($this->returnValue(array())); + $audioVideoFormatSinglePass->expects($this->any()) + ->method('getVideoCodec') + ->will($this->returnValue('gloubi-boulga-video')); + $audioVideoFormatSinglePass->expects($this->any()) + ->method('getAudioCodec') + ->will($this->returnValue('patati-patata-audio')); + $audioVideoFormatSinglePass->expects($this->any()) + ->method('getKiloBitrate') + ->will($this->returnValue(664)); + $audioVideoFormatSinglePass->expects($this->any()) + ->method('getAudioKiloBitrate') + ->will($this->returnValue(92)); + $audioVideoFormatSinglePass->expects($this->any()) + ->method('getAudioChannels') + ->will($this->returnValue(2)); + $audioVideoFormatSinglePass->expects($this->any()) + ->method('getPasses') + ->will($this->returnValue(1)); + $audioVideoFormatSinglePass->expects($this->any()) + ->method('getAdditionalParameters') + ->will($this->returnValue(array())); + + $formatExtra = $this->getMockBuilder('FFMpeg\Format\VideoInterface')->getMock(); + $formatExtra->expects($this->any()) + ->method('getExtraParams') + ->will($this->returnValue(array('extra', 'param'))); + $formatExtra->expects($this->any()) + ->method('getKiloBitrate') + ->will($this->returnValue(665)); + $formatExtra->expects($this->any()) + ->method('getAudioKiloBitrate') + ->will($this->returnValue(92)); + $formatExtra->expects($this->any()) + ->method('getAudioChannels') + ->will($this->returnValue(2)); + $formatExtra->expects($this->any()) + ->method('getPasses') + ->will($this->returnValue(2)); + $formatExtra->expects($this->any()) + ->method('getAdditionalParameters') + ->will($this->returnValue(array())); + + $formatExtra2 = $this->getMockBuilder('FFMpeg\Format\VideoInterface')->getMock(); + $formatExtra2->expects($this->any()) + ->method('getExtraParams') + ->will($this->returnValue(array('extra', 'param'))); + $formatExtra2->expects($this->any()) + ->method('getKiloBitrate') + ->will($this->returnValue(665)); + $formatExtra2->expects($this->any()) + ->method('getAudioKiloBitrate') + ->will($this->returnValue(92)); + $formatExtra2->expects($this->any()) + ->method('getAudioChannels') + ->will($this->returnValue(2)); + $formatExtra2->expects($this->any()) + ->method('getPasses') + ->will($this->returnValue(2)); + $formatExtra2->expects($this->any()) + ->method('getAdditionalParameters') + ->will($this->returnValue(array())); + + $listeners = array($this->getMockBuilder('Alchemy\BinaryDriver\Listeners\ListenerInterface')->getMock()); + + $progressableFormat = $this->getMockBuilder('Tests\FFMpeg\Unit\Media\Prog') + ->disableOriginalConstructor()->getMock(); + $progressableFormat->expects($this->any()) + ->method('getExtraParams') + ->will($this->returnValue(array())); + $progressableFormat->expects($this->any()) + ->method('createProgressListener') + ->will($this->returnValue($listeners)); + $progressableFormat->expects($this->any()) + ->method('getKiloBitrate') + ->will($this->returnValue(666)); + $progressableFormat->expects($this->any()) + ->method('getAudioKiloBitrate') + ->will($this->returnValue(92)); + $progressableFormat->expects($this->any()) + ->method('getAudioChannels') + ->will($this->returnValue(2)); + $progressableFormat->expects($this->any()) + ->method('getPasses') + ->will($this->returnValue(2)); + + $progressableFormat2 = $this->getMockBuilder('Tests\FFMpeg\Unit\Media\Prog') + ->disableOriginalConstructor()->getMock(); + $progressableFormat2->expects($this->any()) + ->method('getExtraParams') + ->will($this->returnValue(array())); + $progressableFormat2->expects($this->any()) + ->method('createProgressListener') + ->will($this->returnValue($listeners)); + $progressableFormat2->expects($this->any()) + ->method('getKiloBitrate') + ->will($this->returnValue(666)); + $progressableFormat2->expects($this->any()) + ->method('getAudioKiloBitrate') + ->will($this->returnValue(92)); + $progressableFormat2->expects($this->any()) + ->method('getAudioChannels') + ->will($this->returnValue(2)); + $progressableFormat2->expects($this->any()) + ->method('getPasses') + ->will($this->returnValue(2)); + + $progressableAudioFormat = $this->getMockBuilder('Tests\FFMpeg\Unit\Media\AudioProg') + ->disableOriginalConstructor()->getMock(); + $progressableAudioFormat->expects($this->any()) + ->method('getExtraParams') + ->will($this->returnValue(array())); + $progressableAudioFormat->expects($this->any()) + ->method('getAudioCodec') + ->will($this->returnValue('patati-patata-audio')); + $progressableAudioFormat->expects($this->any()) + ->method('createProgressListener') + ->will($this->returnValue($listeners)); + $progressableAudioFormat->expects($this->any()) + ->method('getAudioKiloBitrate') + ->will($this->returnValue(92)); + $progressableAudioFormat->expects($this->any()) + ->method('getAudioChannels') + ->will($this->returnValue(2)); + $progressableAudioFormat->expects($this->any()) + ->method('getPasses') + ->will($this->returnValue(1)); + + return array( + array(false, array(array( + '-y', '-i', __FILE__, '-b:v', '663k', + '-refs', '6', '-coder', '1', '-sc_threshold', '40', '-flags', '+loop', + '-me_range', '16', '-subq', '7', '-i_qfactor', '0.71', '-qcomp', '0.6', + '-qdiff', '4', '-trellis', '1', '-b:a', '92k', '-ac', 2, 'foo', 'bar', '-pass', 1, '-passlogfile', + '/target/file', + ), array( + '-y', '-i', __FILE__, + '-b:v', '663k', + '-refs', '6', '-coder', '1', '-sc_threshold', '40', '-flags', '+loop', + '-me_range', '16', '-subq', '7', '-i_qfactor', '0.71', '-qcomp', '0.6', + '-qdiff', '4', '-trellis', '1', '-b:a', '92k', '-ac', 2, 'foo', 'bar', '-pass', 2, '-passlogfile', + '/target/file', + )), null, $format), + array(false, array(array( + '-y', '-i', __FILE__, + '-vcodec', 'gloubi-boulga-video', + '-acodec', 'patati-patata-audio', '-b:v', '664k', + '-refs', '6', '-coder', '1', '-sc_threshold', '40', '-flags', '+loop', + '-me_range', '16', '-subq', '7', '-i_qfactor', '0.71', '-qcomp', '0.6', + '-qdiff', '4', '-trellis', '1', '-b:a', '92k', '-ac', '2', '-pass', '1', '-passlogfile', + '/target/file', + ), array( + '-y', '-i', __FILE__, + '-vcodec', 'gloubi-boulga-video', + '-acodec', 'patati-patata-audio', + '-b:v', '664k', + '-refs', '6', '-coder', '1', '-sc_threshold', '40', '-flags', '+loop', + '-me_range', '16', '-subq', '7', '-i_qfactor', '0.71', '-qcomp', '0.6', + '-qdiff', '4', '-trellis', '1', '-b:a', '92k', '-ac', '2', '-pass', '2', '-passlogfile', + '/target/file', + )), null, $audioVideoFormat), + array(false, array(array( + '-y', '-i', __FILE__, + '-vcodec', 'gloubi-boulga-video', + '-acodec', 'patati-patata-audio', '-b:v', '664k', + '-refs', '6', '-coder', '1', '-sc_threshold', '40', '-flags', '+loop', + '-me_range', '16', '-subq', '7', '-i_qfactor', '0.71', '-qcomp', '0.6', + '-qdiff', '4', '-trellis', '1', '-b:a', '92k', '-ac', '2', + '/target/file', + )), null, $audioVideoFormatSinglePass), + array(false, array(array( + '-y', '-i', __FILE__, + 'extra', 'param','-b:v', '665k', + '-refs', '6', '-coder', '1', '-sc_threshold', '40', '-flags', '+loop', + '-me_range', '16', '-subq', '7', '-i_qfactor', '0.71', '-qcomp', '0.6', + '-qdiff', '4', '-trellis', '1', '-b:a', '92k', '-ac', '2', '-pass', '1', '-passlogfile', + '/target/file', + ), array( + '-y', '-i', __FILE__, + 'extra', 'param', '-b:v', '665k', + '-refs', '6', '-coder', '1', '-sc_threshold', '40', '-flags', '+loop', + '-me_range', '16', '-subq', '7', '-i_qfactor', '0.71', '-qcomp', '0.6', + '-qdiff', '4', '-trellis', '1', '-b:a', '92k', '-ac', '2', '-pass', '2', '-passlogfile', + '/target/file', + )), null, $formatExtra), + array(true, array(array( + '-y', '-i', __FILE__, + '-threads', 24, '-b:v', '663k', + '-refs', '6', '-coder', '1', '-sc_threshold', '40', '-flags', '+loop', + '-me_range', '16', '-subq', '7', '-i_qfactor', '0.71', '-qcomp', '0.6', + '-qdiff', '4', '-trellis', '1', '-b:a', '92k', '-ac', 2, 'foo', 'bar', '-pass', 1, '-passlogfile', + '/target/file', + ), array( + '-y', '-i', __FILE__, + '-threads', 24, + '-b:v', '663k', + '-refs', '6', '-coder', '1', '-sc_threshold', '40', '-flags', '+loop', + '-me_range', '16', '-subq', '7', '-i_qfactor', '0.71', '-qcomp', '0.6', + '-qdiff', '4', '-trellis', '1', '-b:a', '92k', '-ac', 2, 'foo', 'bar', '-pass', 2, '-passlogfile', + '/target/file', + )), null, $format2), + array(true, array(array( + '-y', '-i', __FILE__, + 'extra', 'param', '-threads', 24, '-b:v', '665k', + '-refs', '6', '-coder', '1', '-sc_threshold', '40', '-flags', '+loop', + '-me_range', '16', '-subq', '7', '-i_qfactor', '0.71', '-qcomp', '0.6', + '-qdiff', '4', '-trellis', '1', '-b:a', '92k', '-ac', '2', '-pass', '1', '-passlogfile', + '/target/file', + ), array( + '-y', '-i', __FILE__, + 'extra', 'param', '-threads', 24, '-b:v', '665k', + '-refs', '6', '-coder', '1', '-sc_threshold', '40', '-flags', '+loop', + '-me_range', '16', '-subq', '7', '-i_qfactor', '0.71', '-qcomp', '0.6', + '-qdiff', '4', '-trellis', '1', '-b:a', '92k', '-ac', '2', '-pass', '2', '-passlogfile', + '/target/file', + )), null, $formatExtra2), + array(false, array(array( + '-y', '-i', __FILE__, '-b:v', '666k', + '-refs', '6', '-coder', '1', '-sc_threshold', '40', '-flags', '+loop', + '-me_range', '16', '-subq', '7', '-i_qfactor', '0.71', '-qcomp', '0.6', + '-qdiff', '4', '-trellis', '1', '-b:a', '92k', '-ac', '2', '-pass', '1', '-passlogfile', + '/target/file', + ), array( + '-y', '-i', __FILE__, + '-b:v', '666k', + '-refs', '6', '-coder', '1', '-sc_threshold', '40', '-flags', '+loop', + '-me_range', '16', '-subq', '7', '-i_qfactor', '0.71', '-qcomp', '0.6', + '-qdiff', '4', '-trellis', '1', '-b:a', '92k', '-ac', '2', '-pass', '2', '-passlogfile', + '/target/file', + )), $listeners, $progressableFormat2), + array(true, array(array( + '-y', '-i', __FILE__, + '-threads', 24, '-b:v', '666k', + '-refs', '6', '-coder', '1', '-sc_threshold', '40', '-flags', '+loop', + '-me_range', '16', '-subq', '7', '-i_qfactor', '0.71', '-qcomp', '0.6', + '-qdiff', '4', '-trellis', '1', '-b:a', '92k', '-ac', '2', '-pass', '1', '-passlogfile', + '/target/file', + ), array( + '-y', '-i', __FILE__, + '-threads', 24, + '-b:v', '666k', + '-refs', '6', '-coder', '1', '-sc_threshold', '40', '-flags', '+loop', + '-me_range', '16', '-subq', '7', '-i_qfactor', '0.71', '-qcomp', '0.6', + '-qdiff', '4', '-trellis', '1', '-b:a', '92k', '-ac', '2', '-pass', '2', '-passlogfile', + '/target/file', + )), $listeners, $progressableFormat), + array(true, array(array( + '-y', '-i', __FILE__, + '-threads', 24, '-acodec', 'patati-patata-audio', + '-b:a', '92k', '-ac', '2', + '/target/file', + )), null, $audioFormat), + array(true, array(array( + '-y', '-i', __FILE__, + '-threads', 24, '-acodec', 'patati-patata-audio', + '-b:a', '92k', '-ac', '2', + '/target/file', + )), $listeners, $progressableAudioFormat), + ); + } + + public function testSaveShouldNotStoreCodecFiltersInTheMedia() + { + $driver = $this->getFFMpegDriverMock(); + $ffprobe = $this->getFFProbeMock(); + + $configuration = $this->getMockBuilder('Alchemy\BinaryDriver\ConfigurationInterface')->getMock(); + + $driver->expects($this->any()) + ->method('getConfiguration') + ->will($this->returnValue($configuration)); + + $configuration->expects($this->any()) + ->method('has') + ->with($this->equalTo('ffmpeg.threads')) + ->will($this->returnValue(true)); + + $configuration->expects($this->any()) + ->method('get') + ->with($this->equalTo('ffmpeg.threads')) + ->will($this->returnValue(24)); + + $capturedCommands = array(); + + $driver->expects($this->exactly(4)) + ->method('command') + ->with($this->isType('array'), false, $this->anything()) + ->will($this->returnCallback(function ($commands, $errors, $listeners) use (&$capturedCommands, &$capturedListeners) { + $capturedCommands[] = $commands; + })); + + $outputPathfile = '/target/file'; + + $format = $this->getMockBuilder('FFMpeg\Format\VideoInterface')->getMock(); + $format->expects($this->any()) + ->method('getExtraParams') + ->will($this->returnValue(array('param'))); + $format->expects($this->any()) + ->method('getPasses') + ->will($this->returnValue(2)); + + $video = new Video(__FILE__, $driver, $ffprobe); + $video->save($format, $outputPathfile); + $video->save($format, $outputPathfile); + + $expectedPass1 = array( + '-y', '-i', __FILE__, 'param', '-threads', 24, '-b:v', 'k', '-refs', + '6', '-coder', '1', '-sc_threshold', '40', '-flags', '+loop', + '-me_range', '16', '-subq', '7', '-i_qfactor', '0.71', + '-qcomp', '0.6', '-qdiff', '4', '-trellis', '1', + '-pass', '1', '-passlogfile', '/target/file', + ); + $expectedPass2 = array( + '-y', '-i', __FILE__, 'param', '-threads', 24, '-b:v', 'k', '-refs', + '6', '-coder', '1', '-sc_threshold', '40', '-flags', '+loop', + '-me_range', '16', '-subq', '7', '-i_qfactor', '0.71', + '-qcomp', '0.6', '-qdiff', '4', '-trellis', '1', + '-pass', '2', '-passlogfile', '/target/file', + ); + + $n = 1; + foreach ($capturedCommands as $capturedCommand) { + $prefix = null; + foreach ($capturedCommand as $command) { + if (false !== strpos($command, '/pass-')) { + $prefix = $command; + break; + } + } + + if (null === $prefix) { + $this->fail('Unable to find pass prefix command.'); + } + + $found = false; + foreach ($capturedCommand as $key => $command) { + if ($command === $prefix) { + $found = true; + unset($capturedCommand[$key]); + $capturedCommand = array_values($capturedCommand); + break; + } + } + + if (!$found) { + $this->fail('Unable to find pass prefix command back.'); + } + + if (0 === $n % 2) { + $this->assertEquals($expectedPass2, $capturedCommand); + } else { + $this->assertEquals($expectedPass1, $capturedCommand); + } + $n++; + } + } + + public function getClassName() + { + return 'FFMpeg\Media\Video'; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Media/WaveformTest.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Media/WaveformTest.php new file mode 100644 index 0000000000..4151235e22 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/Media/WaveformTest.php @@ -0,0 +1,71 @@ +getFFMpegDriverMock(); + $ffprobe = $this->getFFProbeMock(); + + $waveform = new Waveform($this->getAudioMock(__FILE__), $driver, $ffprobe, 640, 120); + $this->assertInstanceOf('FFMpeg\Filters\Waveform\WaveformFilters', $waveform->filters()); + } + + public function testAddFiltersAddsAFilter() + { + $driver = $this->getFFMpegDriverMock(); + $ffprobe = $this->getFFProbeMock(); + + $filters = $this->getMockBuilder('FFMpeg\Filters\FiltersCollection') + ->disableOriginalConstructor() + ->getMock(); + + $filter = $this->getMockBuilder('FFMpeg\Filters\Waveform\WaveformFilterInterface')->getMock(); + + $filters->expects($this->once()) + ->method('add') + ->with($filter); + + $waveform = new Waveform($this->getAudioMock(__FILE__), $driver, $ffprobe, 640, 120); + $waveform->setFiltersCollection($filters); + $waveform->addFilter($filter); + } + + /** + * @dataProvider provideSaveOptions + */ + public function testSave($commands) + { + $driver = $this->getFFMpegDriverMock(); + $ffprobe = $this->getFFProbeMock(); + + $pathfile = '/tests/files/Audio.mp3'; + + array_push($commands, $pathfile); + + $driver->expects($this->once()) + ->method('command') + ->with($commands); + + $waveform = new Waveform($this->getAudioMock(__FILE__), $driver, $ffprobe, 640, 120, ['#FFFFFF']); + $this->assertSame($waveform, $waveform->save($pathfile)); + } + + public function provideSaveOptions() + { + return array( + array( + array( + '-y', '-i', NULL, '-filter_complex', + 'showwavespic=colors=#FFFFFF:s=640x120', + '-frames:v', '1', + ), + ), + ); + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/TestCase.php b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/TestCase.php new file mode 100644 index 0000000000..60bd004f22 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/Unit/TestCase.php @@ -0,0 +1,168 @@ +getMockBuilder('Psr\Log\LoggerInterface')->getMock(); + } + + public function getCacheMock() + { + return $this->getMockBuilder('Doctrine\Common\Cache\Cache')->getMock(); + } + + public function getTimeCodeMock() + { + return $this->getMockBuilder('FFMpeg\Coordinate\TimeCode') + ->disableOriginalConstructor() + ->getMock(); + } + + public function getDimensionMock() + { + return $this->getMockBuilder('FFMpeg\Coordinate\Dimension') + ->disableOriginalConstructor() + ->getMock(); + } + + public function getFramerateMock() + { + return $this->getMockBuilder('FFMpeg\Coordinate\Framerate') + ->disableOriginalConstructor() + ->getMock(); + } + + public function getFrameMock() + { + return $this->getMockBuilder('FFMpeg\Media\Frame') + ->disableOriginalConstructor() + ->getMock(); + } + + public function getWaveformMock() + { + return $this->getMockBuilder('FFMpeg\Media\Waveform') + ->disableOriginalConstructor() + ->getMock(); + } + + public function getFFMpegDriverMock() + { + return $this->getMockBuilder('FFMpeg\Driver\FFMpegDriver') + ->disableOriginalConstructor() + ->getMock(); + } + + public function getFFProbeDriverMock() + { + return $this->getMockBuilder('FFMpeg\Driver\FFProbeDriver') + ->disableOriginalConstructor() + ->getMock(); + } + + public function getFFProbeMock() + { + return $this->getMockBuilder('FFMpeg\FFProbe') + ->disableOriginalConstructor() + ->getMock(); + } + + public function getStreamMock() + { + return $this->getMockBuilder('FFMpeg\FFProbe\DataMapping\Stream') + ->disableOriginalConstructor() + ->getMock(); + } + + public function getFFProbeParserMock() + { + return $this->getMockBuilder('FFMpeg\FFProbe\OutputParserInterface')->getMock(); + } + + public function getFFProbeOptionsTesterMock() + { + return $this->getMockBuilder('FFMpeg\FFProbe\OptionsTesterInterface')->getMock(); + } + + public function getFFProbeMapperMock() + { + return $this->getMockBuilder('FFMpeg\FFProbe\MapperInterface')->getMock(); + } + + public function getFFProbeOptionsTesterMockWithOptions(array $options) + { + $tester = $this->getFFProbeOptionsTesterMock(); + + $tester->expects($this->any()) + ->method('has') + ->will($this->returnCallback(function ($option) use ($options) { + return in_array($option, $options); + })); + + return $tester; + } + + public function getConfigurationMock() + { + return $this->getMockBuilder('Alchemy\BinaryDriver\ConfigurationInterface')->getMock(); + } + + public function getFormatMock() + { + return $this->getMockBuilder('FFMpeg\FFProbe\DataMapping\Format') + ->disableOriginalConstructor() + ->getMock(); + } + + public function getStreamCollectionMock() + { + return $this->getMockBuilder('FFMpeg\FFProbe\DataMapping\StreamCollection') + ->disableOriginalConstructor() + ->getMock(); + } + + protected function getAudioMock() + { + return $this->getMockBuilder('FFMpeg\Media\Audio') + ->disableOriginalConstructor() + ->getMock(); + } + + protected function getVideoMock($filename = null) + { + $video = $this->getMockBuilder('FFMpeg\Media\Video') + ->disableOriginalConstructor() + ->getMock(); + + $video->expects($this->any()) + ->method('getPathfile') + ->will($this->returnValue($filename)); + + return $video; + } + + public function getConcatMock() + { + return $this->getMockBuilder('FFMpeg\Media\Concat') + ->disableOriginalConstructor() + ->getMock(); + } + + public function getFormatInterfaceMock() + { + $FormatInterface = $this->getMockBuilder('FFMpeg\Format\FormatInterface') + ->disableOriginalConstructor() + ->getMock(); + + $FormatInterface->expects($this->any()) + ->method('getExtraParams') + ->will($this->returnValue(array())); + + return $FormatInterface; + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/bootstrap.php b/vendor/php-ffmpeg/php-ffmpeg/tests/bootstrap.php new file mode 100644 index 0000000000..9611e83d92 --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/bootstrap.php @@ -0,0 +1,8 @@ + ED.... + direct ED.... reduce buffering +-probesize .D.... set probing size (from 32 to INT_MAX) +-fflags ED.... + ignidx .D.... ignore index + genpts .D.... generate pts + nofillin .D.... do not fill in missing values that can be exactly calculated + noparse .D.... disable AVParsers, this needs nofillin too + igndts .D.... ignore dts + discardcorrupt .D.... discard corrupted frames + sortdts .D.... try to interleave outputted packets by dts + keepside .D.... dont merge side data + nobuffer .D.... reduce the latency introduced by optional buffering +-seek2any .D.... forces seeking to enable seek to any mode (from 0 to 1) +-analyzeduration .D.... specify how many microseconds are analyzed to probe the input (from 0 to INT_MAX) +-cryptokey .D.... decryption key +-indexmem .D.... max memory used for timestamp index (per stream) (from 0 to INT_MAX) +-rtbufsize .D.... max memory used for buffering real-time frames (from 0 to INT_MAX) +-fdebug ED.... print specific debug info + ts ED.... +-max_delay ED.... maximum muxing or demuxing delay in microseconds (from -1 to INT_MAX) +-fpsprobesize .D.... number of frames used to probe fps (from -1 to 2.14748e+09) +-f_err_detect .D.... set error detection flags (deprecated; use err_detect, save via avconv) + crccheck .D.... verify embedded CRCs + bitstream .D.... detect bitstream specification deviations + buffer .D.... detect improper bitstream length + explode .D.... abort decoding on minor error detection + careful .D.... consider things that violate the spec and have not been seen in the wild as errors + compliant .D.... consider all spec non compliancies as errors + aggressive .D.... consider things that a sane encoder shouldnt do as an error +-err_detect .D.... set error detection flags + crccheck .D.... verify embedded CRCs + bitstream .D.... detect bitstream specification deviations + buffer .D.... detect improper bitstream length + explode .D.... abort decoding on minor error detection + careful .D.... consider things that violate the spec and have not been seen in the wild as errors + compliant .D.... consider all spec non compliancies as errors + aggressive .D.... consider things that a sane encoder shouldnt do as an error +-use_wallclock_as_timestamps .D.... use wallclock as timestamps (from 0 to 2.14748e+09) +-skip_initial_bytes .D.... skip initial bytes (from 0 to 2.14748e+09) +-correct_ts_overflow .D.... correct single timestamp overflows (from 0 to 1) + +AVIOContext AVOptions: + +URLContext AVOptions: + +crypto AVOptions: +-key .D.... AES decryption key +-iv .D.... AES decryption initialization vector + +ffrtmphttp AVOptions: +-ffrtmphttp_tls .D.... Use a HTTPS tunneling connection (RTMPTS). (from 0 to 1) + +file AVOptions: + +http AVOptions: +-seekable .D.... control seekability of connection (from -1 to 1) +-headers ED.... set custom HTTP headers, can override built in default headers +-content_type ED.... force a content type +-user-agent .D.... override User-Agent header +-multiple_requests ED.... use persistent connections (from 0 to 1) +-post_data ED.... set custom HTTP post data +-timeout ED.... set timeout of socket I/O operations (from -1 to INT_MAX) + +rtmp AVOptions: +-rtmp_app ED.... Name of application to connect to on the RTMP server +-rtmp_buffer ED.... Set buffer time in milliseconds. The default is 3000. (from 0 to INT_MAX) +-rtmp_conn ED.... Append arbitrary AMF data to the Connect message +-rtmp_flashver ED.... Version of the Flash plugin used to run the SWF player. +-rtmp_live .D.... Specify that the media is a live stream. (from INT_MIN to INT_MAX) + any .D.... both + live .D.... live stream + recorded .D.... recorded stream +-rtmp_pageurl .D.... URL of the web page in which the media was embedded. By default no value will be sent. +-rtmp_playpath ED.... Stream identifier to play or to publish +-rtmp_subscribe .D.... Name of live stream to subscribe to. Defaults to rtmp_playpath. +-rtmp_swfhash .D.... SHA256 hash of the decompressed SWF file (32 bytes). +-rtmp_swfsize .D.... Size of the decompressed SWF file, required for SWFVerification. (from 0 to INT_MAX) +-rtmp_swfurl ED.... URL of the SWF player. By default no value will be sent +-rtmp_swfverify .D.... URL to player swf file, compute hash/size automatically. +-rtmp_tcurl ED.... URL of the target stream. Defaults to proto://host[:port]/app. +-rtmp_listen .D.... Listen for incoming rtmp connections (from INT_MIN to INT_MAX) +-timeout .D.... Maximum timeout (in seconds) to wait for incoming connections. -1 is infinite. Implies -rtmp_listen 1 (from INT_MIN to INT_MAX) + +rtmpt AVOptions: +-rtmp_app ED.... Name of application to connect to on the RTMP server +-rtmp_buffer ED.... Set buffer time in milliseconds. The default is 3000. (from 0 to INT_MAX) +-rtmp_conn ED.... Append arbitrary AMF data to the Connect message +-rtmp_flashver ED.... Version of the Flash plugin used to run the SWF player. +-rtmp_live .D.... Specify that the media is a live stream. (from INT_MIN to INT_MAX) + any .D.... both + live .D.... live stream + recorded .D.... recorded stream +-rtmp_pageurl .D.... URL of the web page in which the media was embedded. By default no value will be sent. +-rtmp_playpath ED.... Stream identifier to play or to publish +-rtmp_subscribe .D.... Name of live stream to subscribe to. Defaults to rtmp_playpath. +-rtmp_swfhash .D.... SHA256 hash of the decompressed SWF file (32 bytes). +-rtmp_swfsize .D.... Size of the decompressed SWF file, required for SWFVerification. (from 0 to INT_MAX) +-rtmp_swfurl ED.... URL of the SWF player. By default no value will be sent +-rtmp_swfverify .D.... URL to player swf file, compute hash/size automatically. +-rtmp_tcurl ED.... URL of the target stream. Defaults to proto://host[:port]/app. +-rtmp_listen .D.... Listen for incoming rtmp connections (from INT_MIN to INT_MAX) +-timeout .D.... Maximum timeout (in seconds) to wait for incoming connections. -1 is infinite. Implies -rtmp_listen 1 (from INT_MIN to INT_MAX) + +srtp AVOptions: + +tcp AVOptions: +-listen ED.... listen on port instead of connecting (from 0 to 1) +-timeout ED.... timeout of socket i/o operations (from 0 to INT_MAX) +-listen_timeout ED.... connection awaiting timeout (from -1 to INT_MAX) + +udp AVOptions: +-buffer_size ED.... Socket buffer size in bytes (from 0 to INT_MAX) +-localport ED.... Set local port to bind to (from 0 to INT_MAX) +-localaddr ED.... Choose local IP address +-pkt_size ED.... Set size of UDP packets (from 0 to INT_MAX) +-reuse ED.... Explicitly allow or disallow reusing UDP sockets (from 0 to 1) +-connect ED.... Should connect() be called on socket (from 0 to 1) +-fifo_size .D.... Set the UDP receiving circular buffer size, expressed as a number of packets with size of 188 bytes (from 0 to INT_MAX) +-overrun_nonfatal .D.... Survive in case of UDP receiving circular buffer overrun (from 0 to 1) +-timeout .D.... In read mode: if no data arrived in more than this time interval, raise error (from 0 to INT_MAX) + +Artworx Data Format demuxer AVOptions: +-linespeed .D.... set simulated line speed (bytes per second) (from 1 to INT_MAX) +-video_size .D.... set video size, such as 640x480 or hd720. +-framerate .D.... set framerate (frames per second) + +aqtdec AVOptions: +-subfps .D...S set the movie frame rate (from 0 to INT_MAX) + +asf demuxer AVOptions: +-no_resync_search .D.... Don't try to resynchronize by looking for a certain optional start code (from 0 to 1) + +avi AVOptions: +-use_odml .D.... use odml index (from -1 to 1) + +Binary text demuxer AVOptions: +-linespeed .D.... set simulated line speed (bytes per second) (from 1 to INT_MAX) +-video_size .D.... set video size, such as 640x480 or hd720. +-framerate .D.... set framerate (frames per second) + +cavsvideo demuxer AVOptions: +-framerate .D.... + +CDXL demuxer AVOptions: +-sample_rate .D.... (from 1 to INT_MAX) +-framerate .D.... + +concat demuxer AVOptions: +-safe .D.... enable safe mode (from -1 to 1) + +dirac demuxer AVOptions: +-framerate .D.... + +dnxhd demuxer AVOptions: +-framerate .D.... + +flvdec AVOptions: +-flv_metadata .D.V.. Allocate streams according the onMetaData array (from 0 to 1) + +g729 demuxer AVOptions: +-bit_rate .D.... (from 0 to INT_MAX) + +GIF demuxer AVOptions: +-min_delay .D.... minimum valid delay between frames (in hundredths of second) (from 0 to 6000) +-default_delay .D.... default delay between frames (in hundredths of second) (from 0 to 6000) + +gsm demuxer AVOptions: +-sample_rate .D.... (from 1 to 6.50753e+07) + +h261 demuxer AVOptions: +-framerate .D.... + +h263 demuxer AVOptions: +-framerate .D.... + +h264 demuxer AVOptions: +-framerate .D.... + +iCE Draw File demuxer AVOptions: +-linespeed .D.... set simulated line speed (bytes per second) (from 1 to INT_MAX) +-video_size .D.... set video size, such as 640x480 or hd720. +-framerate .D.... set framerate (frames per second) + +image2 demuxer AVOptions: +-framerate .D.... set the video framerate +-loop .D.... force loop over input file sequence (from 0 to 1) +-pattern_type .D.... set pattern type (from 0 to INT_MAX) + glob_sequence .D.... select glob/sequence pattern type + glob .D.... select glob pattern type + sequence .D.... select sequence pattern type +-pixel_format .D.... set video pixel format +-start_number .D.... set first number in the sequence (from 0 to INT_MAX) +-start_number_range .D.... set range for looking at the first sequence number (from 1 to INT_MAX) +-video_size .D.... set video size +-frame_size .D.... force frame size in bytes (from 0 to INT_MAX) + +image2pipe demuxer AVOptions: +-framerate .D.... set the video framerate +-loop .D.... force loop over input file sequence (from 0 to 1) +-pattern_type .D.... set pattern type (from 0 to INT_MAX) + glob_sequence .D.... select glob/sequence pattern type + glob .D.... select glob pattern type + sequence .D.... select sequence pattern type +-pixel_format .D.... set video pixel format +-start_number .D.... set first number in the sequence (from 0 to INT_MAX) +-start_number_range .D.... set range for looking at the first sequence number (from 1 to INT_MAX) +-video_size .D.... set video size +-frame_size .D.... force frame size in bytes (from 0 to INT_MAX) + +ingenient demuxer AVOptions: +-framerate .D.... + +m4v demuxer AVOptions: +-framerate .D.... + +mjpeg demuxer AVOptions: +-framerate .D.... + +mov,mp4,m4a,3gp,3g2,mj2 AVOptions: +-use_absolute_path .D.V.. allow using absolute path when opening alias, this is a possible security issue (from 0 to 1) +-ignore_editlist .D.V.. (from 0 to 1) + +mpegtsraw demuxer AVOptions: +-compute_pcr .D.... Compute exact PCR for each transport stream packet. (from 0 to 1) + +mpegvideo demuxer AVOptions: +-framerate .D.... + +alaw demuxer AVOptions: +-sample_rate .D.... (from 0 to INT_MAX) +-channels .D.... (from 0 to INT_MAX) + +mulaw demuxer AVOptions: +-sample_rate .D.... (from 0 to INT_MAX) +-channels .D.... (from 0 to INT_MAX) + +f64be demuxer AVOptions: +-sample_rate .D.... (from 0 to INT_MAX) +-channels .D.... (from 0 to INT_MAX) + +f64le demuxer AVOptions: +-sample_rate .D.... (from 0 to INT_MAX) +-channels .D.... (from 0 to INT_MAX) + +f32be demuxer AVOptions: +-sample_rate .D.... (from 0 to INT_MAX) +-channels .D.... (from 0 to INT_MAX) + +f32le demuxer AVOptions: +-sample_rate .D.... (from 0 to INT_MAX) +-channels .D.... (from 0 to INT_MAX) + +s32be demuxer AVOptions: +-sample_rate .D.... (from 0 to INT_MAX) +-channels .D.... (from 0 to INT_MAX) + +s32le demuxer AVOptions: +-sample_rate .D.... (from 0 to INT_MAX) +-channels .D.... (from 0 to INT_MAX) + +s24be demuxer AVOptions: +-sample_rate .D.... (from 0 to INT_MAX) +-channels .D.... (from 0 to INT_MAX) + +s24le demuxer AVOptions: +-sample_rate .D.... (from 0 to INT_MAX) +-channels .D.... (from 0 to INT_MAX) + +s16be demuxer AVOptions: +-sample_rate .D.... (from 0 to INT_MAX) +-channels .D.... (from 0 to INT_MAX) + +s16le demuxer AVOptions: +-sample_rate .D.... (from 0 to INT_MAX) +-channels .D.... (from 0 to INT_MAX) + +s8 demuxer AVOptions: +-sample_rate .D.... (from 0 to INT_MAX) +-channels .D.... (from 0 to INT_MAX) + +u32be demuxer AVOptions: +-sample_rate .D.... (from 0 to INT_MAX) +-channels .D.... (from 0 to INT_MAX) + +u32le demuxer AVOptions: +-sample_rate .D.... (from 0 to INT_MAX) +-channels .D.... (from 0 to INT_MAX) + +u24be demuxer AVOptions: +-sample_rate .D.... (from 0 to INT_MAX) +-channels .D.... (from 0 to INT_MAX) + +u24le demuxer AVOptions: +-sample_rate .D.... (from 0 to INT_MAX) +-channels .D.... (from 0 to INT_MAX) + +u16be demuxer AVOptions: +-sample_rate .D.... (from 0 to INT_MAX) +-channels .D.... (from 0 to INT_MAX) + +u16le demuxer AVOptions: +-sample_rate .D.... (from 0 to INT_MAX) +-channels .D.... (from 0 to INT_MAX) + +u8 demuxer AVOptions: +-sample_rate .D.... (from 0 to INT_MAX) +-channels .D.... (from 0 to INT_MAX) + +rawvideo demuxer AVOptions: +-video_size .D.... set frame size +-pixel_format .D.... set pixel format +-framerate .D.... set frame rate + +RTP demuxer AVOptions: +-rtp_flags .D.... RTP flags + filter_src .D.... Only receive packets from the negotiated peer IP + listen .D.... Wait for incoming connections +-reorder_queue_size .D.... Number of packets to buffer for handling of reordered packets (from -1 to INT_MAX) + +RTSP demuxer AVOptions: +-initial_pause .D.... Don't start playing the stream immediately (from 0 to 1) +-rtsp_transport ED.... RTSP transport protocols + udp ED.... UDP + tcp ED.... TCP + udp_multicast .D.... UDP multicast + http .D.... HTTP tunneling +-rtsp_flags .D.... RTSP flags + filter_src .D.... Only receive packets from the negotiated peer IP + listen .D.... Wait for incoming connections +-allowed_media_types .D.... Media types to accept from the server + video .D.... Video + audio .D.... Audio + data .D.... Data +-min_port ED.... Minimum local UDP port (from 0 to 65535) +-max_port ED.... Maximum local UDP port (from 0 to 65535) +-timeout .D.... Maximum timeout (in seconds) to wait for incoming connections. -1 is infinite. Implies flag listen (from INT_MIN to INT_MAX) +-reorder_queue_size .D.... Number of packets to buffer for handling of reordered packets (from -1 to INT_MAX) + +sbg_demuxer AVOptions: +-sample_rate .D.... (from 0 to INT_MAX) +-frame_size .D.... (from 0 to INT_MAX) +-max_file_size .D.... (from 0 to INT_MAX) + +SDP demuxer AVOptions: +-sdp_flags .D.... SDP flags + filter_src .D.... Only receive packets from the negotiated peer IP + listen .D.... Wait for incoming connections + custom_io .D.... Use custom IO +-allowed_media_types .D.... Media types to accept from the server + video .D.... Video + audio .D.... Audio + data .D.... Data +-reorder_queue_size .D.... Number of packets to buffer for handling of reordered packets (from -1 to INT_MAX) + +tedcaptions_demuxer AVOptions: +-start_time .D...S set the start time (offset) of the subtitles, in ms (from I64_MIN to I64_MAX) + +TTY demuxer AVOptions: +-chars_per_frame .D.... (from 1 to INT_MAX) +-video_size .D.... A string describing frame size, such as 640x480 or hd720. +-framerate .D.... + +vc1 demuxer AVOptions: +-framerate .D.... + +WAV demuxer AVOptions: +-ignore_length .D.... Ignore length (from 0 to 1) + +eXtended BINary text (XBIN) demuxer AVOptions: +-linespeed .D.... set simulated line speed (bytes per second) (from 1 to INT_MAX) +-video_size .D.... set video size, such as 640x480 or hd720. +-framerate .D.... set framerate (frames per second) + +lavfi indev AVOptions: +-graph .D.... set libavfilter graph +-graph_file .D.... set libavfilter graph filename +-dumpgraph .D.... dump graph to stderr + +AIFF muxer AVOptions: + +AST muxer AVOptions: + +f4v muxer AVOptions: + +GIF muxer AVOptions: + +hls muxer AVOptions: + +image2 muxer AVOptions: + +ipod muxer AVOptions: + +ismv muxer AVOptions: + +LATM/LOAS muxer AVOptions: + +mov muxer AVOptions: + +MP3 muxer AVOptions: + +mp4 muxer AVOptions: + +mpeg muxer AVOptions: + +vcd muxer AVOptions: + +dvd muxer AVOptions: + +svcd muxer AVOptions: + +vob muxer AVOptions: + +MPEGTS muxer AVOptions: + +Ogg muxer AVOptions: + +psp muxer AVOptions: + +RTP muxer AVOptions: + +RTSP muxer AVOptions: +-initial_pause .D.... Don't start playing the stream immediately (from 0 to 1) +-rtsp_transport ED.... RTSP transport protocols + udp ED.... UDP + tcp ED.... TCP + udp_multicast .D.... UDP multicast + http .D.... HTTP tunneling +-rtsp_flags .D.... RTSP flags + filter_src .D.... Only receive packets from the negotiated peer IP + listen .D.... Wait for incoming connections +-allowed_media_types .D.... Media types to accept from the server + video .D.... Video + audio .D.... Audio + data .D.... Data +-min_port ED.... Minimum local UDP port (from 0 to 65535) +-max_port ED.... Maximum local UDP port (from 0 to 65535) +-timeout .D.... Maximum timeout (in seconds) to wait for incoming connections. -1 is infinite. Implies flag listen (from INT_MIN to INT_MAX) +-reorder_queue_size .D.... Number of packets to buffer for handling of reordered packets (from -1 to INT_MAX) + +segment muxer AVOptions: + +stream_segment muxer AVOptions: + +smooth streaming muxer AVOptions: + +spdif AVOptions: + +tg2 muxer AVOptions: + +tgp muxer AVOptions: + +WAV muxer AVOptions: + +caca_outdev AVOptions: + diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/fixtures/ffprobe/show_format.json b/vendor/php-ffmpeg/php-ffmpeg/tests/fixtures/ffprobe/show_format.json new file mode 100644 index 0000000000..de962fac8a --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/fixtures/ffprobe/show_format.json @@ -0,0 +1,20 @@ +{ + "format": { + "filename": "Interview5mm4500.mp4", + "nb_streams": 2, + "format_name": "mov,mp4,m4a,3gp,3g2,mj2", + "format_long_name": "QuickTime / MOV", + "start_time": "0.000000", + "duration": "300.011000", + "size": "173833712", + "bit_rate": "4635395", + "tags": { + "major_brand": "isom", + "minor_version": "512", + "compatible_brands": "isomiso2avc1mp41", + "creation_time": "1970-01-01 00:00:00", + "title": "5mm 4500.mp4", + "encoder": "Lavf52.108.0" + } + } +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/fixtures/ffprobe/show_format.raw b/vendor/php-ffmpeg/php-ffmpeg/tests/fixtures/ffprobe/show_format.raw new file mode 100644 index 0000000000..1e857e542b --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/fixtures/ffprobe/show_format.raw @@ -0,0 +1,16 @@ +[FORMAT] +filename=Interview5mm4500.mp4 +nb_streams=2 +format_name=mov,mp4,m4a,3gp,3g2,mj2 +format_long_name=QuickTime / MOV +start_time=0.000000 +duration=300.011000 +size=173833712 +bit_rate=4635395 +TAG:major_brand=isom +TAG:minor_version=512 +TAG:compatible_brands=isomiso2avc1mp41 +TAG:creation_time=1970-01-01 00:00:00 +TAG:title=5mm 4500.mp4 +TAG:encoder=Lavf52.108.0 +[/FORMAT] diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/fixtures/ffprobe/show_streams.json b/vendor/php-ffmpeg/php-ffmpeg/tests/fixtures/ffprobe/show_streams.json new file mode 100644 index 0000000000..decdc3689f --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/fixtures/ffprobe/show_streams.json @@ -0,0 +1,88 @@ +{ + "streams": [ + { + "index": 0, + "codec_name": "h264", + "codec_long_name": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10", + "profile": "High", + "codec_type": "video", + "codec_time_base": "1/100", + "codec_tag_string": "avc1", + "codec_tag": "0x31637661", + "width": 960, + "height": 720, + "has_b_frames": 2, + "sample_aspect_ratio": "1:1", + "display_aspect_ratio": "4:3", + "pix_fmt": "yuv420p", + "level": 32, + "r_frame_rate": "50/1", + "avg_frame_rate": "50/1", + "time_base": "1/50000", + "start_pts": 0, + "start_time": "0.000000", + "duration_ts": 15000000, + "duration": "300.000000", + "bit_rate": "4499198", + "nb_frames": "15000", + "disposition": { + "default": 0, + "dub": 0, + "original": 0, + "comment": 0, + "lyrics": 0, + "karaoke": 0, + "forced": 0, + "hearing_impaired": 0, + "visual_impaired": 0, + "clean_effects": 0, + "attached_pic": 0 + }, + "tags": { + "creation_time": "1970-01-01 00:00:00", + "language": "und", + "handler_name": "VideoHandler" + } + }, + { + "index": 1, + "codec_name": "aac", + "codec_long_name": "AAC (Advanced Audio Coding)", + "codec_type": "audio", + "codec_time_base": "1/48000", + "codec_tag_string": "mp4a", + "codec_tag": "0x6134706d", + "sample_fmt": "fltp", + "sample_rate": "48000", + "channels": 2, + "bits_per_sample": 0, + "r_frame_rate": "0/0", + "avg_frame_rate": "0/0", + "time_base": "1/48000", + "start_pts": 0, + "start_time": "0.000000", + "duration_ts": 14400512, + "duration": "300.010667", + "bit_rate": "127973", + "nb_frames": "14063", + "disposition": { + "default": 0, + "dub": 0, + "original": 0, + "comment": 0, + "lyrics": 0, + "karaoke": 0, + "forced": 0, + "hearing_impaired": 0, + "visual_impaired": 0, + "clean_effects": 0, + "attached_pic": 0 + }, + "tags": { + "creation_time": "1970-01-01 00:00:00", + "language": "und", + "handler_name": "SoundHandler" + } + } + ] +} diff --git a/vendor/php-ffmpeg/php-ffmpeg/tests/fixtures/ffprobe/show_streams.raw b/vendor/php-ffmpeg/php-ffmpeg/tests/fixtures/ffprobe/show_streams.raw new file mode 100644 index 0000000000..6ce06c97ca --- /dev/null +++ b/vendor/php-ffmpeg/php-ffmpeg/tests/fixtures/ffprobe/show_streams.raw @@ -0,0 +1,84 @@ +[STREAM] +index=0 +codec_name=h264 +codec_long_name=H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 +profile=High +codec_type=video +codec_time_base=1/100 +codec_tag_string=avc1 +codec_tag=0x31637661 +width=960 +height=720 +has_b_frames=2 +sample_aspect_ratio=1:1 +display_aspect_ratio=4:3 +pix_fmt=yuv420p +level=32 +timecode=N/A +id=N/A +r_frame_rate=50/1 +avg_frame_rate=50/1 +time_base=1/50000 +start_pts=0 +start_time=0.000000 +duration_ts=15000000 +duration=300.000000 +bit_rate=4499198 +nb_frames=15000 +nb_read_frames=N/A +nb_read_packets=N/A +DISPOSITION:default=0 +DISPOSITION:dub=0 +DISPOSITION:original=0 +DISPOSITION:comment=0 +DISPOSITION:lyrics=0 +DISPOSITION:karaoke=0 +DISPOSITION:forced=0 +DISPOSITION:hearing_impaired=0 +DISPOSITION:visual_impaired=0 +DISPOSITION:clean_effects=0 +DISPOSITION:attached_pic=0 +TAG:creation_time=1970-01-01 00:00:00 +TAG:language=und +TAG:handler_name=VideoHandler +[/STREAM] +[STREAM] +index=1 +codec_name=aac +codec_long_name=AAC (Advanced Audio Coding) +profile=unknown +codec_type=audio +codec_time_base=1/48000 +codec_tag_string=mp4a +codec_tag=0x6134706d +sample_fmt=fltp +sample_rate=48000 +channels=2 +bits_per_sample=0 +id=N/A +r_frame_rate=0/0 +avg_frame_rate=0/0 +time_base=1/48000 +start_pts=0 +start_time=0.000000 +duration_ts=14400512 +duration=300.010667 +bit_rate=127973 +nb_frames=14063 +nb_read_frames=N/A +nb_read_packets=N/A +DISPOSITION:default=0 +DISPOSITION:dub=0 +DISPOSITION:original=0 +DISPOSITION:comment=0 +DISPOSITION:lyrics=0 +DISPOSITION:karaoke=0 +DISPOSITION:forced=0 +DISPOSITION:hearing_impaired=0 +DISPOSITION:visual_impaired=0 +DISPOSITION:clean_effects=0 +DISPOSITION:attached_pic=0 +TAG:creation_time=1970-01-01 00:00:00 +TAG:language=und +TAG:handler_name=SoundHandler +[/STREAM] diff --git a/vendor/phpcollection/phpcollection/.gitignore b/vendor/phpcollection/phpcollection/.gitignore new file mode 100644 index 0000000000..30f3ee22d1 --- /dev/null +++ b/vendor/phpcollection/phpcollection/.gitignore @@ -0,0 +1,3 @@ +vendor/ +phpunit.xml + diff --git a/vendor/phpcollection/phpcollection/.travis.yml b/vendor/phpcollection/phpcollection/.travis.yml new file mode 100644 index 0000000000..7beaf7ad91 --- /dev/null +++ b/vendor/phpcollection/phpcollection/.travis.yml @@ -0,0 +1,20 @@ +language: php + +php: + - 5.3 + - 5.4 + - 5.5 + - hhvm + +before_script: + - wget http://getcomposer.org/composer.phar + - php composer.phar install --dev + +script: phpunit --coverage-clover clover + +after_success: + - curl -sL https://bit.ly/artifact-uploader | php + +matrix: + allow_failures: + - php: hhvm diff --git a/vendor/phpcollection/phpcollection/LICENSE b/vendor/phpcollection/phpcollection/LICENSE new file mode 100644 index 0000000000..f49a4e16e6 --- /dev/null +++ b/vendor/phpcollection/phpcollection/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/vendor/phpcollection/phpcollection/README.md b/vendor/phpcollection/phpcollection/README.md new file mode 100644 index 0000000000..74909da092 --- /dev/null +++ b/vendor/phpcollection/phpcollection/README.md @@ -0,0 +1,4 @@ +PHP Collection +============== + +Learn more about it in its [documentation](http://jmsyst.com/libs/php-collection). diff --git a/vendor/phpcollection/phpcollection/composer.json b/vendor/phpcollection/phpcollection/composer.json new file mode 100644 index 0000000000..40ac8bbe9f --- /dev/null +++ b/vendor/phpcollection/phpcollection/composer.json @@ -0,0 +1,22 @@ +{ + "name": "phpcollection/phpcollection", + "description": "General-Purpose Collection Library for PHP", + "keywords": ["collection", "list", "sequence", "map", "set"], + "license": "Apache2", + "authors": [ + {"name": "Johannes M. Schmitt", "email": "schmittjoh@gmail.com"} + ], + "require": { + "phpoption/phpoption": "1.*" + }, + "autoload": { + "psr-0": { + "PhpCollection": "src/" + } + }, + "extra": { + "branch-alias": { + "dev-master": "0.4-dev" + } + } +} diff --git a/vendor/phpcollection/phpcollection/composer.lock b/vendor/phpcollection/phpcollection/composer.lock new file mode 100644 index 0000000000..da1f5b7f07 --- /dev/null +++ b/vendor/phpcollection/phpcollection/composer.lock @@ -0,0 +1,74 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file" + ], + "hash": "fd142320c7e09ab476e16ed23601288a", + "packages": [ + { + "name": "phpoption/phpoption", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "1.2.0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/1.2.0", + "reference": "1.2.0", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "psr-0": { + "PhpOption\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache2" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "http://jmsyst.com", + "role": "Developer of wrapped JMSSerializerBundle" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "time": "2013-03-25 02:51:40" + } + ], + "packages-dev": [ + + ], + "aliases": [ + + ], + "minimum-stability": "stable", + "stability-flags": [ + + ], + "platform": [ + + ], + "platform-dev": [ + + ] +} diff --git a/vendor/phpcollection/phpcollection/doc/LICENSE b/vendor/phpcollection/phpcollection/doc/LICENSE new file mode 100644 index 0000000000..a9aba5c6c9 --- /dev/null +++ b/vendor/phpcollection/phpcollection/doc/LICENSE @@ -0,0 +1,55 @@ +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + +1. Definitions + + "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License. + "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined above) for the purposes of this License. + "Distribute" means to make available to the public the original and copies of the Work through sale or other transfer of ownership. + "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License. + "Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast. + "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work. + "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. + "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images. + "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium. + +2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: + + to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections; and, + to Distribute and Publicly Perform the Work including as incorporated in Collections. + +The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats, but otherwise you have no rights to make Adaptations. Subject to 8(f), all rights not expressly granted by Licensor are hereby reserved, including but not limited to the rights set forth in Section 4(d). + +4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: + + You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(c), as requested. + You may not exercise any of the rights granted to You in Section 3 above in any manner that is primarily intended for or directed toward commercial advantage or private monetary compensation. The exchange of the Work for other copyrighted works by means of digital file-sharing or otherwise shall not be considered to be intended for or directed toward commercial advantage or private monetary compensation, provided there is no payment of any monetary compensation in connection with the exchange of copyrighted works. + If You Distribute, or Publicly Perform the Work or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work. The credit required by this Section 4(c) may be implemented in any reasonable manner; provided, however, that in the case of a Collection, at a minimum such credit will appear, if a credit for all contributing authors of Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties. + + For the avoidance of doubt: + Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; + Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License if Your exercise of such rights is for a purpose or use which is otherwise than noncommercial as permitted under Section 4(b) and otherwise waives the right to collect royalties through any statutory or compulsory licensing scheme; and, + Voluntary License Schemes. The Licensor reserves the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License that is for a purpose or use which is otherwise than noncommercial as permitted under Section 4(b). + Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. + Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. + +8. Miscellaneous + + Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. + If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. + This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. + The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law. diff --git a/vendor/phpcollection/phpcollection/doc/index.rst b/vendor/phpcollection/phpcollection/doc/index.rst new file mode 100644 index 0000000000..6fe0342825 --- /dev/null +++ b/vendor/phpcollection/phpcollection/doc/index.rst @@ -0,0 +1,152 @@ +PHP Collection +============== +This library adds basic collections for PHP. + +Collections can be seen as more specialized arrays for which certain contracts are guaranteed. + +Supported Collections: + +- Sequences + + - Keys: numerical, consequentially increasing, no gaps + - Values: anything, duplicates allowed + - Classes: ``Sequence``, ``SortedSequence`` + + +- Maps + + - Keys: strings or objects, duplicate keys not allowed + - Values: anything, duplicates allowed + - Classes: ``Map``, ``ObjectMap`` (not yet implemented) + + +- Sets + + - Keys: not meaningful + - Values: objects, or scalars, each value is guaranteed to be unique (see Set usage below for details) + - Classes: ``Set`` + +General Characteristics: + +- Collections are mutable (new elements may be added, existing elements may be modified or removed). Specialized + immutable versions may be added in the future though. +- Equality comparison between elements are always performed using the shallow comparison operator (===). +- Sorting algorithms are unstable, that means the order for equal elements is undefined (the default, and only PHP behavior). + + +Installation +------------ +PHP Collection can easily be installed via composer + +.. code-block :: bash + + composer require phpcollection/phpcollection + +or add it to your ``composer.json`` file. + +Usage +----- +Collection classes provide a rich API. + +Sets +~~~~ +In a Set each value is guaranteed to be unique. The ``Set`` class supports objects, and scalars as value. Equality +is determined via the following steps. + +**Equality of Objects** + + 1. If an object implements ``ObjectBasics``, equality is determined by the ``equals()`` method. + 2. If an object has an external handler like the ``DateTime`` that was registered via ``ObjectBasicsHandlerRegistry::registerHandlerFor``, + equality is determined by that handler's ``equals()`` method. + 3. If none of the above is applicable, equality is determined by identity ``$a === $b``. + +**Equality of Scalars** + + Scalar are considered equal if ``$a === $b`` is true. + + +.. code-block :: php + + $set = new Set(); + $set->add(new \DateTime('today')); + $set->add(new \DateTime('today')); + + var_dump(count($set)); // int(1) -> the same date is not added twice + + foreach ($set as $date) { + var_dump($date); + } + + $set->all(); + $set->addSet($otherSet); + $set->addAll($someElements); + + +Sequences +~~~~~~~~~ + +.. code-block :: php + + // Read Operations + $seq = new Sequence([0, 2, 3, 2]); + $seq->get(2); // int(3) + $seq->all(); // [0, 2, 3, 2] + + $seq->first(); // Some(0) + $seq->last(); // Some(2) + + // Write Operations + $seq = new Sequence([1, 5]); + $seq->get(0); // int(1) + $seq->update(0, 4); + $seq->get(0); // int(4) + $seq->remove(0); + $seq->get(0); // int(5) + + $seq = new Sequence([1, 4]); + $seq->add(2); + $seq->all(); // [1, 4, 2] + $seq->addAll(array(4, 5, 2)); + $seq->all(); // [1, 4, 2, 4, 5, 2] + + // Sort + $seq = new Sequence([0, 5, 4, 2]); + $seq->sortWith(function($a, $b) { return $a - $b; }); + $seq->all(); // [0, 2, 4, 5] + +Maps +~~~~ + +.. code-block :: php + + // Read Operations + $map = new Map(['foo' => 'bar', 'baz' => 'boo']); + $map->get('foo'); // Some('bar') + $map->get('foo')->get(); // string('bar') + $map->keys(); // ['foo', 'baz'] + $map->values(); // ['bar', 'boo'] + iterator_to_array($map); // ['foo' => 'bar', 'baz' => 'boo'] + + $map->first()->get(); // ['foo', 'bar'] + $map->last()->get(); // ['baz', 'boo'] + + // Write Operations + $map = new Map(); + $map->set('foo', 'bar'); + $map->setAll(array('bar' => 'baz', 'baz' => 'boo')); + $map->remove('foo'); + + // Sort + $map->sortWith('strcmp'); + +License +------- + +The code is released under the business-friendly `Apache2 license`_. + +Documentation is subject to the `Attribution-NonCommercial-NoDerivs 3.0 Unported +license`_. + +.. _Apache2 license: http://www.apache.org/licenses/LICENSE-2.0.html +.. _Attribution-NonCommercial-NoDerivs 3.0 Unported license: http://creativecommons.org/licenses/by-nc-nd/3.0/ + diff --git a/vendor/phpcollection/phpcollection/phpunit.xml.dist b/vendor/phpcollection/phpcollection/phpunit.xml.dist new file mode 100644 index 0000000000..0b73f29f4e --- /dev/null +++ b/vendor/phpcollection/phpcollection/phpunit.xml.dist @@ -0,0 +1,25 @@ + + + + + + ./tests/PhpCollection/ + + + + + + performance + + + diff --git a/vendor/phpcollection/phpcollection/src/PhpCollection/AbstractCollection.php b/vendor/phpcollection/phpcollection/src/PhpCollection/AbstractCollection.php new file mode 100644 index 0000000000..f11652b195 --- /dev/null +++ b/vendor/phpcollection/phpcollection/src/PhpCollection/AbstractCollection.php @@ -0,0 +1,52 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace PhpCollection; + +use PhpOption\LazyOption; +use PhpOption\Some; +use PhpOption\None; + +abstract class AbstractCollection +{ + public function contains($searchedElem) + { + foreach ($this as $elem) { + if ($elem === $searchedElem) { + return true; + } + } + + return false; + } + + public function find($callable) + { + $self = $this; + + return new LazyOption(function() use ($callable, $self) { + foreach ($self as $elem) { + if (call_user_func($callable, $elem) === true) { + return new Some($elem); + } + } + + return None::create(); + }); + } +} \ No newline at end of file diff --git a/vendor/phpcollection/phpcollection/src/PhpCollection/AbstractMap.php b/vendor/phpcollection/phpcollection/src/PhpCollection/AbstractMap.php new file mode 100644 index 0000000000..20cb26da6c --- /dev/null +++ b/vendor/phpcollection/phpcollection/src/PhpCollection/AbstractMap.php @@ -0,0 +1,304 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace PhpCollection; + +use PhpOption\Some; +use PhpOption\None; + +/** + * A simple map implementation which basically wraps an array with an object oriented interface. + * + * @author Johannes M. Schmitt + */ +class AbstractMap extends AbstractCollection implements \IteratorAggregate, MapInterface +{ + protected $elements; + + public function __construct(array $elements = array()) + { + $this->elements = $elements; + } + + public function set($key, $value) + { + $this->elements[$key] = $value; + } + + public function exists($callable) + { + foreach ($this as $k => $v) { + if ($callable($k, $v) === true) { + return true; + } + } + + return false; + } + + /** + * Sets all key/value pairs in the map. + * + * @param array $kvMap + * + * @return void + */ + public function setAll(array $kvMap) + { + $this->elements = array_merge($this->elements, $kvMap); + } + + public function addMap(MapInterface $map) + { + foreach ($map as $k => $v) { + $this->elements[$k] = $v; + } + } + + public function get($key) + { + if (isset($this->elements[$key])) { + return new Some($this->elements[$key]); + } + + return None::create(); + } + + public function all() + { + return $this->elements; + } + + public function remove($key) + { + if ( ! isset($this->elements[$key])) { + throw new \InvalidArgumentException(sprintf('The map has no key named "%s".', $key)); + } + + $element = $this->elements[$key]; + unset($this->elements[$key]); + + return $element; + } + + public function clear() + { + $this->elements = array(); + } + + public function first() + { + if (empty($this->elements)) { + return None::create(); + } + + $elem = reset($this->elements); + + return new Some(array(key($this->elements), $elem)); + } + + public function last() + { + if (empty($this->elements)) { + return None::create(); + } + + $elem = end($this->elements); + + return new Some(array(key($this->elements), $elem)); + } + + public function contains($elem) + { + foreach ($this->elements as $existingElem) { + if ($existingElem === $elem) { + return true; + } + } + + return false; + } + + public function containsKey($key) + { + return isset($this->elements[$key]); + } + + public function isEmpty() + { + return empty($this->elements); + } + + /** + * Returns a new filtered map. + * + * @param callable $callable receives the element and must return true (= keep), or false (= remove). + * + * @return AbstractMap + */ + public function filter($callable) + { + return $this->filterInternal($callable, true); + } + + /** + * Returns a new filtered map. + * + * @param callable $callable receives the element and must return true (= remove), or false (= keep). + * + * @return AbstractMap + */ + public function filterNot($callable) + { + return $this->filterInternal($callable, false); + } + + /** + * @param callable $callable + * @param boolean $booleanKeep + */ + private function filterInternal($callable, $booleanKeep) + { + $newElements = array(); + foreach ($this->elements as $k => $element) { + if ($booleanKeep !== call_user_func($callable, $element)) { + continue; + } + + $newElements[$k] = $element; + } + + return $this->createNew($newElements); + } + + public function foldLeft($initialValue, $callable) + { + $value = $initialValue; + foreach ($this->elements as $elem) { + $value = call_user_func($callable, $value, $elem); + } + + return $value; + } + + public function foldRight($initialValue, $callable) + { + $value = $initialValue; + foreach (array_reverse($this->elements) as $elem) { + $value = call_user_func($callable, $elem, $value); + } + + return $value; + } + + public function dropWhile($callable) + { + $newElements = array(); + $stopped = false; + foreach ($this->elements as $k => $v) { + if ( ! $stopped) { + if (call_user_func($callable, $k, $v) === true) { + continue; + } + + $stopped = true; + } + + $newElements[$k] = $v; + } + + return $this->createNew($newElements); + } + + public function drop($number) + { + if ($number <= 0) { + throw new \InvalidArgumentException(sprintf('The number must be greater than 0, but got %d.', $number)); + } + + return $this->createNew(array_slice($this->elements, $number, null, true)); + } + + public function dropRight($number) + { + if ($number <= 0) { + throw new \InvalidArgumentException(sprintf('The number must be greater than 0, but got %d.', $number)); + } + + return $this->createNew(array_slice($this->elements, 0, -1 * $number, true)); + } + + public function take($number) + { + if ($number <= 0) { + throw new \InvalidArgumentException(sprintf('The number must be greater than 0, but got %d.', $number)); + } + + return $this->createNew(array_slice($this->elements, 0, $number, true)); + } + + public function takeWhile($callable) + { + $newElements = array(); + foreach ($this->elements as $k => $v) { + if (call_user_func($callable, $k, $v) !== true) { + break; + } + + $newElements[$k] = $v; + } + + return $this->createNew($newElements); + } + + public function find($callable) + { + foreach ($this->elements as $k => $v) { + if (call_user_func($callable, $k, $v) === true) { + return new Some(array($k, $v)); + } + } + + return None::create(); + } + + public function keys() + { + return array_keys($this->elements); + } + + public function values() + { + return array_values($this->elements); + } + + public function count() + { + return count($this->elements); + } + + public function getIterator() + { + return new \ArrayIterator($this->elements); + } + + protected function createNew(array $elements) + { + return new static($elements); + } +} diff --git a/vendor/phpcollection/phpcollection/src/PhpCollection/AbstractSequence.php b/vendor/phpcollection/phpcollection/src/PhpCollection/AbstractSequence.php new file mode 100644 index 0000000000..5ce2bde971 --- /dev/null +++ b/vendor/phpcollection/phpcollection/src/PhpCollection/AbstractSequence.php @@ -0,0 +1,365 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace PhpCollection; + +use PhpOption\Some; +use PhpOption\None; +use PhpOption\Option; +use OutOfBoundsException; + +/** + * A sequence with numerically indexed elements. + * + * This is rawly equivalent to an array with only numeric keys. + * There are no restrictions on how many same values may occur in the sequence. + * + * This sequence is mutable. + * + * @author Johannes M. Schmitt + */ +class AbstractSequence extends AbstractCollection implements \IteratorAggregate, SequenceInterface +{ + protected $elements; + + /** + * @param array $elements + */ + public function __construct(array $elements = array()) + { + $this->elements = array_values($elements); + } + + public function addSequence(SequenceInterface $seq) + { + $this->addAll($seq->all()); + } + + public function indexOf($searchedElement) + { + foreach ($this->elements as $i => $element) { + if ($searchedElement === $element) { + return $i; + } + } + + return -1; + } + + public function lastIndexOf($searchedElement) + { + for ($i=count($this->elements)-1; $i>=0; $i--) { + if ($this->elements[$i] === $searchedElement) { + return $i; + } + } + + return -1; + } + + public function reverse() + { + return $this->createNew(array_reverse($this->elements)); + } + + public function isDefinedAt($index) + { + return isset($this->elements[$index]); + } + + /** + * Returns a filtered sequence. + * + * @param callable $callable receives the element and must return true (= keep) or false (= remove). + * + * @return AbstractSequence + */ + public function filter($callable) + { + return $this->filterInternal($callable, true); + } + + public function map($callable) + { + $newElements = array(); + foreach ($this->elements as $i => $element) { + $newElements[$i] = $callable($element); + } + + return $this->createNew($newElements); + } + + /** + * Returns a filtered sequence. + * + * @param callable $callable receives the element and must return true (= remove) or false (= keep). + * + * @return AbstractSequence + */ + public function filterNot($callable) + { + return $this->filterInternal($callable, false); + } + + private function filterInternal($callable, $booleanKeep) + { + $newElements = array(); + foreach ($this->elements as $element) { + if ($booleanKeep !== call_user_func($callable, $element)) { + continue; + } + + $newElements[] = $element; + } + + return $this->createNew($newElements); + } + + public function foldLeft($initialValue, $callable) + { + $value = $initialValue; + foreach ($this->elements as $elem) { + $value = call_user_func($callable, $value, $elem); + } + + return $value; + } + + public function foldRight($initialValue, $callable) + { + $value = $initialValue; + foreach (array_reverse($this->elements) as $elem) { + $value = call_user_func($callable, $elem, $value); + } + + return $value; + } + + /** + * Finds the first index where the given callable returns true. + * + * @param callable $callable + * + * @return integer the index, or -1 if the predicate is not true for any element. + */ + public function indexWhere($callable) + { + foreach ($this->elements as $i => $element) { + if (call_user_func($callable, $element) === true) { + return $i; + } + } + + return -1; + } + + public function lastIndexWhere($callable) + { + for ($i=count($this->elements)-1; $i>=0; $i--) { + if (call_user_func($callable, $this->elements[$i]) === true) { + return $i; + } + } + + return -1; + } + + public function last() + { + if (empty($this->elements)) { + return None::create(); + } + + return new Some(end($this->elements)); + } + + public function first() + { + if (empty($this->elements)) { + return None::create(); + } + + return new Some(reset($this->elements)); + } + + public function indices() + { + return array_keys($this->elements); + } + + /** + * Returns an element based on its index (0-based). + * + * @param integer $index + * + * @return T + */ + public function get($index) + { + if ( ! isset($this->elements[$index])) { + throw new OutOfBoundsException(sprintf('The index "%s" does not exist in this sequence.', $index)); + } + + return $this->elements[$index]; + } + + /** + * Removes the element at the given index, and returns it. + * + * @param int $index + * + * @return T + * + * @throws \OutOfBoundsException If there is no element at the given index. + */ + public function remove($index) + { + if ( ! isset($this->elements[$index])) { + throw new OutOfBoundsException(sprintf('The index "%d" is not in the interval [0, %d).', $index, count($this->elements))); + } + + $element = $this->elements[$index]; + unset($this->elements[$index]); + $this->elements = array_values($this->elements); + + return $element; + } + + /** + * Updates the element at the given index (0-based). + * + * @param integer $index + * @param T $value + */ + public function update($index, $value) + { + if ( ! isset($this->elements[$index])) { + throw new \InvalidArgumentException(sprintf('There is no element at index "%d".', $index)); + } + + $this->elements[$index] = $value; + } + + public function isEmpty() + { + return empty($this->elements); + } + + public function all() + { + return $this->elements; + } + + public function add($newElement) + { + $this->elements[] = $newElement; + } + + public function addAll(array $addedElements) + { + foreach ($addedElements as $newElement) { + $this->elements[] = $newElement; + } + } + + public function take($number) + { + if ($number <= 0) { + throw new \InvalidArgumentException(sprintf('$number must be greater than 0, but got %d.', $number)); + } + + return $this->createNew(array_slice($this->elements, 0, $number)); + } + + /** + * Extracts element from the head while the passed callable returns true. + * + * @param callable $callable receives elements of this sequence as first argument, and returns true/false. + * + * @return Sequence + */ + public function takeWhile($callable) + { + $newElements = array(); + + for ($i=0,$c=count($this->elements); $i<$c; $i++) { + if (call_user_func($callable, $this->elements[$i]) !== true) { + break; + } + + $newElements[] = $this->elements[$i]; + } + + return $this->createNew($newElements); + } + + public function drop($number) + { + if ($number <= 0) { + throw new \InvalidArgumentException(sprintf('The number must be greater than 0, but got %d.', $number)); + } + + return $this->createNew(array_slice($this->elements, $number)); + } + + public function dropRight($number) + { + if ($number <= 0) { + throw new \InvalidArgumentException(sprintf('The number must be greater than 0, but got %d.', $number)); + } + + return $this->createNew(array_slice($this->elements, 0, -1 * $number)); + } + + public function dropWhile($callable) + { + for ($i=0,$c=count($this->elements); $i<$c; $i++) { + if (true !== call_user_func($callable, $this->elements[$i])) { + break; + } + } + + return $this->createNew(array_slice($this->elements, $i)); + } + + public function exists($callable) + { + foreach ($this as $elem) { + if ($callable($elem) === true) { + return true; + } + } + + return false; + } + + public function count() + { + return count($this->elements); + } + + public function getIterator() + { + return new \ArrayIterator($this->elements); + } + + protected function createNew(array $elements) + { + return new static($elements); + } +} \ No newline at end of file diff --git a/vendor/phpcollection/phpcollection/src/PhpCollection/CollectionInterface.php b/vendor/phpcollection/phpcollection/src/PhpCollection/CollectionInterface.php new file mode 100644 index 0000000000..f60bd607aa --- /dev/null +++ b/vendor/phpcollection/phpcollection/src/PhpCollection/CollectionInterface.php @@ -0,0 +1,84 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace PhpCollection; + +/** + * Basic interface which adds some behaviors, and a few methods common to all collections. + * + * @author Johannes M. Schmitt + */ +interface CollectionInterface extends \Traversable, \Countable +{ + /** + * Returns whether this collection contains the passed element. + * + * @param mixed $elem + * + * @return boolean + */ + public function contains($elem); + + /** + * Returns whether the collection is empty. + * + * @return boolean + */ + public function isEmpty(); + + /** + * Returns a filtered collection of the same type. + * + * Removes all elements for which the provided callable returns false. + * + * @param callable $callable receives an element of the collection and must return true (= keep) or false (= remove). + * + * @return CollectionInterface + */ + public function filter($callable); + + /** + * Returns a filtered collection of the same type. + * + * Removes all elements for which the provided callable returns true. + * + * @param callable $callable receives an element of the collection and must return true (= remove) or false (= keep). + * + * @return CollectionInterface + */ + public function filterNot($callable); + + /** + * Applies the callable to an initial value and each element, going left to right. + * + * @param mixed $initialValue + * @param callable $callable receives the current value (the first time this equals $initialValue) and the element + * + * @return mixed the last value returned by $callable, or $initialValue if collection is empty. + */ + public function foldLeft($initialValue, $callable); + + /** + * Applies the callable to each element, and an initial value, going right to left. + * + * @param mixed $initialValue + * @param callable $callable receives the element, and the current value (the first time this equals $initialValue). + * @return mixed the last value returned by $callable, or $initialValue if collection is empty. + */ + public function foldRight($initialValue, $callable); +} \ No newline at end of file diff --git a/vendor/phpcollection/phpcollection/src/PhpCollection/EntityLikeObject.php b/vendor/phpcollection/phpcollection/src/PhpCollection/EntityLikeObject.php new file mode 100644 index 0000000000..d0d6f4b2c2 --- /dev/null +++ b/vendor/phpcollection/phpcollection/src/PhpCollection/EntityLikeObject.php @@ -0,0 +1,23 @@ + + */ +trait EntityLikeObject +{ + public function hash() + { + return spl_object_hash($this); + } + + public function equals(ObjectBasics $other) + { + return $this === $other; + } +} \ No newline at end of file diff --git a/vendor/phpcollection/phpcollection/src/PhpCollection/Map.php b/vendor/phpcollection/phpcollection/src/PhpCollection/Map.php new file mode 100644 index 0000000000..cb56ba4135 --- /dev/null +++ b/vendor/phpcollection/phpcollection/src/PhpCollection/Map.php @@ -0,0 +1,27 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace PhpCollection; + +class Map extends AbstractMap implements SortableInterface +{ + public function sortWith($callable) + { + uksort($this->elements, $callable); + } +} \ No newline at end of file diff --git a/vendor/phpcollection/phpcollection/src/PhpCollection/MapInterface.php b/vendor/phpcollection/phpcollection/src/PhpCollection/MapInterface.php new file mode 100644 index 0000000000..a9741348d6 --- /dev/null +++ b/vendor/phpcollection/phpcollection/src/PhpCollection/MapInterface.php @@ -0,0 +1,173 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace PhpCollection; + +use PhpOption\Option; + +/** + * Basic map interface. + * + * @author Johannes M. Schmitt + */ +interface MapInterface extends CollectionInterface +{ + /** + * Returns the first element in the collection if available. + * + * @return Option on array + */ + public function first(); + + /** + * Returns the last element in the collection if available. + * + * @return Option on array + */ + public function last(); + + /** + * Returns all elements in this collection. + * + * @return array + */ + public function all(); + + /** + * Searches the collection for an element. + * + * @param callable $callable receives the element as first argument, and returns true, or false + * + * @return Option on array + */ + public function find($callable); + + /** + * Returns the value associated with the given key. + * + * @param mixed $key + * + * @return Option on V + */ + public function get($key); + + /** + * Returns whether this map contains a given key. + * + * @param mixed $key + * + * @return boolean + */ + public function containsKey($key); + + /** + * Puts a new element in the map. + * + * @param mixed $key + * @param mixed $value + * + * @return void + */ + public function set($key, $value); + + /** + * Removes an element from the map. + * + * @param mixed $key + * + * @return mixed + */ + public function remove($key); + + /** + * Adds all another map to this map, and returns itself. + * + * @param MapInterface $map + * + * @return MapInterface + */ + public function addMap(MapInterface $map); + + /** + * Returns an array with the keys. + * + * @return array + */ + public function keys(); + + /** + * Returns an array with the values. + * + * @return array + */ + public function values(); + + /** + * Returns a new sequence by omitting the given number of elements from the beginning. + * + * If the passed number is greater than the available number of elements, all will be removed. + * + * @param integer $number + * + * @return MapInterface + */ + public function drop($number); + + /** + * Returns a new sequence by omitting the given number of elements from the end. + * + * If the passed number is greater than the available number of elements, all will be removed. + * + * @param integer $number + * + * @return MapInterface + */ + public function dropRight($number); + + /** + * Returns a new sequence by omitting elements from the beginning for as long as the callable returns true. + * + * @param callable $callable Receives the element to drop as first argument, and returns true (drop), or false (stop). + * + * @return MapInterface + */ + public function dropWhile($callable); + + /** + * Creates a new collection by taking the given number of elements from the beginning + * of the current collection. + * + * If the passed number is greater than the available number of elements, then all elements + * will be returned as a new collection. + * + * @param integer $number + * + * @return MapInterface + */ + public function take($number); + + /** + * Creates a new collection by taking elements from the current collection + * for as long as the callable returns true. + * + * @param callable $callable + * + * @return MapInterface + */ + public function takeWhile($callable); +} diff --git a/vendor/phpcollection/phpcollection/src/PhpCollection/ObjectBasics.php b/vendor/phpcollection/phpcollection/src/PhpCollection/ObjectBasics.php new file mode 100644 index 0000000000..222d06cada --- /dev/null +++ b/vendor/phpcollection/phpcollection/src/PhpCollection/ObjectBasics.php @@ -0,0 +1,40 @@ + + */ +interface ObjectBasics +{ + /** + * Produces a hash for the given object. + * + * If two objects are equal (as per the equals() method), the hash() method must produce + * the same hash for them. + * + * The reverse can, but does not necessarily have to be true. That is, if two objects have the + * same hash, they do not necessarily have to be equal, but the equals() method must be called + * to be sure. + * + * When implementing this method try to use a simple and fast algorithm that produces reasonably + * different results for non-equal objects, and shift the heavy comparison logic to equals(). + * + * @return string|integer + */ + public function hash(); + + /** + * Whether two objects are equal. + * + * This can compare by referential equality (===), or in case of value objects like (\DateTime) compare + * the individual properties of the objects; it's up to the implementation. + * + * @return boolean + */ + public function equals(ObjectBasics $other); +} \ No newline at end of file diff --git a/vendor/phpcollection/phpcollection/src/PhpCollection/ObjectBasicsHandler.php b/vendor/phpcollection/phpcollection/src/PhpCollection/ObjectBasicsHandler.php new file mode 100644 index 0000000000..bf4c1e9f76 --- /dev/null +++ b/vendor/phpcollection/phpcollection/src/PhpCollection/ObjectBasicsHandler.php @@ -0,0 +1,24 @@ + + */ +interface ObjectBasicsHandler +{ + /** + * @param object $object This object is guaranteed to be of the type the handler was registered for. + * @return string|integer + */ + public function hash($object); + + /** + * @param object $firstObject This object is guaranteed to be of the type the handler was registered for. + * @param object $secondObject This might be an object of any class. + * @return boolean + */ + public function equals($firstObject, $secondObject); +} \ No newline at end of file diff --git a/vendor/phpcollection/phpcollection/src/PhpCollection/ObjectBasicsHandler/DateTimeHandler.php b/vendor/phpcollection/phpcollection/src/PhpCollection/ObjectBasicsHandler/DateTimeHandler.php new file mode 100644 index 0000000000..d2551ad1a2 --- /dev/null +++ b/vendor/phpcollection/phpcollection/src/PhpCollection/ObjectBasicsHandler/DateTimeHandler.php @@ -0,0 +1,29 @@ +getTimestamp(); + } + + public function equals($thisObject, $otherObject) + { + if ( ! $thisObject instanceof \DateTime) { + throw new \LogicException('$thisObject must be an instance of \DateTime.'); + } + if ( ! $otherObject instanceof \DateTime) { + return false; + } + + return $thisObject->format(\DateTime::ISO8601) === $otherObject->format(\DateTime::ISO8601); + } +} \ No newline at end of file diff --git a/vendor/phpcollection/phpcollection/src/PhpCollection/ObjectBasicsHandler/IdentityHandler.php b/vendor/phpcollection/phpcollection/src/PhpCollection/ObjectBasicsHandler/IdentityHandler.php new file mode 100644 index 0000000000..2cc49fb9d6 --- /dev/null +++ b/vendor/phpcollection/phpcollection/src/PhpCollection/ObjectBasicsHandler/IdentityHandler.php @@ -0,0 +1,18 @@ + + */ +abstract class ObjectBasicsHandlerRegistry +{ + private static $handlers = array( + 'DateTime' => 'PhpCollection\\ObjectBasicsHandler\\DateTimeHandler', + ); + private static $defaultObjectHandler; + + private static $aliases = array(); + + /** + * Defines an alias. + * + * $aliasClass must be a sub-type (extend or implement) $handlingClass; otherwise you will run into trouble. + * + * Aliases can only be one level deep, + * + * i.e. aliasClass -> handlingClass is supported, + * but aliasClass -> anotherAliasClass -> handlingClass is not. + * + * @param string $handlingClass The class that should be aliased, i.e. MyDateTime + * @param string $aliasClass The class that should be used instead, i.e. DateTime + */ + public static function addAliasFor($handlingClass, $aliasClass) + { + self::$aliases[$handlingClass] = $aliasClass; + } + + public static function addHandlerFor($handlingClass, $handlerInstanceOrClassName) + { + if ( ! $handlerInstanceOrClassName instanceof ObjectBasicsHandler && ! is_string($handlerInstanceOrClassName)) { + throw new \LogicException('$handler must be an instance of ObjectBasicsHandler, or a string referring to the handlers class.'); + } + + self::$handlers[$handlingClass] = $handlerInstanceOrClassName; + } + + public static function getHandler($className) + { + if (isset(self::$aliases[$className])) { + $className = self::$aliases[$className]; + } + + if ( ! isset(self::$handlers[$className])) { + if (self::$defaultObjectHandler === null) { + self::$defaultObjectHandler = new IdentityHandler(); + } + + return self::$defaultObjectHandler; + } + + if (self::$handlers[$className] instanceof ObjectBasicsHandler) { + return self::$handlers[$className]; + } + + if (is_string(self::$handlers[$className])) { + $handlerClass = self::$handlers[$className]; + + return self::$handlers[$className] = new $handlerClass(); + } + + throw new \LogicException(sprintf( + 'Unknown handler type ("%s") for class "%s" - should never be reached.', + gettype(self::$handlers[$className]), + $className + )); + } + + private final function __construct() { } +} \ No newline at end of file diff --git a/vendor/phpcollection/phpcollection/src/PhpCollection/Sequence.php b/vendor/phpcollection/phpcollection/src/PhpCollection/Sequence.php new file mode 100644 index 0000000000..e5e82a8f71 --- /dev/null +++ b/vendor/phpcollection/phpcollection/src/PhpCollection/Sequence.php @@ -0,0 +1,38 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace PhpCollection; + +/** + * Unsorted sequence implementation. + * + * Characteristics: + * + * - Keys: consequentially numbered, without gaps + * - Values: anything, duplicates allowed + * - Ordering: same as input unless when explicitly sorted + * + * @author Johannes M. Schmitt + */ +class Sequence extends AbstractSequence implements SortableInterface +{ + public function sortWith($callable) + { + usort($this->elements, $callable); + } +} \ No newline at end of file diff --git a/vendor/phpcollection/phpcollection/src/PhpCollection/SequenceInterface.php b/vendor/phpcollection/phpcollection/src/PhpCollection/SequenceInterface.php new file mode 100644 index 0000000000..43e4077656 --- /dev/null +++ b/vendor/phpcollection/phpcollection/src/PhpCollection/SequenceInterface.php @@ -0,0 +1,227 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace PhpCollection; + +use PhpOption\Option; + +/** + * Interface for mutable sequences. + * + * Equality of elements in the sequence is established via a shallow comparison (===). + * + * @author Johannes M. Schmitt + */ +interface SequenceInterface extends CollectionInterface +{ + /** + * Returns the first element in the collection if available. + * + * @return Option + */ + public function first(); + + /** + * Returns the last element in the collection if available. + * + * @return Option + */ + public function last(); + + /** + * Returns all elements in this sequence. + * + * @return array + */ + public function all(); + + /** + * Returns a new Sequence with all elements in reverse order. + * + * @return SequenceInterface + */ + public function reverse(); + + /** + * Adds the elements of another sequence to this sequence. + * + * @param SequenceInterface $seq + * + * @return SequenceInterface + */ + public function addSequence(SequenceInterface $seq); + + /** + * Returns the index of the passed element. + * + * @param mixed $elem + * + * @return integer the index (0-based), or -1 if not found + */ + public function indexOf($elem); + + /** + * Returns the last index of the passed element. + * + * @param mixed $elem + * @return integer the index (0-based), or -1 if not found + */ + public function lastIndexOf($elem); + + /** + * Returns whether the given index is defined in the sequence. + * + * @param integer $index (0-based) + * @return boolean + */ + public function isDefinedAt($index); + + /** + * Returns the first index where the given callable returns true. + * + * @param callable $callable receives the element as first argument, and returns true, or false + * + * @return integer the index (0-based), or -1 if the callable returns false for all elements + */ + public function indexWhere($callable); + + /** + * Returns the last index where the given callable returns true. + * + * @param callable $callable receives the element as first argument, and returns true, or false + * + * @return integer the index (0-based), or -1 if the callable returns false for all elements + */ + public function lastIndexWhere($callable); + + /** + * Returns all indices of this collection. + * + * @return integer[] + */ + public function indices(); + + /** + * Returns the element at the given index. + * + * @param integer $index (0-based) + * + * @return mixed + */ + public function get($index); + + /** + * Adds an element to the sequence. + * + * @param mixed $elem + * + * @return void + */ + public function add($elem); + + /** + * Removes the element at the given index, and returns it. + * + * @param integer $index + * + * @return mixed + */ + public function remove($index); + + /** + * Adds all elements to the sequence. + * + * @param array $elements + * + * @return void + */ + public function addAll(array $elements); + + /** + * Updates the value at the given index. + * + * @param integer $index + * @param mixed $value + * + * @return void + */ + public function update($index, $value); + + /** + * Returns a new sequence by omitting the given number of elements from the beginning. + * + * If the passed number is greater than the available number of elements, all will be removed. + * + * @param integer $number + * + * @return SequenceInterface + */ + public function drop($number); + + /** + * Returns a new sequence by omitting the given number of elements from the end. + * + * If the passed number is greater than the available number of elements, all will be removed. + * + * @param integer $number + * + * @return SequenceInterface + */ + public function dropRight($number); + + /** + * Returns a new sequence by omitting elements from the beginning for as long as the callable returns true. + * + * @param callable $callable Receives the element to drop as first argument, and returns true (drop), or false (stop). + * + * @return SequenceInterface + */ + public function dropWhile($callable); + + /** + * Creates a new collection by taking the given number of elements from the beginning + * of the current collection. + * + * If the passed number is greater than the available number of elements, then all elements + * will be returned as a new collection. + * + * @param integer $number + * + * @return CollectionInterface + */ + public function take($number); + + /** + * Creates a new collection by taking elements from the current collection + * for as long as the callable returns true. + * + * @param callable $callable + * + * @return CollectionInterface + */ + public function takeWhile($callable); + + /** + * Creates a new collection by applying the passed callable to all elements + * of the current collection. + * + * @param callable $callable + * @return CollectionInterface + */ + public function map($callable); +} diff --git a/vendor/phpcollection/phpcollection/src/PhpCollection/Set.php b/vendor/phpcollection/phpcollection/src/PhpCollection/Set.php new file mode 100644 index 0000000000..1d70accfd8 --- /dev/null +++ b/vendor/phpcollection/phpcollection/src/PhpCollection/Set.php @@ -0,0 +1,449 @@ + + */ +class Set implements SetInterface +{ + const ELEM_TYPE_SCALAR = 1; + const ELEM_TYPE_OBJECT = 2; + const ELEM_TYPE_OBJECT_WITH_HANDLER = 3; + + private $elementType; + + private $elements = array(); + private $elementCount = 0; + private $lookup = array(); + + public function __construct(array $elements = array()) + { + $this->addAll($elements); + } + + public function first() + { + if (empty($this->elements)) { + return None::create(); + } + + return new Some(reset($this->elements)); + } + + public function last() + { + if (empty($this->elements)) { + return None::create(); + } + + return new Some(end($this->elements)); + } + + public function getIterator() + { + return new \ArrayIterator(array_values($this->elements)); + } + + public function addSet(SetInterface $set) + { + $this->addAll($set->all()); + } + + public function take($number) + { + if ($number <= 0) { + throw new \InvalidArgumentException(sprintf('$number must be greater than 0, but got %d.', $number)); + } + + return $this->createNew(array_slice($this->elements, 0, $number)); + } + + /** + * Extracts element from the head while the passed callable returns true. + * + * @param callable $callable receives elements of this Set as first argument, and returns true/false. + * + * @return Set + */ + public function takeWhile($callable) + { + $newElements = array(); + + for ($i=0,$c=count($this->elements); $i<$c; $i++) { + if (call_user_func($callable, $this->elements[$i]) !== true) { + break; + } + + $newElements[] = $this->elements[$i]; + } + + return $this->createNew($newElements); + } + + public function drop($number) + { + if ($number <= 0) { + throw new \InvalidArgumentException(sprintf('The number must be greater than 0, but got %d.', $number)); + } + + return $this->createNew(array_slice($this->elements, $number)); + } + + public function dropRight($number) + { + if ($number <= 0) { + throw new \InvalidArgumentException(sprintf('The number must be greater than 0, but got %d.', $number)); + } + + return $this->createNew(array_slice($this->elements, 0, -1 * $number)); + } + + public function dropWhile($callable) + { + for ($i=0,$c=count($this->elements); $i<$c; $i++) { + if (true !== call_user_func($callable, $this->elements[$i])) { + break; + } + } + + return $this->createNew(array_slice($this->elements, $i)); + } + + public function map($callable) + { + $newElements = array(); + foreach ($this->elements as $i => $element) { + $newElements[$i] = $callable($element); + } + + return $this->createNew($newElements); + } + + public function reverse() + { + return $this->createNew(array_reverse($this->elements)); + } + + public function all() + { + return array_values($this->elements); + } + + public function filterNot($callable) + { + return $this->filterInternal($callable, false); + } + + public function filter($callable) + { + return $this->filterInternal($callable, true); + } + + public function foldLeft($initialValue, $callable) + { + $value = $initialValue; + foreach ($this->elements as $elem) { + $value = call_user_func($callable, $value, $elem); + } + + return $value; + } + + public function foldRight($initialValue, $callable) + { + $value = $initialValue; + foreach (array_reverse($this->elements) as $elem) { + $value = call_user_func($callable, $elem, $value); + } + + return $value; + } + + public function addAll(array $elements) + { + foreach ($elements as $elem) { + $this->add($elem); + } + } + + public function count() + { + return count($this->elements); + } + + public function contains($elem) + { + if ($this->elementType === self::ELEM_TYPE_OBJECT) { + if ($elem instanceof ObjectBasics) { + return $this->containsObject($elem); + } + + return false; + } elseif ($this->elementType === self::ELEM_TYPE_OBJECT_WITH_HANDLER) { + if (is_object($elem)) { + return $this->containsObjectWithHandler($elem, ObjectBasicsHandlerRegistry::getHandler(get_class($elem))); + } + + return false; + } elseif ($this->elementType === self::ELEM_TYPE_SCALAR) { + if (is_scalar($elem)) { + return $this->containsScalar($elem); + } + + return false; + } + + return false; + } + + public function remove($elem) + { + if ($this->elementType === self::ELEM_TYPE_OBJECT) { + if ($elem instanceof ObjectBasics) { + $this->removeObject($elem); + } + } elseif ($this->elementType === self::ELEM_TYPE_OBJECT_WITH_HANDLER) { + if (is_object($elem)) { + $this->removeObjectWithHandler($elem, ObjectBasicsHandlerRegistry::getHandler(get_class($elem))); + } + } elseif ($this->elementType === self::ELEM_TYPE_SCALAR) { + if (is_scalar($elem)) { + $this->removeScalar($elem); + } + } + } + + public function isEmpty() + { + return empty($this->elements); + } + + public function add($elem) + { + if ($this->elementType === null) { + if ($elem instanceof ObjectBasics) { + $this->addObject($elem); + } elseif (is_scalar($elem)) { + $this->addScalar($elem); + } else { + if (is_object($elem)) { + $this->addObjectWithHandler($elem, ObjectBasicsHandlerRegistry::getHandler(get_class($elem))); + } else { + throw new \LogicException(sprintf('The type of $elem ("%s") is not supported in sets.', gettype($elem))); + } + } + } elseif ($this->elementType === self::ELEM_TYPE_OBJECT) { + if ($elem instanceof ObjectBasics) { + $this->addObject($elem); + + return; + } + + if (is_object($elem)) { + throw new \LogicException(sprintf('This Set already contains object implement ObjectBasics, and cannot be mixed with objects that do not implement this interface like "%s".', get_class($elem))); + } + + throw new \LogicException(sprintf('This Set already contains objects, and cannot be mixed with elements of type "%s".', gettype($elem))); + } elseif ($this->elementType === self::ELEM_TYPE_OBJECT_WITH_HANDLER) { + if (is_object($elem)) { + $this->addObjectWithHandler($elem, ObjectBasicsHandlerRegistry::getHandler(get_class($elem))); + + return; + } + + throw new \LogicException(sprintf('This Set already contains object with an external handler, and cannot be mixed with elements of type "%s".', gettype($elem))); + } elseif ($this->elementType === self::ELEM_TYPE_SCALAR) { + if (is_scalar($elem)) { + $this->addScalar($elem); + + return; + } + + throw new \LogicException(sprintf('This Set already contains scalars, and cannot be mixed with elements of type "%s".', gettype($elem))); + } else { + throw new \LogicException('Unknown element type in Set - should never be reached.'); + } + } + + protected function createNew(array $elements) + { + return new static($elements); + } + + private function filterInternal($callable, $booleanKeep) + { + $newElements = array(); + foreach ($this->elements as $element) { + if ($booleanKeep !== call_user_func($callable, $element)) { + continue; + } + + $newElements[] = $element; + } + + return $this->createNew($newElements); + } + + private function containsScalar($elem) + { + if ( ! isset($this->lookup[$elem])) { + return false; + } + + foreach ($this->lookup[$elem] as $index) { + if ($elem === $this->elements[$index]) { + return true; + } + } + + return false; + } + + private function containsObjectWithHandler($object, ObjectBasicsHandler $handler) + { + $hash = $handler->hash($object); + if ( ! isset($this->lookup[$hash])) { + return false; + } + + foreach ($this->lookup[$hash] as $index) { + if ($handler->equals($object, $this->elements[$index])) { + return true; + } + } + + return false; + } + + private function containsObject(ObjectBasics $object) + { + $hash = $object->hash(); + if ( ! isset($this->lookup[$hash])) { + return false; + } + + foreach ($this->lookup[$hash] as $index) { + if ($object->equals($this->elements[$index])) { + return true; + } + } + + return false; + } + + private function removeScalar($elem) + { + if ( ! isset($this->lookup[$elem])) { + return; + } + + foreach ($this->lookup[$elem] as $k => $index) { + if ($elem === $this->elements[$index]) { + $this->removeElement($elem, $k, $index); + break; + } + } + } + + private function removeObjectWithHandler($object, ObjectBasicsHandler $handler) + { + $hash = $handler->hash($object); + if ( ! isset($this->lookup[$hash])) { + return; + } + + foreach ($this->lookup[$hash] as $k => $index) { + if ($handler->equals($object, $this->elements[$index])) { + $this->removeElement($hash, $k, $index); + break; + } + } + } + + private function removeObject(ObjectBasics $object) + { + $hash = $object->hash(); + if ( ! isset($this->lookup[$hash])) { + return; + } + + foreach ($this->lookup[$hash] as $k => $index) { + if ($object->equals($this->elements[$index])) { + $this->removeElement($hash, $k, $index); + break; + } + } + } + + private function removeElement($hash, $lookupIndex, $storageIndex) + { + unset($this->lookup[$hash][$lookupIndex]); + if (empty($this->lookup[$hash])) { + unset($this->lookup[$hash]); + } + + unset($this->elements[$storageIndex]); + } + + private function addScalar($elem) + { + if (isset($this->lookup[$elem])) { + foreach ($this->lookup[$elem] as $index) { + if ($this->elements[$index] === $elem) { + return; // Already exists. + } + } + } + + $this->insertElement($elem, $elem); + $this->elementType = self::ELEM_TYPE_SCALAR; + } + + private function addObjectWithHandler($object, ObjectBasicsHandler $handler) + { + $hash = $handler->hash($object); + if (isset($this->lookup[$hash])) { + foreach ($this->lookup[$hash] as $index) { + if ($handler->equals($object, $this->elements[$index])) { + return; // Already exists. + } + } + } + + $this->insertElement($object, $hash); + $this->elementType = self::ELEM_TYPE_OBJECT_WITH_HANDLER; + } + + private function addObject(ObjectBasics $elem) + { + $hash = $elem->hash(); + if (isset($this->lookup[$hash])) { + foreach ($this->lookup[$hash] as $index) { + if ($elem->equals($this->elements[$index])) { + return; // Element already exists. + } + } + } + + $this->insertElement($elem, $hash); + $this->elementType = self::ELEM_TYPE_OBJECT; + } + + private function insertElement($elem, $hash) + { + $index = $this->elementCount++; + $this->elements[$index] = $elem; + $this->lookup[$hash][] = $index; + } +} \ No newline at end of file diff --git a/vendor/phpcollection/phpcollection/src/PhpCollection/SetInterface.php b/vendor/phpcollection/phpcollection/src/PhpCollection/SetInterface.php new file mode 100644 index 0000000000..a2b250d561 --- /dev/null +++ b/vendor/phpcollection/phpcollection/src/PhpCollection/SetInterface.php @@ -0,0 +1,132 @@ + + */ +interface SetInterface extends CollectionInterface, \IteratorAggregate +{ + /** + * @param object|scalar $elem + * @return void + */ + public function add($elem); + + /** + * @param object|scalar $elements + * @return void + */ + public function addAll(array $elements); + + /** + * @param object|scalar $elem + * @return void + */ + public function remove($elem); + + /** + * Returns the first element in the collection if available. + * + * @return Option + */ + public function first(); + + /** + * Returns the last element in the collection if available. + * + * @return Option + */ + public function last(); + + /** + * Returns all elements in this Set. + * + * @return array + */ + public function all(); + + /** + * Returns a new Set with all elements in reverse order. + * + * @return SetInterface + */ + public function reverse(); + + /** + * Adds the elements of another Set to this Set. + * + * @param SetInterface $seq + * + * @return SetInterface + */ + public function addSet(SetInterface $seq); + + /** + * Returns a new Set by omitting the given number of elements from the beginning. + * + * If the passed number is greater than the available number of elements, all will be removed. + * + * @param integer $number + * + * @return SetInterface + */ + public function drop($number); + + /** + * Returns a new Set by omitting the given number of elements from the end. + * + * If the passed number is greater than the available number of elements, all will be removed. + * + * @param integer $number + * + * @return SetInterface + */ + public function dropRight($number); + + /** + * Returns a new Set by omitting elements from the beginning for as long as the callable returns true. + * + * @param callable $callable Receives the element to drop as first argument, and returns true (drop), or false (stop). + * + * @return SetInterface + */ + public function dropWhile($callable); + + /** + * Creates a new collection by taking the given number of elements from the beginning + * of the current collection. + * + * If the passed number is greater than the available number of elements, then all elements + * will be returned as a new collection. + * + * @param integer $number + * + * @return CollectionInterface + */ + public function take($number); + + /** + * Creates a new collection by taking elements from the current collection + * for as long as the callable returns true. + * + * @param callable $callable + * + * @return CollectionInterface + */ + public function takeWhile($callable); + + /** + * Creates a new collection by applying the passed callable to all elements + * of the current collection. + * + * @param callable $callable + * @return CollectionInterface + */ + public function map($callable); +} \ No newline at end of file diff --git a/vendor/phpcollection/phpcollection/src/PhpCollection/SortableInterface.php b/vendor/phpcollection/phpcollection/src/PhpCollection/SortableInterface.php new file mode 100644 index 0000000000..65bc5d1561 --- /dev/null +++ b/vendor/phpcollection/phpcollection/src/PhpCollection/SortableInterface.php @@ -0,0 +1,29 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace PhpCollection; + +/** + * Interface for sortable collections. + * + * @author Johannes M. Schmitt + */ +interface SortableInterface +{ + public function sortWith($callable); +} \ No newline at end of file diff --git a/vendor/phpcollection/phpcollection/src/PhpCollection/SortedSequence.php b/vendor/phpcollection/phpcollection/src/PhpCollection/SortedSequence.php new file mode 100644 index 0000000000..8606cfea2b --- /dev/null +++ b/vendor/phpcollection/phpcollection/src/PhpCollection/SortedSequence.php @@ -0,0 +1,93 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace PhpCollection; + +/** + * A sequence with a fixed sort-order. + * + * @author Johannes M. Schmitt + */ +class SortedSequence extends AbstractSequence +{ + private $sortFunc; + + public function __construct($sortFunc, array $elements = array()) + { + usort($elements, $sortFunc); + parent::__construct($elements); + + $this->sortFunc = $sortFunc; + } + + public function add($newElement) + { + $added = false; + $newElements = array(); + foreach ($this->elements as $element) { + // We insert the new element before the first element that is greater than itself. + if ( ! $added && (integer) call_user_func($this->sortFunc, $newElement, $element) < 0) { + $newElements[] = $newElement; + $added = true; + } + + $newElements[] = $element; + } + + if ( ! $added) { + $newElements[] = $newElement; + } + $this->elements = $newElements; + } + + public function addAll(array $addedElements) + { + usort($addedElements, $this->sortFunc); + + $newElements = array(); + foreach ($this->elements as $element) { + if ( ! empty($addedElements)) { + foreach ($addedElements as $i => $newElement) { + // If the currently looked at $newElement is not smaller than $element, then we can also conclude + // that all other new elements are also not smaller than $element as we have ordered them before. + if ((integer) call_user_func($this->sortFunc, $newElement, $element) > -1) { + break; + } + + $newElements[] = $newElement; + unset($addedElements[$i]); + } + } + + $newElements[] = $element; + } + + if ( ! empty($addedElements)) { + foreach ($addedElements as $newElement) { + $newElements[] = $newElement; + } + } + + $this->elements = $newElements; + } + + protected function createNew(array $elements) + { + return new static($this->sortFunc, $elements); + } +} \ No newline at end of file diff --git a/vendor/phpcollection/phpcollection/tests/PhpCollection/Tests/MapTest.php b/vendor/phpcollection/phpcollection/tests/PhpCollection/Tests/MapTest.php new file mode 100644 index 0000000000..0ebe6a35a1 --- /dev/null +++ b/vendor/phpcollection/phpcollection/tests/PhpCollection/Tests/MapTest.php @@ -0,0 +1,229 @@ +assertFalse($this->map->exists(function($k) { return $k === 0; })); + + $this->map->set('foo', 'bar'); + $this->assertTrue($this->map->exists(function($k, $v) { return $k === 'foo' && $v === 'bar'; })); + } + + public function testSet() + { + $this->assertTrue($this->map->get('asdf')->isEmpty()); + $this->map->set('asdf', 'foo'); + $this->assertEquals('foo', $this->map->get('asdf')->get()); + + $this->assertEquals('bar', $this->map->get('foo')->get()); + $this->map->set('foo', 'asdf'); + $this->assertEquals('asdf', $this->map->get('foo')->get()); + } + + public function testSetSetAll() + { + $this->map->setAll(array('foo' => 'asdf', 'bar' => array('foo'))); + $this->assertEquals(array('foo' => 'asdf', 'bar' => array('foo'), 'baz' => 'boo'), iterator_to_array($this->map)); + } + + public function testAll() + { + $this->map->setAll(array('foo' => 'asdf', 'bar' => array('foo'))); + $this->assertEquals(array('foo' => 'asdf', 'bar' => array('foo'), 'baz' => 'boo'), $this->map->all()); + } + + public function testAddMap() + { + $map = new Map(); + $map->set('foo', array('bar')); + $this->map->addMap($map); + + $this->assertEquals(array('foo' => array('bar'), 'bar' => 'baz', 'baz' => 'boo'), iterator_to_array($this->map)); + } + + public function testRemove() + { + $this->assertTrue($this->map->get('foo')->isDefined()); + $this->assertEquals('bar', $this->map->remove('foo')); + $this->assertFalse($this->map->get('foo')->isDefined()); + } + + public function testClear() + { + $this->assertCount(3, $this->map); + $this->map->clear(); + $this->assertCount(0, $this->map); + } + + /** + * @expectedException InvalidArgumentException + * @expectedExceptionMessage The map has no key named "asdfasdf". + */ + public function testRemoveWithUnknownIndex() + { + $this->map->remove('asdfasdf'); + } + + public function testFirst() + { + $this->assertEquals(array('foo', 'bar'), $this->map->first()->get()); + $this->map->clear(); + $this->assertTrue($this->map->first()->isEmpty()); + } + + public function testLast() + { + $this->assertEquals(array('baz', 'boo'), $this->map->last()->get()); + $this->map->clear(); + $this->assertTrue($this->map->last()->isEmpty()); + } + + public function testContains() + { + $this->assertTrue($this->map->contains('boo')); + $this->assertFalse($this->map->contains('asdf')); + } + + public function testContainsKey() + { + $this->assertTrue($this->map->containsKey('foo')); + $this->assertFalse($this->map->containsKey('boo')); + } + + public function testIsEmpty() + { + $this->assertFalse($this->map->isEmpty()); + $this->map->clear(); + $this->assertTrue($this->map->isEmpty()); + } + + public function testFilter() + { + $map = new Map(array('a' => 'b', 'c' => 'd', 'e' => 'f')); + $newMap = $map->filter(function($v) { return $v === 'd'; }); + + $this->assertNotSame($newMap, $map); + $this->assertCount(3, $map); + $this->assertCount(1, $newMap); + $this->assertEquals(array('c' => 'd'), iterator_to_array($newMap)); + } + + public function testFilterNot() + { + $map = new Map(array('a' => 'b', 'c' => 'd', 'e' => 'f')); + $newMap = $map->filterNot(function($v) { return $v === 'd'; }); + + $this->assertNotSame($newMap, $map); + $this->assertCount(3, $map); + $this->assertCount(2, $newMap); + $this->assertEquals(array('a' => 'b', 'e' => 'f'), iterator_to_array($newMap)); + } + + public function testFoldLeftRight() + { + $map = new Map(array('a' => 'b', 'c' => 'd', 'e' => 'f')); + $rsLeft = $map->foldLeft('', function($a, $b) { return $a.$b; }); + $rsRight = $map->foldRight('', function($a, $b) { return $a.$b; }); + + $this->assertEquals('bdf', $rsLeft); + $this->assertEquals('bdf', $rsRight); + } + + public function testDropWhile() + { + $newMap = $this->map->dropWhile(function($k, $v) { return 'foo' === $k || 'baz' === $v; }); + $this->assertEquals(array('baz' => 'boo'), iterator_to_array($newMap)); + $this->assertCount(3, $this->map); + } + + public function testDrop() + { + $newMap = $this->map->drop(2); + $this->assertEquals(array('baz' => 'boo'), iterator_to_array($newMap)); + $this->assertCount(3, $this->map); + } + + /** + * @expectedException InvalidArgumentException + * @expectedExceptionMessage The number must be greater than 0, but got -4. + */ + public function testDropWithNegativeNumber() + { + $this->map->drop(-4); + } + + public function testDropRight() + { + $newMap = $this->map->dropRight(2); + $this->assertEquals(array('foo' => 'bar'), iterator_to_array($newMap)); + $this->assertCount(3, $this->map); + } + + /** + * @expectedException InvalidArgumentException + * @expectedExceptionMessage The number must be greater than 0, but got -5. + */ + public function testDropRightWithNegativeNumber() + { + $this->map->dropRight(-5); + } + + public function testTake() + { + $newMap = $this->map->take(1); + $this->assertEquals(array('foo' => 'bar'), iterator_to_array($newMap)); + $this->assertCount(3, $this->map); + } + + /** + * @expectedException InvalidArgumentException + * @expectedExceptionMessage The number must be greater than 0, but got -5. + */ + public function testTakeWithNegativeNumber() + { + $this->map->take(-5); + } + + public function testTakeWhile() + { + $newMap = $this->map->takeWhile(function($k, $v) { return 'foo' === $k || 'baz' === $v; }); + $this->assertEquals(array('foo' => 'bar', 'bar' => 'baz'), iterator_to_array($newMap)); + $this->assertCount(3, $this->map); + } + + public function testFind() + { + $foundElem = $this->map->find(function($k, $v) { return 'foo' === $k && 'bar' === $v; }); + $this->assertEquals(array('foo', 'bar'), $foundElem->get()); + + $this->assertTrue($this->map->find(function() { return false; })->isEmpty()); + } + + public function testKeys() + { + $this->assertEquals(array('foo', 'bar', 'baz'), $this->map->keys()); + } + + public function testValues() + { + $this->assertEquals(array('bar', 'baz', 'boo'), $this->map->values()); + } + + protected function setUp() + { + $this->map = new Map(); + $this->map->setAll(array( + 'foo' => 'bar', + 'bar' => 'baz', + 'baz' => 'boo', + )); + } +} diff --git a/vendor/phpcollection/phpcollection/tests/PhpCollection/Tests/SequenceTest.php b/vendor/phpcollection/phpcollection/tests/PhpCollection/Tests/SequenceTest.php new file mode 100644 index 0000000000..fc568ef0f7 --- /dev/null +++ b/vendor/phpcollection/phpcollection/tests/PhpCollection/Tests/SequenceTest.php @@ -0,0 +1,344 @@ +assertSame(0, $this->seq->get(0)); + $this->assertSame($this->a, $this->seq->get(1)); + } + + public function testIndexOf() + { + $this->assertSame(0, $this->seq->indexOf(0)); + $this->assertSame(1, $this->seq->indexOf($this->a)); + $this->assertSame(2, $this->seq->indexOf($this->b)); + $this->assertSame(-1, $this->seq->indexOf(1)); + } + + public function testReverse() + { + $seq = new Sequence(array(1, 2, 3)); + $this->assertEquals(array(1, 2, 3), $seq->all()); + $this->assertEquals(array(3, 2, 1), $seq->reverse()->all()); + } + + public function testLastIndexOf() + { + $this->assertSame(3, $this->seq->lastIndexOf(0)); + $this->assertSame(1, $this->seq->lastIndexOf($this->a)); + $this->assertSame(2, $this->seq->lastIndexOf($this->b)); + $this->assertSame(-1, $this->seq->lastIndexOf(1)); + } + + public function testFilter() + { + $seq = new Sequence(array(1, 2, 3)); + $newSeq = $seq->filter(function($n) { return $n === 2; }); + + $this->assertNotSame($newSeq, $seq); + $this->assertCount(3, $seq); + $this->assertCount(1, $newSeq); + $this->assertSame(2, $newSeq->get(0)); + } + + public function testFilterNot() + { + $seq = new Sequence(array(1, 2, 3)); + $newSeq = $seq->filterNot(function($n) { return $n === 2; }); + + $this->assertNotSame($newSeq, $seq); + $this->assertCount(3, $seq); + $this->assertCount(2, $newSeq); + $this->assertSame(1, $newSeq->get(0)); + $this->assertSame(3, $newSeq->get(1)); + } + + public function testFoldLeftRight() + { + $seq = new Sequence(array('a', 'b', 'c')); + $rsLeft = $seq->foldLeft('', function($a, $b) { return $a.$b; }); + $rsRight = $seq->foldRight('', function($a, $b) { return $a.$b; }); + + $this->assertEquals('abc', $rsLeft); + $this->assertEquals('abc', $rsRight); + } + + public function testAddSequence() + { + $seq = new Sequence(); + $seq->add(1); + $seq->add(0); + + $this->seq->addSequence($seq); + + $this->assertSame(array( + 0, + $this->a, + $this->b, + 0, + 1, + 0, + ), $this->seq->all()); + } + + public function testIsDefinedAt() + { + $this->assertTrue($this->seq->isDefinedAt(0)); + $this->assertTrue($this->seq->isDefinedAt(1)); + $this->assertFalse($this->seq->isDefinedAt(9999999)); + } + + public function testIndexWhere() + { + $this->assertSame(-1, $this->seq->indexWhere(function() { return false; })); + $this->assertSame(0, $this->seq->indexWhere(function() { return true; })); + } + + public function testLastIndexWhere() + { + $this->assertSame(-1, $this->seq->lastIndexWhere(function() { return false; })); + $this->assertSame(3, $this->seq->lastIndexWhere(function() { return true; })); + } + + public function testFirst() + { + $this->assertSame(0, $this->seq->first()->get()); + $this->assertSame(0, $this->seq->last()->get()); + } + + public function testIndices() + { + $this->assertSame(array(0, 1, 2, 3), $this->seq->indices()); + } + + public function testContains() + { + $this->assertTrue($this->seq->contains(0)); + $this->assertTrue($this->seq->contains($this->a)); + $this->assertFalse($this->seq->contains(9999)); + $this->assertFalse($this->seq->contains(new stdClass())); + } + + public function testExists() + { + $this->assertTrue($this->seq->exists(function($v) { return $v === 0; })); + + $a = $this->a; + $this->assertTrue($this->seq->exists(function($v) use ($a) { return $v === $a; })); + + $this->assertFalse($this->seq->exists(function($v) { return $v === 9999; })); + $this->assertFalse($this->seq->exists(function($v) { return $v === new \stdClass; })); + } + + public function testFind() + { + $a = $this->a; + + $this->assertSame($this->a, $this->seq->find(function($x) use ($a) { return $a === $x; })->get()); + $this->assertFalse($this->seq->find(function() { return false; })->isDefined()); + } + + public function testIsEmpty() + { + $this->assertFalse($this->seq->isEmpty()); + $seq = new Sequence(); + $this->assertTrue($seq->isEmpty()); + } + + public function testAdd() + { + $this->seq->add(1); + $this->assertSame(array(0, $this->a, $this->b, 0, 1), $this->seq->all()); + + $this->seq->sortWith(function($a, $b) { + if (is_integer($a)) { + if ( ! is_integer($b)) { + return -1; + } + + return $a > $b ? 1 : -1; + } + + if (is_integer($b)) { + return 1; + } + + return 1; + }); + + $this->assertSame(array(0, 0, 1, $this->a, $this->b), $this->seq->all()); + } + + public function testUpdate() + { + $this->assertSame(0, $this->seq->get(0)); + $this->seq->update(0, 5); + $this->assertSame(5, $this->seq->get(0)); + } + + /** + * @expectedException InvalidArgumentException + * @expectedExceptionMessage There is no element at index "99999". + */ + public function testUpdateWithNonExistentIndex() + { + $this->seq->update(99999, 0); + } + + public function testAddAll() + { + $this->seq->addAll(array(2, 1, 3)); + $this->assertSame(array(0, $this->a, $this->b, 0, 2, 1, 3), $this->seq->all()); + + $this->seq->sortWith(function($a, $b) { + if (is_integer($a)) { + if ( ! is_integer($b)) { + return -1; + } + + return $a > $b ? 1 : -1; + } + + if (is_integer($b)) { + return 1; + } + + return -1; + }); + + $this->assertSame(array(0, 0, 1, 2, 3, $this->a, $this->b), $this->seq->all()); + } + + public function testTake() + { + $this->assertSame(array(0), $this->seq->take(1)->all()); + $this->assertSame(array(0, $this->a), $this->seq->take(2)->all()); + $this->assertSame(array(0, $this->a, $this->b, 0), $this->seq->take(9999)->all()); + } + + /** + * @expectedException InvalidArgumentException + * @expectedExceptionMessage $number must be greater than 0, but got -5. + */ + public function testTakeWithNegativeNumber() + { + $this->seq->take(-5); + } + + public function testTakeWhile() + { + $this->assertSame(array(0), $this->seq->takeWhile('is_integer')->all()); + } + + public function testCount() + { + $this->assertCount(4, $this->seq); + } + + public function testTraverse() + { + $this->assertSame(array(0, $this->a, $this->b, 0), iterator_to_array($this->seq)); + } + + public function testDrop() + { + $this->assertSame(array($this->a, $this->b, 0), $this->seq->drop(1)->all()); + $this->assertSame(array($this->b, 0), $this->seq->drop(2)->all()); + $this->assertSame(array(), $this->seq->drop(9999)->all()); + } + + /** + * @expectedException InvalidArgumentException + * @expectedExceptionMessage The number must be greater than 0, but got -5. + */ + public function testDropWithNegativeIndex() + { + $this->seq->drop(-5); + } + + public function testDropRight() + { + $this->assertSame(array(0, $this->a, $this->b), $this->seq->dropRight(1)->all()); + $this->assertSame(array(0, $this->a), $this->seq->dropRight(2)->all()); + $this->assertSame(array(), $this->seq->dropRight(9999)->all()); + } + + /** + * @expectedException InvalidArgumentException + * @expectedExceptionMessage The number must be greater than 0, but got -5. + */ + public function testDropRightWithNegativeIndex() + { + $this->seq->dropRight(-5); + } + + public function testDropWhile() + { + $this->assertSame(array(0, $this->a, $this->b, 0), $this->seq->dropWhile(function() { return false; })->all()); + $this->assertSame(array(), $this->seq->dropWhile(function() { return true; })->all()); + } + + public function testRemove() + { + $this->assertSame(0, $this->seq->remove(0)); + $this->assertSame($this->a, $this->seq->remove(0)); + $this->assertSame(0, $this->seq->remove(1)); + } + + /** + * @expectedException OutOfBoundsException + * @expectedExceptionMessage The index "9999" is not in the interval [0, 4). + */ + public function testRemoveWithInvalidIndex() + { + $this->seq->remove(9999); + } + + public function testMap() + { + $seq = new Sequence(); + $seq->add('a'); + $seq->add('b'); + + $self = $this; + $newSeq = $seq->map(function($elem) use ($self) { + switch ($elem) { + case 'a': + return 'c'; + + case 'b': + return 'd'; + + default: + $self->fail('Unexpected element: ' . var_export($elem, true)); + } + }); + + $this->assertInstanceOf('PhpCollection\Sequence', $newSeq); + $this->assertNotSame($newSeq, $seq); + $this->assertEquals(array('c', 'd'), $newSeq->all()); + } + + protected function setUp() + { + $this->seq = new Sequence(); + $this->seq->addAll(array( + 0, + $this->a = new \stdClass(), + $this->b = new \stdClass(), + 0 + )); + } +} \ No newline at end of file diff --git a/vendor/phpcollection/phpcollection/tests/PhpCollection/Tests/SetTest.php b/vendor/phpcollection/phpcollection/tests/PhpCollection/Tests/SetTest.php new file mode 100644 index 0000000000..d9bd7dcdcb --- /dev/null +++ b/vendor/phpcollection/phpcollection/tests/PhpCollection/Tests/SetTest.php @@ -0,0 +1,184 @@ +set->add('a'); + + $this->assertFalse($this->set->contains('b')); + $this->assertFalse($this->set->contains(new ObjectThatImplementsBasics('foo'))); + $this->assertFalse($this->set->contains(new \DateTime('today'))); + } + + public function testContainsObjectWithHandler() + { + $this->set->add(new \DateTime('today')); + + $this->assertFalse($this->set->contains(new ObjectThatImplementsBasics('foo'))); + $this->assertFalse($this->set->contains('a')); + + $this->assertTrue($this->set->contains(new \DateTime('today'))); + } + + public function testContainsObject() + { + $this->set->add(new ObjectThatImplementsBasics('foo')); + + $this->assertFalse($this->set->contains(new ObjectThatImplementsBasics('bar'))); + $this->assertFalse($this->set->contains('a')); + $this->assertFalse($this->set->contains(new \DateTime())); + + $this->assertTrue($this->set->contains(new ObjectThatImplementsBasics('foo'))); + } + + public function testReverse() + { + $this->set->add('a'); + $this->set->add('b'); + $this->assertEquals(array('a', 'b'), $this->set->all()); + + $reversedSet = $this->set->reverse(); + $this->assertEquals(array('a', 'b'), $this->set->all()); + $this->assertEquals(array('b', 'a'), $reversedSet->all()); + } + + public function testMap() + { + $this->set->add('a'); + $this->set->add('b'); + $this->assertEquals(array('a', 'b'), $this->set->all()); + + $newSet = $this->set->map(function($char) { + if ($char === 'a') { + return 'c'; + } elseif ($char === 'b') { + return 'd'; + } + + return $char; + }); + + $this->assertEquals(array('a', 'b'), $this->set->all()); + $this->assertEquals(array('c', 'd'), $newSet->all()); + } + + public function testRemoveScalar() + { + $this->set->add('a'); + $this->assertCount(1, $this->set); + + $this->set->remove('b'); + $this->assertCount(1, $this->set); + + $this->set->remove('a'); + $this->assertCount(0, $this->set); + $this->assertTrue($this->set->isEmpty()); + } + + public function testRemoveObjectWithHandler() + { + $this->set->add(new \DateTime('today')); + $this->assertCount(1, $this->set); + + $this->set->remove(new \DateTime('-2 days')); + $this->assertCount(1, $this->set); + + $this->set->remove(new \DateTime('today')); + $this->assertCount(0, $this->set); + $this->assertTrue($this->set->isEmpty()); + } + + public function testRemoveObject() + { + $this->set->add(new ObjectThatImplementsBasics('foo')); + $this->assertCount(1, $this->set); + + $this->set->remove(new ObjectThatImplementsBasics('bar')); + $this->assertCount(1, $this->set); + + $this->set->remove(new ObjectThatImplementsBasics('foo')); + $this->assertCount(0, $this->set); + $this->assertTrue($this->set->isEmpty()); + } + + public function testAddScalar() + { + $this->set->add('a'); + $this->set->add('b'); + $this->set->add('a'); + + $this->assertEquals(array('a', 'b'), $this->set->all()); + } + + public function testAddObject() + { + $this->set->add(new ObjectThatImplementsBasics('foo')); + $this->set->add(new ObjectThatImplementsBasics('bar')); + $this->set->add(new ObjectThatImplementsBasics('foo')); + + $this->assertEquals( + array( + new ObjectThatImplementsBasics('foo'), + new ObjectThatImplementsBasics('bar') + ), + $this->set->all() + ); + } + + public function testAddObjectWithHandler() + { + $this->set->add((new \DateTime('today'))->setTimezone(new \DateTimeZone('UTC'))); + $this->set->add((new \DateTime('today'))->setTimezone(new \DateTimeZone('UTC'))); + $this->set->add((new \DateTime('today'))->setTimezone(new \DateTimeZone('US/Pacific'))); + + $this->assertEquals( + array( + (new \DateTime('today'))->setTimezone(new \DateTimeZone('UTC')), + (new \DateTime('today'))->setTimezone(new \DateTimeZone('US/Pacific')), + ), + $this->set->all() + ); + } + + protected function setUp() + { + $this->set = new Set(); + } +} + +class ObjectThatImplementsBasics implements ObjectBasics +{ + private $value; + + public function __construct($value) + { + $this->value = $value; + } + + public function hash() + { + return 'foo'; // This is not recommended in the real-world. + } + + public function equals(ObjectBasics $other) + { + if ($this === $other) { + return true; + } + if ( ! $other instanceof ObjectThatImplementsBasics) { + return false; + } + + return $this->value === $other->value; + } +} \ No newline at end of file diff --git a/vendor/phpcollection/phpcollection/tests/PhpCollection/Tests/SortedSequenceTest.php b/vendor/phpcollection/phpcollection/tests/PhpCollection/Tests/SortedSequenceTest.php new file mode 100644 index 0000000000..97886d616c --- /dev/null +++ b/vendor/phpcollection/phpcollection/tests/PhpCollection/Tests/SortedSequenceTest.php @@ -0,0 +1,62 @@ +seq->add(1); + $this->assertSame(array(0, 0, 1, $this->a, $this->b), $this->seq->all()); + + $this->seq->add(2); + $this->assertSame(array(0, 0, 1, 2, $this->a, $this->b), $this->seq->all()); + } + + public function testAddAll() + { + $this->seq->addAll(array(2, 1, 3)); + $this->assertSame(array(0, 0, 1, 2, 3, $this->a, $this->b), $this->seq->all()); + + $this->seq->addAll(array(2, 3, 1, 2)); + $this->assertSame(array(0, 0, 1, 1, 2, 2, 2, 3, 3, $this->a, $this->b), $this->seq->all()); + } + + public function testTake() + { + $seq = $this->seq->take(2); + $this->assertInstanceOf('PhpCollection\SortedSequence', $seq); + $this->assertSame(array(0, 0), $seq->all()); + } + + protected function setUp() + { + $this->seq = new SortedSequence(function($a, $b) { + if (is_integer($a)) { + if ( ! is_integer($b)) { + return -1; + } + + return $a - $b; + } + + if (is_integer($b)) { + return 1; + } + + return -1; + }); + $this->seq->addAll(array( + 0, + $this->a = new \stdClass, + $this->b = new \stdClass, + 0, + )); + } +} \ No newline at end of file diff --git a/vendor/phpcollection/phpcollection/tests/bootstrap.php b/vendor/phpcollection/phpcollection/tests/bootstrap.php new file mode 100644 index 0000000000..37d8f3fd73 --- /dev/null +++ b/vendor/phpcollection/phpcollection/tests/bootstrap.php @@ -0,0 +1,8 @@ + /dev/null + - phpenv rehash > /dev/null + - composer selfupdate --quiet + - composer install --dev --prefer-source + - vendor/bin/phpunit + - composer update --dev --prefer-source + +notifications: + irc: "irc.freenode.org#phpdocumentor" + email: + - mike.vanriel@naenius.com + - ashnazg@php.net diff --git a/vendor/phpdocumentor/fileset/LICENSE b/vendor/phpdocumentor/fileset/LICENSE new file mode 100644 index 0000000000..615e4cf23b --- /dev/null +++ b/vendor/phpdocumentor/fileset/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2010 Mike van Riel + +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. \ No newline at end of file diff --git a/vendor/phpdocumentor/fileset/README.md b/vendor/phpdocumentor/fileset/README.md new file mode 100644 index 0000000000..680705830e --- /dev/null +++ b/vendor/phpdocumentor/fileset/README.md @@ -0,0 +1,4 @@ +Fileset [![Build Status](https://secure.travis-ci.org/phpDocumentor/Fileset.png)](http://travis-ci.org/phpDocumentor/Fileset) +======= + +A fileset component that manages the collection of files using directories and filenames diff --git a/vendor/phpdocumentor/fileset/composer.json b/vendor/phpdocumentor/fileset/composer.json new file mode 100644 index 0000000000..203b2ebb17 --- /dev/null +++ b/vendor/phpdocumentor/fileset/composer.json @@ -0,0 +1,15 @@ +{ + "name": "phpdocumentor/fileset", + "description": "Fileset component for collecting a set of files given directories and file paths", + "keywords": ["phpdoc", "files", "fileset"], + "homepage": "http://www.phpdoc.org", + "license": "MIT", + "autoload": { "psr-0":{ "phpDocumentor": ["src/", "tests/unit/"] } }, + "require": { + "php": ">=5.3.3", + "symfony/finder": "~2.1" + }, + "require-dev": { + "phpunit/phpunit": "~3.7" + } +} diff --git a/vendor/phpdocumentor/fileset/composer.lock b/vendor/phpdocumentor/fileset/composer.lock new file mode 100644 index 0000000000..96fd02239d --- /dev/null +++ b/vendor/phpdocumentor/fileset/composer.lock @@ -0,0 +1,483 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file" + ], + "hash": "191f6b1a1c9063b3a1215ba4d0fbe3dc", + "packages": [ + { + "name": "symfony/finder", + "version": "v2.3.2", + "target-dir": "Symfony/Component/Finder", + "source": { + "type": "git", + "url": "https://github.com/symfony/Finder.git", + "reference": "v2.3.2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Finder/zipball/v2.3.2", + "reference": "v2.3.2", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Finder\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "http://symfony.com", + "time": "2013-07-01 12:17:23" + } + ], + "packages-dev": [ + { + "name": "phpunit/php-code-coverage", + "version": "1.2.12", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "1.2.12" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/1.2.12", + "reference": "1.2.12", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "phpunit/php-file-iterator": ">=1.3.0@stable", + "phpunit/php-text-template": ">=1.1.1@stable", + "phpunit/php-token-stream": ">=1.1.3@stable" + }, + "require-dev": { + "phpunit/phpunit": "3.7.*@dev" + }, + "suggest": { + "ext-dom": "*", + "ext-xdebug": ">=2.0.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "PHP/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.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": "2013-07-06 06:26:16" + }, + { + "name": "phpunit/php-file-iterator", + "version": "1.3.3", + "source": { + "type": "git", + "url": "git://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "1.3.3" + }, + "dist": { + "type": "zip", + "url": "https://github.com/sebastianbergmann/php-file-iterator/zipball/1.3.3", + "reference": "1.3.3", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "File/" + ] + }, + "include-path": [ + "" + ], + "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": "http://www.phpunit.de/", + "keywords": [ + "filesystem", + "iterator" + ], + "time": "2012-10-11 04:44:38" + }, + { + "name": "phpunit/php-text-template", + "version": "1.1.4", + "source": { + "type": "git", + "url": "git://github.com/sebastianbergmann/php-text-template.git", + "reference": "1.1.4" + }, + "dist": { + "type": "zip", + "url": "https://github.com/sebastianbergmann/php-text-template/zipball/1.1.4", + "reference": "1.1.4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "Text/" + ] + }, + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "time": "2012-10-31 11:15:28" + }, + { + "name": "phpunit/php-timer", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "1.0.5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1.0.5", + "reference": "1.0.5", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "PHP/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "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": "2013-08-02 07:42:54" + }, + { + "name": "phpunit/php-token-stream", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "1.2.0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/1.2.0", + "reference": "1.2.0", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "classmap": [ + "PHP/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": [ + "tokenizer" + ], + "time": "2013-08-04 05:57:48" + }, + { + "name": "phpunit/phpunit", + "version": "3.7.23", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "3.7.23" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3.7.23", + "reference": "3.7.23", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "php": ">=5.3.3", + "phpunit/php-code-coverage": "~1.2.1", + "phpunit/php-file-iterator": ">=1.3.1", + "phpunit/php-text-template": ">=1.1.1", + "phpunit/php-timer": ">=1.0.4", + "phpunit/phpunit-mock-objects": "~1.2.0", + "symfony/yaml": "~2.0" + }, + "require-dev": { + "pear-pear/pear": "1.9.4" + }, + "suggest": { + "ext-json": "*", + "ext-simplexml": "*", + "ext-tokenizer": "*", + "phpunit/php-invoker": ">=1.1.0,<1.2.0" + }, + "bin": [ + "composer/bin/phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.7.x-dev" + } + }, + "autoload": { + "classmap": [ + "PHPUnit/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "", + "../../symfony/yaml/" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "http://www.phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "time": "2013-08-02 19:14:44" + }, + { + "name": "phpunit/phpunit-mock-objects", + "version": "1.2.3", + "source": { + "type": "git", + "url": "git://github.com/sebastianbergmann/phpunit-mock-objects.git", + "reference": "1.2.3" + }, + "dist": { + "type": "zip", + "url": "https://github.com/sebastianbergmann/phpunit-mock-objects/archive/1.2.3.zip", + "reference": "1.2.3", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "phpunit/php-text-template": ">=1.1.1@stable" + }, + "suggest": { + "ext-soap": "*" + }, + "type": "library", + "autoload": { + "classmap": [ + "PHPUnit/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Mock Object library for PHPUnit", + "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", + "keywords": [ + "mock", + "xunit" + ], + "time": "2013-01-13 10:24:48" + }, + { + "name": "symfony/yaml", + "version": "v2.3.2", + "target-dir": "Symfony/Component/Yaml", + "source": { + "type": "git", + "url": "https://github.com/symfony/Yaml.git", + "reference": "v2.3.2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Yaml/zipball/v2.3.2", + "reference": "v2.3.2", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Yaml\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "http://symfony.com", + "time": "2013-07-11 19:36:36" + } + ], + "aliases": [ + + ], + "minimum-stability": "stable", + "stability-flags": [ + + ], + "platform": { + "php": ">=5.3.3" + }, + "platform-dev": [ + + ] +} diff --git a/vendor/phpdocumentor/fileset/phpunit.xml.dist b/vendor/phpdocumentor/fileset/phpunit.xml.dist new file mode 100644 index 0000000000..1e700508b5 --- /dev/null +++ b/vendor/phpdocumentor/fileset/phpunit.xml.dist @@ -0,0 +1,31 @@ + + + + + + ./tests/ + + + + + . + + build + tests + vendor + + + + + + + + + diff --git a/vendor/phpdocumentor/fileset/src/phpDocumentor/Fileset/Collection.php b/vendor/phpdocumentor/fileset/src/phpDocumentor/Fileset/Collection.php new file mode 100644 index 0000000000..9aea21270c --- /dev/null +++ b/vendor/phpdocumentor/fileset/src/phpDocumentor/Fileset/Collection.php @@ -0,0 +1,318 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Fileset; + +/** + * Files container handling directory scanning, project root detection and ignores. + * + * Always set any filtering options (extensions, ignore patterns, hidden files, symlinks) + * _before_ adding any directories or files. Such filtering is done immediately + * upon loading the directory/file. As such, setting filtering options + * _after_ adding directories/files will seem as though your filters were ignored. + * + * @author Mike van Riel + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class Collection extends \ArrayObject +{ + /** @var bool Whether to follow symlinks*/ + protected $follow_symlinks = false; + + /** @var bool Whether to ignore hidden files and folders */ + protected $ignore_hidden = false; + + /** @var Collection\IgnorePatterns */ + protected $ignore_patterns = array(); + + /** @var \ArrayObject Array containing a list of allowed line endings */ + protected $allowed_extensions = null; + + /** @var string[] An array containing file names */ + protected $files = array(); + + /** + * Initializes the finding component. + */ + public function __construct() + { + $this->ignore_patterns = new Collection\IgnorePatterns(); + $this->allowed_extensions = new \ArrayObject( + array('php', 'php3', 'phtml') + ); + } + + /** + * Sets the patterns by which to detect which files to ignore. + * + * @param array $patterns Glob-like patterns to filter files. + * + * @return void + */ + public function setIgnorePatterns(array $patterns) + { + $this->ignore_patterns = new Collection\IgnorePatterns($patterns); + } + + /** + * Returns the ignore patterns. + * + * @return Collection\IgnorePatterns + */ + public function getIgnorePatterns() + { + return $this->ignore_patterns; + } + + /** + * Sets a list of allowed extensions; if not used php, php3 and phtml + * is assumed. + * + * @param array $extensions An array containing extensions to match for. + * + * @return void + */ + public function setAllowedExtensions(array $extensions) + { + $this->allowed_extensions = new \ArrayObject($extensions); + } + + /** + * Adds a file extension to the list of allowed extensions. + * + * No dot is necessary and will even prevent the extension from being + * picked up. + * + * @param string $extension Allowed file Extension to add (i.e. php). + * + * @return void + */ + public function addAllowedExtension($extension) + { + $this->allowed_extensions->append($extension); + } + + /** + * Adds the content of a set of directories to the list of files to parse. + * + * @param array $paths The paths whose contents to add to the collection. + * + * @return void + */ + public function addDirectories(array $paths) + { + foreach ($paths as $path) { + $this->addDirectory($path); + } + } + + /** + * Retrieve all files in the given directory and add them to the parsing list. + * + * @param string $path A path to a folder, may be relative, absolute or + * even phar. + * + * @return void + */ + public function addDirectory($path) + { + $finder = new \Symfony\Component\Finder\Finder(); + + $patterns = $this->getIgnorePatterns()->getRegularExpression(); + + if ($this->follow_symlinks) { + $finder->followLinks(); + } + + // restrict names to those ending in the given extensions + $finder + ->files() + ->in($path) + ->name( + '/\.('.implode('|', $this->allowed_extensions->getArrayCopy()).')$/' + ) + ->ignoreDotFiles($this->getIgnoreHidden()) + ->filter( + function(\SplFileInfo $file) use ($patterns) { + if (!$patterns) { + return true; + } + + // apply ignore list on path instead of file, finder + // can't do that by default + return !preg_match($patterns, $file->getPathname()); + } + ); + + try { + /** @var \SplFileInfo $file */ + foreach ($finder as $file) { + $file = new File($file); + $path = $file->getRealPath() + ? $file->getRealPath() + : $file->getPathname(); + + $this[$path] = $file; + } + } catch(\LogicException $e) + { + // if a logic exception is thrown then no folders were included + // for phpDocumentor this is not an issue since we accept separate + // files as well + } + } + + /** + * Adds a list of individual files to the collection. + * + * @param array $paths File locations, may be absolute, relative or even phar. + * + * @return void + */ + public function addFiles(array $paths) + { + foreach ($paths as $path) { + $this->addFile($path); + } + } + + /** + * Adds a file to the collection. + * + * @param string $path File location, may be absolute, relative or even phar. + * + * @return void + */ + public function addFile($path) + { + $paths = $this->getGlobbedPaths($path); + foreach ($paths as $path) { + $file = new File($path); + $path = $file->getRealPath() + ? $file->getRealPath() + : $file->getPathname(); + + $this[$path] = $file; + } + } + + /** + * Get a globbed list out of the given path. + * + * This wrapper method normalizes for OS-divergent behavior of the native glob() function. + * @param string $path + * @return array + */ + protected function getGlobbedPaths($path) + { + $paths = glob($path); + + /* + * Windows glob('') returns an array with one empty member... + * 'nix glob('') returns an empty array... + * we'd prefer to have the File('') constructor throw the exception in this edge case, + * so keep the Windows behavior. + */ + $result = (array() === $paths) ? array('') : $paths; + + return $result; + } + + /** + * Returns a list of file paths that are ready to be parsed. + * + * Please note that the ignore pattern will be applied and all files are + * converted to absolute paths. + * + * @return string[] + */ + public function getFilenames() + { + return array_keys($this->getArrayCopy()); + } + + /** + * Calculates the project root from the given files by determining their + * highest common path. + * + * @return string + */ + public function getProjectRoot() + { + $base = ''; + $files = array_keys($this->getArrayCopy()); + $parts = explode(DIRECTORY_SEPARATOR, reset($files)); + + foreach ($parts as $part) { + $base_part = $base . $part . DIRECTORY_SEPARATOR; + foreach ($files as $dir) { + if (substr($dir, 0, strlen($base_part)) != $base_part) { + return $base; + } + } + + $base = $base_part; + } + + return $base; + } + + /** + * Sets whether to ignore hidden files and folders. + * + * @param boolean $ignore_hidden if true skips hidden files and folders. + * + * @return void + */ + public function setIgnoreHidden($ignore_hidden) + { + $this->ignore_hidden = $ignore_hidden; + } + + /** + * Returns whether files and folders that are hidden are ignored. + * + * @return boolean + */ + public function getIgnoreHidden() + { + return $this->ignore_hidden; + } + + /** + * Sets whether to follow symlinks. + * + * PHP version 5.2.11 is at least required since the + * RecursiveDirectoryIterator does not support the FOLLOW_SYMLINKS + * constant before that version. + * + * @param boolean $follow_symlinks + * + * @return void + */ + public function setFollowSymlinks($follow_symlinks) + { + $this->follow_symlinks = $follow_symlinks; + } + + /** + * Returns whether to follow symlinks. + * + * @return boolean + */ + public function getFollowSymlinks() + { + return $this->follow_symlinks; + } + +} diff --git a/vendor/phpdocumentor/fileset/src/phpDocumentor/Fileset/Collection/IgnorePatterns.php b/vendor/phpdocumentor/fileset/src/phpDocumentor/Fileset/Collection/IgnorePatterns.php new file mode 100644 index 0000000000..49ceb0acd4 --- /dev/null +++ b/vendor/phpdocumentor/fileset/src/phpDocumentor/Fileset/Collection/IgnorePatterns.php @@ -0,0 +1,63 @@ +count() > 0) { + $patterns = array(); + foreach ($this as $item) { + $this->convertToPregCompliant($item); + $patterns[] = $item; + } + + $pattern = '/('.implode('|', $patterns).')$/'; + } + + return $pattern; + } + + /** + * Converts $string into a string that can be used with preg_match. + * + * @param string &$string Glob-like pattern with wildcards ? and *. + * + * @author Greg Beaver + * @author mike van Riel + * + * @see PhpDocumentor/phpDocumentor/Io.php + * + * @return void + */ + protected function convertToPregCompliant(&$string) + { + $y = (DIRECTORY_SEPARATOR == '\\') ? '\\\\' : '\/'; + $string = str_replace('/', DIRECTORY_SEPARATOR, $string); + $x = strtr( + $string, + array( + '?' => '.', + '*' => '.*', + '.' => '\\.', + '\\' => '\\\\', + '/' => '\\/', + '[' => '\\[', + ']' => '\\]', + '-' => '\\-' + ) + ); + + if ((strpos($string, DIRECTORY_SEPARATOR) !== false) + && (strrpos($string, DIRECTORY_SEPARATOR) === strlen($string) - 1) + ) { + $x = "(?:.*$y$x?.*|$x.*)"; + } + + $string = $x; + } + +} diff --git a/vendor/phpdocumentor/fileset/src/phpDocumentor/Fileset/File.php b/vendor/phpdocumentor/fileset/src/phpDocumentor/Fileset/File.php new file mode 100644 index 0000000000..392a3af0ca --- /dev/null +++ b/vendor/phpdocumentor/fileset/src/phpDocumentor/Fileset/File.php @@ -0,0 +1,131 @@ +getPathname(); + } + + if (!is_string($file)) { + throw new \InvalidArgumentException( + 'Expected filename or object of type SplFileInfo but received ' + . get_class($file) + ); + } + + if (empty($file)) { + throw new \InvalidArgumentException( + 'Expected filename or object of type SplFileInfo but received nothing at all' + ); + } + + parent::__construct($file); + } + + /** + * Returns the mime type for this file. + * + * @throws \RuntimeException if finfo failed to load + * and/or mime_content_type is unavailable + * @throws \LogicException if the mime type could not be interpreted + * from the output of finfo_file + * + * @return string + */ + public function getMimeType() + { + if (function_exists('finfo_open')) { + $finfo = finfo_open(FILEINFO_MIME); + if (!$finfo) { + throw new \RuntimeException('Failed to open finfo'); + } + + $actualInfo = @finfo_file($finfo, $this->getPathname()); + if (false === $actualInfo) { + throw new \RuntimeException('Failed to read file info via finfo'); + } + $mime = strtolower($actualInfo); + finfo_close($finfo); + + if (!preg_match( + '/^([a-z0-9]+\/[a-z0-9\-\.]+);\s+charset=(.*)$/', $mime, $matches + )) { + throw new \LogicException( + 'An error parsing the MIME type "'.$mime.'".' + ); + } + + return $matches[1]; + } elseif (function_exists('mime_content_type')) { + return mime_content_type($this->getPathname()); + } + + throw new \RuntimeException( + 'The finfo extension or mime_content_type function are needed to ' + .'determine the Mime Type for this file.' + ); + } + + /** + * Returns the file contents as a string. + * + * @return string + * @throws \RuntimeException if unable to open the file + */ + public function fread() + { + try { + $file = $this->openFile('r'); + } catch (\Exception $exc) { + throw new \RuntimeException('Unable to open file', 0, $exc); + } + + $result = ''; + foreach ($file as $line) { + $result .= $line; + } + + return $result; + } + + /** + * Returns the filename, relative to the given root. + * + * @param string $root_path The root_path of which this file is composed. + * + * @throws \InvalidArgumentException if file is not in the project root. + * + * @return string + * + * @todo this protected method is unused in this class... can it be removed? + */ + protected function getFilenameRelativeToRoot($root_path) + { + // strip path from filename + $result = ltrim( + substr($this->getPathname(), strlen($root_path)), + DIRECTORY_SEPARATOR + ); + + if ($result === '') { + throw new \InvalidArgumentException( + 'File "' . $this->getPathname() . '" is not present in the ' + .'given root: ' . $root_path + ); + } + + return $result; + } + +} diff --git a/vendor/phpdocumentor/fileset/tests/common/bootstrap.php b/vendor/phpdocumentor/fileset/tests/common/bootstrap.php new file mode 100644 index 0000000000..e2bd5878d2 --- /dev/null +++ b/vendor/phpdocumentor/fileset/tests/common/bootstrap.php @@ -0,0 +1,14 @@ + + * @copyright 2010-2012 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +require_once 'PHPUnit/Extensions/OutputTestCase.php'; +require_once __DIR__.'/../../vendor/autoload.php'; \ No newline at end of file diff --git a/vendor/phpdocumentor/fileset/tests/data/fileWithText.txt b/vendor/phpdocumentor/fileset/tests/data/fileWithText.txt new file mode 100644 index 0000000000..796ce4e172 --- /dev/null +++ b/vendor/phpdocumentor/fileset/tests/data/fileWithText.txt @@ -0,0 +1,2 @@ +one line of text... +another line of text. \ No newline at end of file diff --git a/vendor/phpdocumentor/fileset/tests/data/test.phar b/vendor/phpdocumentor/fileset/tests/data/test.phar new file mode 100644 index 0000000000..78e3d3cf48 Binary files /dev/null and b/vendor/phpdocumentor/fileset/tests/data/test.phar differ diff --git a/vendor/phpdocumentor/fileset/tests/unit/phpDocumentor/Fileset/Collection/IgnorePatternsTest.php b/vendor/phpdocumentor/fileset/tests/unit/phpDocumentor/Fileset/Collection/IgnorePatternsTest.php new file mode 100644 index 0000000000..963c779374 --- /dev/null +++ b/vendor/phpdocumentor/fileset/tests/unit/phpDocumentor/Fileset/Collection/IgnorePatternsTest.php @@ -0,0 +1,120 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Fileset\Collection; + +/** + * Test case for IgnorePatterns class. + * + * @author Mike van Riel + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class IgnorePatternsTest extends \PHPUnit_Framework_TestCase +{ + /** @var IgnorePatterns */ + protected $fixture = null; + + /** @var bool */ + protected $isWindows = false; + + protected function setUp() + { + $this->fixture = new IgnorePatterns(); + if ('win' === strtolower(substr(PHP_OS, 0, 3))) { + $this->isWindows = true; + } + } + + /** @covers \phpDocumentor\Fileset\Collection\IgnorePatterns::getRegularExpression() */ + public function testGetRegularExpressionWhenGivenNoPatternsReturnsNothing() + { + $this->assertEquals('', $this->fixture->getRegularExpression()); + } + + /** @covers \phpDocumentor\Fileset\Collection\IgnorePatterns::getRegularExpression() */ + public function testGetRegularExpressionWhenGivenOnePatternsReturnsOneString() + { + $this->fixture->append('*r/'); + $expected = ($this->isWindows) + ? '/((?:.*\\\\.*r\\\?.*|.*r\\\\.*))$/' + : '/((?:.*\/.*r\/?.*|.*r\/.*))$/' + ; + $this->assertEquals($expected, $this->fixture->getRegularExpression()); + } + + /** @covers \phpDocumentor\Fileset\Collection\IgnorePatterns::convertToPregCompliant() */ + public function testtestConvertToPregCompliantForGlobbedDir() + { + $this->fixture->append('*r/'); + $expected = ($this->isWindows) + ? '/((?:.*\\\\.*r\\\?.*|.*r\\\\.*))$/' + : '/((?:.*\/.*r\/?.*|.*r\/.*))$/' + ; + $this->assertEquals($expected, $this->fixture->getRegularExpression()); + } + + /** @covers \phpDocumentor\Fileset\Collection\IgnorePatterns::convertToPregCompliant() */ + public function testConvertToPregCompliantForFilenameMask() + { + $this->fixture->append('Fileset*'); + $expected = ($this->isWindows) + ? '/(Fileset.*)$/' + : '/(Fileset.*)$/' + ; + $this->assertEquals($expected, $this->fixture->getRegularExpression()); + } + + /** @covers \phpDocumentor\Fileset\Collection\IgnorePatterns::convertToPregCompliant() */ + public function testConvertToPregCompliantForFilenameMaskDotExtension() + { + $this->fixture->append('Fileset*.php'); + $expected = ($this->isWindows) + ? '/(Fileset.*\.php)$/' + : '/(Fileset.*\.php)$/' + ; + $this->assertEquals($expected, $this->fixture->getRegularExpression()); + } + + /** @covers \phpDocumentor\Fileset\Collection\IgnorePatterns::convertToPregCompliant() */ + public function testConvertToPregCompliantForGlobbedDirAndFilenameMaskDotExtension() + { + $this->fixture->append('*r/Fileset*.php'); + $expected = ($this->isWindows) + ? '/(.*r\\\\Fileset.*\.php)$/' + : '/(.*r\/Fileset.*\.php)$/' + ; + $this->assertEquals($expected, $this->fixture->getRegularExpression()); + } + + /** @covers \phpDocumentor\Fileset\Collection\IgnorePatterns::convertToPregCompliant() */ + public function testConvertToPregCompliantForThreeStars() + { + $this->fixture->append('***'); + $expected = ($this->isWindows) + ? '/(.*.*.*)$/' + : '/(.*.*.*)$/' + ; + $this->assertEquals($expected, $this->fixture->getRegularExpression()); + } + + /** @covers \phpDocumentor\Fileset\Collection\IgnorePatterns::convertToPregCompliant() */ + public function testConvertToPregCompliantForPlainString() + { + $this->fixture->append('plainString'); + $expected = ($this->isWindows) + ? '/(plainString)$/' + : '/(plainString)$/' + ; + $this->assertEquals($expected, $this->fixture->getRegularExpression()); + } +} diff --git a/vendor/phpdocumentor/fileset/tests/unit/phpDocumentor/Fileset/CollectionTest.php b/vendor/phpdocumentor/fileset/tests/unit/phpDocumentor/Fileset/CollectionTest.php new file mode 100644 index 0000000000..afc2b01b00 --- /dev/null +++ b/vendor/phpdocumentor/fileset/tests/unit/phpDocumentor/Fileset/CollectionTest.php @@ -0,0 +1,776 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Fileset; + +use phpDocumentor\Fileset\Collection\IgnorePatterns; + +/** + * Test case for Collection class. + * + * @author Mike van Riel + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class CollectionTest extends \PHPUnit_Framework_TestCase +{ + /** @var Collection */ + protected $fixture = null; + + protected function setUp() + { + $this->fixture = new Collection(); + } + + /** + * Get the pathed name of the test suite's "data" directory. + * + * The path includes a trailing directory separator. + * @return string + */ + protected function getNameOfDataDir() + { + return + __DIR__ + . DIRECTORY_SEPARATOR . '..' + . DIRECTORY_SEPARATOR . '..' + . DIRECTORY_SEPARATOR . '..' + . DIRECTORY_SEPARATOR . 'data' + . DIRECTORY_SEPARATOR + ; + } + + /** + * Get a count of the files that exist in the test suite's "data" directory. + * @return int + */ + protected function getCountOfDataDirFiles() + { + return 2; + } + + /* __construct() ***************************************************/ + + /** @covers \phpDocumentor\Fileset\Collection::__construct() */ + public function testConstructorSucceeds() + { + $this->assertInstanceOf('\phpDocumentor\Fileset\Collection', $this->fixture); + } + + /* setIgnorePatterns() ***************************************************/ + + /** @covers \phpDocumentor\Fileset\Collection::setIgnorePatterns() */ + public function testSetIgnorePatternsAcceptsValidIgnorePattern() + { + $pattern = array('./foo/*'); + $this->fixture->setIgnorePatterns($pattern); + $this->assertInstanceOf( + '\phpDocumentor\Fileset\Collection\IgnorePatterns', + $this->fixture->getIgnorePatterns() + ); + } + + /** @covers \phpDocumentor\Fileset\Collection::setIgnorePatterns() */ + public function testSetIgnorePatternsAcceptsMultipleValidIgnorePatternsGivenAtOnce() + { + $pattern = array('./foo/*', '*/bar/*.txt'); + $this->fixture->setIgnorePatterns($pattern); + $this->assertInstanceOf( + '\phpDocumentor\Fileset\Collection\IgnorePatterns', + $this->fixture->getIgnorePatterns() + ); + } + + /** @covers \phpDocumentor\Fileset\Collection::setIgnorePatterns() */ + public function testSetIgnorePatternsAcceptsMultipleValidIgnorePatternsGivenSeparately() + { + $pattern1 = array('./foo/*'); + $pattern2 = array('*/bar/*.txt'); + $this->fixture->setIgnorePatterns($pattern1); + $this->fixture->setIgnorePatterns($pattern2); + $this->assertInstanceOf( + '\phpDocumentor\Fileset\Collection\IgnorePatterns', + $this->fixture->getIgnorePatterns() + ); + } + + /* getIgnorePatterns() ***************************************************/ + + /** @covers \phpDocumentor\Fileset\Collection::getIgnorePatterns() */ + public function testGetIgnorePatternsAcceptsValidIgnorePattern() + { + $pattern = array('./foo/*'); + $this->fixture->setIgnorePatterns($pattern); + $this->assertInstanceOf( + '\phpDocumentor\Fileset\Collection\IgnorePatterns', + $this->fixture->getIgnorePatterns() + ); + } + + /** @covers \phpDocumentor\Fileset\Collection::getIgnorePatterns() */ + public function testGetIgnorePatternsAcceptsMultipleValidIgnorePatternsGivenAtOnce() + { + $pattern = array('./foo/*', '*/bar/*.txt'); + $this->fixture->setIgnorePatterns($pattern); + $this->assertInstanceOf( + '\phpDocumentor\Fileset\Collection\IgnorePatterns', + $this->fixture->getIgnorePatterns() + ); + } + + /** @covers \phpDocumentor\Fileset\Collection::getIgnorePatterns() */ + public function testGetIgnorePatternsAcceptsMultipleValidIgnorePatternsGivenSeparately() + { + $pattern1 = array('./foo/*'); + $pattern2 = array('*/bar/*.txt'); + $this->fixture->setIgnorePatterns($pattern1); + $this->fixture->setIgnorePatterns($pattern2); + $this->assertInstanceOf( + '\phpDocumentor\Fileset\Collection\IgnorePatterns', + $this->fixture->getIgnorePatterns() + ); + } + + /* setAllowedExtensions() ***************************************************/ + + /** @covers \phpDocumentor\Fileset\Collection::setAllowedExtensions() */ + public function testSetAllowedExtensionsAcceptsEmptyArray() + { + $this->fixture->setAllowedExtensions(array()); + $this->assertTrue(true, 'Test passed'); + } + + /** @covers \phpDocumentor\Fileset\Collection::setAllowedExtensions() */ + public function testSetAllowedExtensionsAcceptsSimpleArray() + { + $this->fixture->setAllowedExtensions(array('php')); + $this->assertTrue(true, 'Test passed'); + } + + /** @covers \phpDocumentor\Fileset\Collection::setAllowedExtensions() */ + public function testSetAllowedExtensionsAcceptsAssociativeArray() + { + $this->fixture->setAllowedExtensions(array('PHP executable file' => 'php')); + $this->assertTrue(true, 'Test passed'); + } + + /** @covers \phpDocumentor\Fileset\Collection::setAllowedExtensions() */ + public function testSetAllowedExtensionsAllowsMultipleCalls() + { + $this->fixture->setAllowedExtensions(array('PHP executable file' => 'php')); + $this->fixture->setAllowedExtensions(array('PHP3 old file' => 'php3')); + $this->assertTrue(true, 'Test passed'); + } + + /* addAllowedExtension() ***************************************************/ + + /** @covers \phpDocumentor\Fileset\Collection::addAllowedExtension() */ + public function testAddAllowedExtensionAcceptsEmptyString() + { + $extension = ''; + $this->fixture->addAllowedExtension($extension); + $this->assertTrue(true, 'Test passed'); + } + + /** @covers \phpDocumentor\Fileset\Collection::addAllowedExtension() */ + public function testAddAllowedExtensionAcceptsSingleString() + { + $extension = 'php'; + $this->fixture->addAllowedExtension($extension); + $this->assertTrue(true, 'Test passed'); + } + + /** @covers \phpDocumentor\Fileset\Collection::addAllowedExtension() */ + public function testAddAllowedExtensionAllowsMultipleCalls() + { + $this->fixture->addAllowedExtension('php'); + $this->fixture->addAllowedExtension('php3'); + $this->assertTrue(true, 'Test passed'); + } + + /* addDirectories() ***************************************************/ + + /** @covers \phpDocumentor\Fileset\Collection::addDirectories() */ + public function testAddDirectoriesWhenGivenEmptyArrayDoesNothing() + { + $this->fixture->addDirectories(array()); + $this->assertTrue(true, 'Test passes'); + } + + /** @covers \phpDocumentor\Fileset\Collection::addDirectories() */ + public function testAddDirectoriesWhenGivenOnePathSucceeds() + { + $this->fixture->addDirectories(array($this->getNameOfDataDir())); + $this->assertTrue(true, 'Test passes'); + } + + /** @covers \phpDocumentor\Fileset\Collection::addDirectories() */ + public function testAddDirectoriesWhenGivenTheSamePathTwiceIsOk() + { + $this->fixture->addDirectories(array($this->getNameOfDataDir())); + $this->fixture->addDirectories(array($this->getNameOfDataDir())); + $this->assertTrue(true, 'Test passes'); + } + + /** @covers \phpDocumentor\Fileset\Collection::addDirectories() */ + public function testAddDirectoriesWhenGivenManyPathsSucceeds() + { + $this->fixture->addDirectories( + array( + $this->getNameOfDataDir(), + $this->getNameOfDataDir() . '.', + $this->getNameOfDataDir() . '..', + )); + $this->assertTrue(true, 'Test passes'); + } + + /** @covers \phpDocumentor\Fileset\Collection::addDirectories() */ + public function testAddDirectoriesWhenGivenTheSamePathTwiceDoesNotResultInDuplicatedFilenames() + { + $this->fixture->setAllowedExtensions(array('phar', 'txt')); + + $this->fixture->addDirectories(array($this->getNameOfDataDir())); + $this->fixture->addDirectories(array($this->getNameOfDataDir())); + + $files = $this->fixture->getFilenames(); + + $this->assertEquals($this->getCountOfDataDirFiles(), count($files)); + } + + /* addDirectory() ***************************************************/ + + /** @covers \phpDocumentor\Fileset\Collection::addDirectory() */ + public function testAddDirectoryCanSeePharContents() + { + // read the phar test fixture + $this->fixture->addDirectory( + 'phar://'. $this->getNameOfDataDir() . 'test.phar' + ); + + // we know which files are in there; test against it + $this->assertEquals( + array( + 'phar://' . $this->getNameOfDataDir() . 'test.phar' . DIRECTORY_SEPARATOR . 'folder' . DIRECTORY_SEPARATOR . 'test.php', + 'phar://' . $this->getNameOfDataDir() . 'test.phar' . DIRECTORY_SEPARATOR . 'test.php', + ), + $this->fixture->getFilenames() + ); + } + + /** @covers \phpDocumentor\Fileset\Collection::addDirectory() */ + public function testAddDirectoryCanSeeDirectoryContents() + { + // load the data test folder... must add non-default extensions first + $this->fixture->setAllowedExtensions(array('phar', 'txt')); + $this->fixture->addDirectory($this->getNameOfDataDir()); + $files = $this->fixture->getFilenames(); + $count = count($files); + + // do a few checks to see if it has caught some cases + $this->assertGreaterThan(0, $count); + $this->assertContains( + realpath($this->getNameOfDataDir() . 'test.phar'), + $files + ); + } + + /** @covers \phpDocumentor\Fileset\Collection::addDirectory() */ + public function testAddDirectoryWhenAllowedExtensionsHidesEverything() + { + // there are no files that match the *default* extensions + $this->fixture->addDirectory($this->getNameOfDataDir()); + $files = $this->fixture->getFilenames(); + + // this file should have been ignored + $this->assertNotContains( + realpath($this->getNameOfDataDir() . 'fileWithText.txt'), + $files + ); + + // this file should also have been ignored + $this->assertNotContains( + realpath($this->getNameOfDataDir() . 'test.phar'), + $files + ); + } + + /** @covers \phpDocumentor\Fileset\Collection::addDirectory() */ + public function testAddDirectoryWhenIgnorePatternHidesEverything() + { + // load the data test folder... must add non-default extensions first + $this->fixture->setAllowedExtensions(array('phar', 'txt')); + + $this->fixture->getIgnorePatterns()->append('(phar|txt)'); + + $this->fixture->addDirectory($this->getNameOfDataDir()); + $files = $this->fixture->getFilenames(); + + // this file should have been ignored + $this->assertNotContains( + realpath($this->getNameOfDataDir() . 'fileWithText.txt'), + $files + ); + + // this file should also have been ignored + $this->assertNotContains( + realpath($this->getNameOfDataDir() . 'test.phar'), + $files + ); + } + + /** @covers \phpDocumentor\Fileset\Collection::addDirectory() */ + public function testAddDirectoryWhenIgnorePatternHidesSomething() + { + // load the data test folder... must add non-default extensions first + $this->fixture->setAllowedExtensions(array('phar', 'txt')); + + $this->fixture->getIgnorePatterns()->append('(phar)'); + + $this->fixture->addDirectory($this->getNameOfDataDir()); + $files = $this->fixture->getFilenames(); + + // this file should have been seen + $this->assertContains( + realpath($this->getNameOfDataDir() . 'fileWithText.txt'), + $files + ); + + // this file should have been ignored + $this->assertNotContains( + realpath($this->getNameOfDataDir() . 'test.phar'), + $files + ); + } + + /** @covers \phpDocumentor\Fileset\Collection::addDirectory() */ + public function testAddDirectoryWhenFollowSymlinksIsSet() + { + /* + * NOTE: + * this test does not verify that any symlinks were followed... + * it simply exercises the $finder->followLinks() line. + */ + $this->fixture->setFollowSymlinks(true); + + // load the data test folder... must add non-default extensions first + $this->fixture->setAllowedExtensions(array('phar', 'txt')); + + $this->fixture->getIgnorePatterns()->append('(phar)'); + + $this->fixture->addDirectory($this->getNameOfDataDir()); + $files = $this->fixture->getFilenames(); + + // this file should have been seen + $this->assertContains( + realpath($this->getNameOfDataDir() . 'fileWithText.txt'), + $files + ); + + // this file should have been ignored + $this->assertNotContains( + realpath($this->getNameOfDataDir() . 'test.phar'), + $files + ); + } + + /* addFiles() ***************************************************/ + + /** @covers \phpDocumentor\Fileset\Collection::addFiles() */ + public function testAddFilesWhenGivenEmptyArrayDoesNothing() + { + $this->fixture->addFiles(array()); + $this->assertTrue(true, 'Test passes'); + } + + /** @covers \phpDocumentor\Fileset\Collection::addFiles() */ + public function testAddFilesWhenGivenOnePathSucceeds() + { + $this->fixture->addFiles(array($this->getNameOfDataDir() . 'test.phar')); + $this->assertTrue(true, 'Test passes'); + } + + /** @covers \phpDocumentor\Fileset\Collection::addFiles() */ + public function testAddFilesWhenGivenTheSamePathTwiceIsOk() + { + $this->fixture->addFiles(array($this->getNameOfDataDir() . 'test.phar')); + $this->fixture->addFiles(array($this->getNameOfDataDir() . 'test.phar')); + $this->assertTrue(true, 'Test passes'); + } + + /** @covers \phpDocumentor\Fileset\Collection::addFiles() */ + public function testAddFilesWhenGivenManyPathsSucceeds() + { + $this->fixture->addFiles( + array( + $this->getNameOfDataDir() . 'test.phar', + $this->getNameOfDataDir() . 'fileWithText.txt', + )); + $this->assertTrue(true, 'Test passes'); + } + + /** @covers \phpDocumentor\Fileset\Collection::addFiles() */ + public function testAddFilesWhenGivenTheSamePathTwiceDoesNotResultInDuplicatedFilenames() + { + $this->fixture->setAllowedExtensions(array('phar', 'txt')); + + $this->fixture->addFiles(array($this->getNameOfDataDir() . 'test.phar')); + $this->fixture->addFiles(array($this->getNameOfDataDir() . 'test.phar')); + + $files = $this->fixture->getFilenames(); + + $this->assertEquals(1, count($files)); + } + + /* addFile() ***************************************************/ + + /** @covers \phpDocumentor\Fileset\Collection::addFile() */ + public function testAddFileWhenGivenEmptyStringThrowsException() + { + $this->setExpectedException( + '\InvalidArgumentException', + 'Expected filename or object of type SplFileInfo but received nothing at all' + ); + $this->fixture->addFile(''); + } + + /** @covers \phpDocumentor\Fileset\Collection::addFile() */ + public function testAddFileWhenGivenOnePathSucceeds() + { + $this->fixture->addFile($this->getNameOfDataDir() . 'test.phar'); + $this->assertTrue(true, 'Test passes'); + } + + /** @covers \phpDocumentor\Fileset\Collection::addFile() */ + public function testAddFileWhenGivenTheSamePathTwiceIsOk() + { + $this->fixture->addFile($this->getNameOfDataDir() . 'test.phar'); + $this->fixture->addFile($this->getNameOfDataDir() . 'test.phar'); + $this->assertTrue(true, 'Test passes'); + } + + /** @covers \phpDocumentor\Fileset\Collection::addFile() */ + public function testAddFileWhenGivenTheSamePathTwiceDoesNotResultInDuplicatedFilenames() + { + $this->fixture->setAllowedExtensions(array('phar', 'txt')); + + $this->fixture->addFile($this->getNameOfDataDir() . 'test.phar'); + $this->fixture->addFile($this->getNameOfDataDir() . 'test.phar'); + + $files = $this->fixture->getFilenames(); + + $this->assertEquals(1, count($files)); + } + + /* getGlobbedPaths() ***************************************************/ + + /** @covers \phpDocumentor\Fileset\Collection::getGlobbedPaths() */ + public function testGetGlobbedPathsWhenGivenEmptyStringThrowsException() + { + $this->setExpectedException( + '\InvalidArgumentException', + 'Expected filename or object of type SplFileInfo but received nothing at all' + ); + $this->fixture->addFile(''); + } + + /** @covers \phpDocumentor\Fileset\Collection::getGlobbedPaths() */ + public function testGetGlobbedPathsWhenGivenOnePathSucceeds() + { + $this->fixture->addFile($this->getNameOfDataDir() . 'test.phar'); + $this->assertTrue(true, 'Test passes'); + } + + /** @covers \phpDocumentor\Fileset\Collection::getGlobbedPaths() */ + public function testGetGlobbedPathsWhenGivenTheSamePathTwiceIsOk() + { + $this->fixture->addFile($this->getNameOfDataDir() . 'test.phar'); + $this->fixture->addFile($this->getNameOfDataDir() . 'test.phar'); + $this->assertTrue(true, 'Test passes'); + } + + /** @covers \phpDocumentor\Fileset\Collection::getGlobbedPaths() */ + public function testGetGlobbedPathsWhenGivenTheSamePathTwiceDoesNotResultInDuplicatedFilenames() + { + $this->fixture->setAllowedExtensions(array('phar', 'txt')); + + $this->fixture->addFile($this->getNameOfDataDir() . 'test.phar'); + $this->fixture->addFile($this->getNameOfDataDir() . 'test.phar'); + + $files = $this->fixture->getFilenames(); + + $this->assertEquals(1, count($files)); + } + + /* getFilenames() ***************************************************/ + + /** @covers \phpDocumentor\Fileset\Collection::getFilenames() */ + public function testGetFilenamesCanSeePharContents() + { + // read the phar test fixture + $this->fixture->addDirectory( + 'phar://'. $this->getNameOfDataDir() . 'test.phar' + ); + + // we know which files are in there; test against it + $this->assertEquals( + array( + 'phar://' . $this->getNameOfDataDir() . 'test.phar' . DIRECTORY_SEPARATOR . 'folder' . DIRECTORY_SEPARATOR . 'test.php', + 'phar://' . $this->getNameOfDataDir() . 'test.phar' . DIRECTORY_SEPARATOR . 'test.php', + ), + $this->fixture->getFilenames() + ); + } + + /** @covers \phpDocumentor\Fileset\Collection::getFilenames() */ + public function testGetFilenamesCanSeeDirectoryContents() + { + // load the data test folder... must add non-default extensions first + $this->fixture->setAllowedExtensions(array('phar', 'txt')); + $this->fixture->addDirectory($this->getNameOfDataDir()); + $files = $this->fixture->getFilenames(); + $count = count($files); + + // do a few checks to see if it has caught some cases + $this->assertGreaterThan(0, $count); + $this->assertContains( + realpath($this->getNameOfDataDir() . 'test.phar'), + $files + ); + } + + /** @covers \phpDocumentor\Fileset\Collection::getFilenames() */ + public function testGetFilenamesWhenIgnorePatternHidesEverything() + { + // load the data test folder... must add non-default extensions first + $this->fixture->setAllowedExtensions(array('phar', 'txt')); + + $this->fixture->getIgnorePatterns()->append('(phar|txt)'); + + $this->fixture->addDirectory($this->getNameOfDataDir()); + $files = $this->fixture->getFilenames(); + + // this file should have been ignored + $this->assertNotContains( + realpath($this->getNameOfDataDir() . 'fileWithText.txt'), + $files + ); + + // this file should also have been ignored + $this->assertNotContains( + realpath($this->getNameOfDataDir() . 'test.phar'), + $files + ); + } + + /** @covers \phpDocumentor\Fileset\Collection::getFilenames() */ + public function testGetFilenamesWhenIgnorePatternHidesSomething() + { + // load the data test folder... must add non-default extensions first + $this->fixture->setAllowedExtensions(array('phar', 'txt')); + + $this->fixture->getIgnorePatterns()->append('(phar)'); + + $this->fixture->addDirectory($this->getNameOfDataDir()); + $files = $this->fixture->getFilenames(); + + // this file should have been seen + $this->assertContains( + realpath($this->getNameOfDataDir() . 'fileWithText.txt'), + $files + ); + + // this file should have been ignored + $this->assertNotContains( + realpath($this->getNameOfDataDir() . 'test.phar'), + $files + ); + } + + + /* getProjectRoot() ***************************************************/ + + /** @covers \phpDocumentor\Fileset\Collection::getProjectRoot() */ + public function testGetProjectRootWhenNothingHasYetBeenAddedReturnsRootSlash() + { + $this->assertEquals(DIRECTORY_SEPARATOR, $this->fixture->getProjectRoot()); + } + + /** @covers \phpDocumentor\Fileset\Collection::getProjectRoot() */ + public function testGetProjectRootWhenOneDatafileWasAddedReturnsDataFolder() + { + $this->fixture->setAllowedExtensions(array('phar', 'txt')); + $this->fixture->addFile($this->getNameOfDataDir() . 'test.phar'); + + // realpath() steals our trailing directory separator + $expected = realpath($this->getNameOfDataDir()) . DIRECTORY_SEPARATOR; + $this->assertEquals($expected, $this->fixture->getProjectRoot()); + } + + /** @covers \phpDocumentor\Fileset\Collection::getProjectRoot() */ + public function testGetProjectRootWhenTwoDatafilesWereAddedReturnsDataFolder() + { + $this->fixture->setAllowedExtensions(array('phar', 'txt')); + $this->fixture->addFile($this->getNameOfDataDir() . 'test.phar'); + $this->fixture->addFile($this->getNameOfDataDir() . 'fileWithText.txt'); + + // realpath() steals our trailing directory separator + $expected = realpath($this->getNameOfDataDir()) . DIRECTORY_SEPARATOR; + $this->assertEquals($expected, $this->fixture->getProjectRoot()); + } + + /** @covers \phpDocumentor\Fileset\Collection::getProjectRoot() */ + public function testGetProjectRootWhenTwoFilesAreApart() + { + $this->fixture->addFile(__FILE__); + $this->fixture->addFile($this->getNameOfDataDir() . 'fileWithText.txt'); + + // realpath() steals our trailing directory separator + $expected = + realpath( + $this->getNameOfDataDir() + . '..' + ) + . DIRECTORY_SEPARATOR + ; + $this->assertEquals($expected, $this->fixture->getProjectRoot()); + } + + /** @covers \phpDocumentor\Fileset\Collection::getProjectRoot() */ + public function testGetProjectRootWhenTwoFilesAreVeryFarApart() + { + $this->fixture->addFile(__FILE__); + $this->fixture->addFile( + $this->getNameOfDataDir() + . '..' . DIRECTORY_SEPARATOR + . '..' . DIRECTORY_SEPARATOR + . 'src' . DIRECTORY_SEPARATOR + . 'phpDocumentor' . DIRECTORY_SEPARATOR + . 'Fileset' . DIRECTORY_SEPARATOR + . 'Collection.php' + ); + + // realpath() steals our trailing directory separator + $expected = + realpath( + $this->getNameOfDataDir() + . '..' . DIRECTORY_SEPARATOR + . '..' . DIRECTORY_SEPARATOR + ) + . DIRECTORY_SEPARATOR + ; + $this->assertEquals($expected, $this->fixture->getProjectRoot()); + } + + /* setIgnoreHidden() ***************************************************/ + + /** @covers \phpDocumentor\Fileset\Collection::setIgnoreHidden() */ + public function testSetIgnoreHiddenGivenFalse() + { + /* + * NOTE: + * this does not verify that hidden files were ignored... + * it simply exercises the setIgnoreHidden() method. + */ + $this->fixture->setIgnoreHidden(false); + $this->assertFalse($this->fixture->getIgnoreHidden()); + } + + /** @covers \phpDocumentor\Fileset\Collection::setIgnoreHidden() */ + public function testSetIgnoreHiddenGivenTrue() + { + /* + * NOTE: + * this does not verify that hidden files were not ignored... + * it simply exercises the setIgnoreHidden() method. + */ + $this->fixture->setIgnoreHidden(true); + $this->assertTrue($this->fixture->getIgnoreHidden()); + } + + /* getIgnoreHidden() ***************************************************/ + + /** @covers \phpDocumentor\Fileset\Collection::getIgnoreHidden() */ + public function testGetIgnoreHiddenGivenFalse() + { + /* + * NOTE: + * this does not verify that hidden files were ignored... + * it simply exercises the getIgnoreHidden() method. + */ + $this->fixture->setIgnoreHidden(false); + $this->assertFalse($this->fixture->getIgnoreHidden()); + } + + /** @covers \phpDocumentor\Fileset\Collection::getIgnoreHidden() */ + public function testGetIgnoreHiddenGivenTrue() + { + /* + * NOTE: + * this does not verify that hidden files were not ignored... + * it simply exercises the getIgnoreHidden() method. + */ + $this->fixture->setIgnoreHidden(true); + $this->assertTrue($this->fixture->getIgnoreHidden()); + } + + /* setFollowSymlinks() ***************************************************/ + + /** @covers \phpDocumentor\Fileset\Collection::setFollowSymlinks() */ + public function testSetFollowSymlinksGivenFalse() + { + /* + * NOTE: + * this does not verify that symlinks were not followed... + * it simply exercises the setFollowSymlinks() method. + */ + $this->fixture->setFollowSymlinks(false); + $this->assertFalse($this->fixture->getFollowSymlinks()); + } + + /** @covers \phpDocumentor\Fileset\Collection::setFollowSymlinks() */ + public function testSetFollowSymlinksGivenTrue() + { + /* + * NOTE: + * this does not verify that symlinks were followed... + * it simply exercises the setFollowSymlinks() method. + */ + $this->fixture->setFollowSymlinks(true); + $this->assertTrue($this->fixture->getFollowSymlinks()); + } + + /* getFollowSymlinks() ***************************************************/ + + /** @covers \phpDocumentor\Fileset\Collection::getFollowSymlinks() */ + public function testGetFollowSymlinksGivenFalse() + { + /* + * NOTE: + * this does not verify that symlinks were not followed... + * it simply exercises the getFollowSymlinks() method. + */ + $this->fixture->setFollowSymlinks(false); + $this->assertFalse($this->fixture->getFollowSymlinks()); + } + + /** @covers \phpDocumentor\Fileset\Collection::getFollowSymlinks() */ + public function testGetFollowSymlinksGivenTrue() + { + /* + * NOTE: + * this does not verify that symlinks were followed... + * it simply exercises the getFollowSymlinks() method. + */ + $this->fixture->setFollowSymlinks(true); + $this->assertTrue($this->fixture->getFollowSymlinks()); + } +} diff --git a/vendor/phpdocumentor/fileset/tests/unit/phpDocumentor/Fileset/FileTest.php b/vendor/phpdocumentor/fileset/tests/unit/phpDocumentor/Fileset/FileTest.php new file mode 100644 index 0000000000..d1f2f35918 --- /dev/null +++ b/vendor/phpdocumentor/fileset/tests/unit/phpDocumentor/Fileset/FileTest.php @@ -0,0 +1,145 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Fileset; + +/** + * Test case for File class. + * + * @author Mike van Riel + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class FileTest extends \PHPUnit_Framework_TestCase +{ + /** + * Get the pathed name of the test suite's "data" directory. + * + * The path includes a trailing directory separator. + * @return string + */ + protected function getNameOfDataDir() + { + return + __DIR__ + . DIRECTORY_SEPARATOR . '..' + . DIRECTORY_SEPARATOR . '..' + . DIRECTORY_SEPARATOR . '..' + . DIRECTORY_SEPARATOR . 'data' + . DIRECTORY_SEPARATOR + ; + } + + /* __construct() ******************************/ + + /** @covers \phpDocumentor\Fileset\File::__construct() */ + public function testConstructorWithEmptyArgThrowsException() + { + $this->setExpectedException( + '\InvalidArgumentException', + 'Expected filename or object of type SplFileInfo but received nothing at all' + ); + $file = new File(''); + } + + /** @covers \phpDocumentor\Fileset\File::__construct() */ + public function testConstructorWithUnusableObjectThrowsException() + { + $this->setExpectedException( + '\InvalidArgumentException', + 'Expected filename or object of type SplFileInfo but received stdClass' + ); + $file = new File(new \stdClass()); + } + + /** @covers \phpDocumentor\Fileset\File::__construct() */ + public function testConstructorWithEmptySplFileInfoObjectThrowsException() + { + $this->setExpectedException( + '\InvalidArgumentException', + 'Expected filename or object of type SplFileInfo but received nothing at all' + ); + $file = new File(new \SplFileInfo('')); + } + + /** @covers \phpDocumentor\Fileset\File::__construct() */ + public function testConstructorWithValidSplFileInfoObjectSucceeds() + { + $file = new File(new \SplFileInfo('foo.txt')); + $this->assertInstanceOf('\phpDocumentor\Fileset\File', $file); + } + + /* getMimeType() ******************************/ + + /** @covers \phpDocumentor\Fileset\File::getMimeType() */ + public function testGetMimeTypeWhenFileinfoNotLoadedThrowsException() + { + if (true === extension_loaded('fileinfo')) { + $this->markTestSkipped('Does not apply if fileinfo is loaded.'); + } + $file = new File(new \SplFileInfo('foo.txt')); + $this->setExpectedException( + '\RuntimeException', + 'The finfo extension or mime_content_type function are needed to determine the Mime Type for this file.' + ); + $file->getMimeType(); + } + + /** @covers \phpDocumentor\Fileset\File::getMimeType() */ + public function testGetMimeTypeWithEmptySplFileInfoObjectThrowsException() + { + if (false === extension_loaded('fileinfo')) { + $this->markTestSkipped('Does not apply if fileinfo is not loaded.'); + } + $file = new File(new \SplFileInfo('foo.txt')); + $this->setExpectedException( + '\RuntimeException', + 'Failed to read file info via finfo' + ); + $file->getMimeType(); + } + + /** @covers \phpDocumentor\Fileset\File::getMimeType() */ + public function testGetMimeTypeWithValidSplFileInfoObjectOfTestTextFile() + { + if (false === extension_loaded('fileinfo')) { + $this->markTestSkipped('Does not apply if fileinfo is not loaded.'); + } + $file = new File(new \SplFileInfo($this->getNameOfDataDir() . 'fileWithText.txt')); + $this->assertEquals('text/plain', $file->getMimeType()); + } + + /* fread() ******************************/ + + /** @covers \phpDocumentor\Fileset\File::fread() */ + public function testFreadWithEmptySplFileInfoObjectThrowsException() + { + $file = new File(new \SplFileInfo('foo.txt')); + $this->setExpectedException( + '\RuntimeException', + 'Unable to open file' + ); + $file->fread(); + } + + /** @covers \phpDocumentor\Fileset\File::fread() */ + public function testFreadWithValidSplFileInfoObjectOfTestTextFile() + { + $file = new File(new \SplFileInfo($this->getNameOfDataDir() . 'fileWithText.txt')); + $expected = <<fread(); + $this->assertEquals($expected, $actual); + } +} diff --git a/vendor/phpdocumentor/graphviz/.gitignore b/vendor/phpdocumentor/graphviz/.gitignore new file mode 100644 index 0000000000..7400b399b7 --- /dev/null +++ b/vendor/phpdocumentor/graphviz/.gitignore @@ -0,0 +1,3 @@ +.idea +build +vendor diff --git a/vendor/phpdocumentor/graphviz/.travis.yml b/vendor/phpdocumentor/graphviz/.travis.yml new file mode 100644 index 0000000000..04c76bef75 --- /dev/null +++ b/vendor/phpdocumentor/graphviz/.travis.yml @@ -0,0 +1,32 @@ +language: php +php: + - 5.3.3 + - 5.3 + - 5.4 + - 5.5 + - 5.6 + - hhvm + - hhvm-nightly + +matrix: + allow_failures: + - php: hhvm + - php: hhvm-nightly + +script: + - vendor/bin/phpunit + +before_script: + - sudo apt-get -qq update > /dev/null + - sudo apt-get -qq install graphviz > /dev/null + - phpenv rehash > /dev/null + - composer selfupdate --quiet + - composer install --no-interaction --prefer-source --dev + - vendor/bin/phpunit + - composer update --no-interaction --prefer-source --dev + +notifications: + irc: "irc.freenode.org#phpdocumentor" + email: + - mike.vanriel@naenius.com + - ashnazg@php.net diff --git a/vendor/phpdocumentor/graphviz/LICENSE b/vendor/phpdocumentor/graphviz/LICENSE new file mode 100644 index 0000000000..7219173aab --- /dev/null +++ b/vendor/phpdocumentor/graphviz/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013 Mike van Riel + +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/phpdocumentor/graphviz/README.md b/vendor/phpdocumentor/graphviz/README.md new file mode 100644 index 0000000000..90c1e68647 --- /dev/null +++ b/vendor/phpdocumentor/graphviz/README.md @@ -0,0 +1,5 @@ +GraphViz [![Build Status](https://secure.travis-ci.org/phpDocumentor/GraphViz.png)](http://travis-ci.org/phpDocumentor/GraphViz) +======== + +GraphViz is a library meant for generating .dot files for GraphViz with a +fluent interface. diff --git a/vendor/phpdocumentor/graphviz/composer.json b/vendor/phpdocumentor/graphviz/composer.json new file mode 100644 index 0000000000..58a7c39372 --- /dev/null +++ b/vendor/phpdocumentor/graphviz/composer.json @@ -0,0 +1,17 @@ +{ + "name": "phpdocumentor/graphviz", + "type": "library", + "license": "MIT", + "authors": [ + {"name": "Mike van Riel", "email": "mike.vanriel@naenius.com"} + ], + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "autoload": { + "psr-0": {"phpDocumentor": ["src/", "tests/unit"]} + } +} diff --git a/vendor/phpdocumentor/graphviz/composer.lock b/vendor/phpdocumentor/graphviz/composer.lock new file mode 100644 index 0000000000..60b34ed817 --- /dev/null +++ b/vendor/phpdocumentor/graphviz/composer.lock @@ -0,0 +1,826 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "hash": "f191db97ba1be12289fa226f9b0a205e", + "packages": [], + "packages-dev": [ + { + "name": "ocramius/instantiator", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/Ocramius/Instantiator.git", + "reference": "e24a12178906ff2e7471b8aaf3a0eb789b59f881" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Ocramius/Instantiator/zipball/e24a12178906ff2e7471b8aaf3a0eb789b59f881", + "reference": "e24a12178906ff2e7471b8aaf3a0eb789b59f881", + "shasum": "" + }, + "require": { + "ocramius/lazy-map": "1.0.*", + "php": "~5.3" + }, + "require-dev": { + "athletic/athletic": "~0.1.8", + "ext-pdo": "*", + "ext-phar": "*", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "2.0.*@ALPHA" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Instantiator\\": "src" + } + }, + "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/Ocramius/Instantiator", + "keywords": [ + "constructor", + "instantiate" + ], + "time": "2014-08-25 14:48:16" + }, + { + "name": "ocramius/lazy-map", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/Ocramius/LazyMap.git", + "reference": "7fe3d347f5e618bcea7d39345ff83f3651d8b752" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Ocramius/LazyMap/zipball/7fe3d347f5e618bcea7d39345ff83f3651d8b752", + "reference": "7fe3d347f5e618bcea7d39345ff83f3651d8b752", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "athletic/athletic": "~0.1.6", + "phpmd/phpmd": "1.5.*", + "phpunit/phpunit": ">=3.7", + "satooshi/php-coveralls": "~0.6", + "squizlabs/php_codesniffer": "1.4.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "LazyMap\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/", + "role": "Developer" + } + ], + "description": "A library that provides lazy instantiation logic for a map of objects", + "homepage": "https://github.com/Ocramius/LazyMap", + "keywords": [ + "lazy", + "lazy instantiation", + "lazy loading", + "map", + "service location" + ], + "time": "2013-11-09 22:30:54" + }, + { + "name": "phpunit/php-code-coverage", + "version": "2.0.11", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "53603b3c995f5aab6b59c8e08c3a663d2cc810b7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/53603b3c995f5aab6b59c8e08c3a663d2cc810b7", + "reference": "53603b3c995f5aab6b59c8e08c3a663d2cc810b7", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "phpunit/php-file-iterator": "~1.3", + "phpunit/php-text-template": "~1.2", + "phpunit/php-token-stream": "~1.3", + "sebastian/environment": "~1.0", + "sebastian/version": "~1.0" + }, + "require-dev": { + "ext-xdebug": ">=2.1.4", + "phpunit/phpunit": "~4.1" + }, + "suggest": { + "ext-dom": "*", + "ext-xdebug": ">=2.2.1", + "ext-xmlwriter": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.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": "2014-08-31 06:33:04" + }, + { + "name": "phpunit/php-file-iterator", + "version": "1.3.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/acd690379117b042d1c8af1fafd61bde001bf6bb", + "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "File/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "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": "2013-10-10 15:34:57" + }, + { + "name": "phpunit/php-text-template", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/206dfefc0ffe9cebf65c413e3d0e809c82fbf00a", + "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "Text/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "time": "2014-01-30 17:20:04" + }, + { + "name": "phpunit/php-timer", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/19689d4354b295ee3d8c54b4f42c3efb69cbc17c", + "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "PHP/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "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": "2013-08-02 07:42:54" + }, + { + "name": "phpunit/php-token-stream", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "f8d5d08c56de5cfd592b3340424a81733259a876" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/f8d5d08c56de5cfd592b3340424a81733259a876", + "reference": "f8d5d08c56de5cfd592b3340424a81733259a876", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-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": "2014-08-31 06:12:13" + }, + { + "name": "phpunit/phpunit", + "version": "4.2.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "f0c2d374ad06ec1e56c721f4ed87c59ff35f440e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f0c2d374ad06ec1e56c721f4ed87c59ff35f440e", + "reference": "f0c2d374ad06ec1e56c721f4ed87c59ff35f440e", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "php": ">=5.3.3", + "phpunit/php-code-coverage": "~2.0", + "phpunit/php-file-iterator": "~1.3.1", + "phpunit/php-text-template": "~1.2", + "phpunit/php-timer": "~1.0.2", + "phpunit/phpunit-mock-objects": "~2.2", + "sebastian/comparator": "~1.0", + "sebastian/diff": "~1.1", + "sebastian/environment": "~1.0", + "sebastian/exporter": "~1.0", + "sebastian/version": "~1.0", + "symfony/yaml": "~2.0" + }, + "suggest": { + "phpunit/php-invoker": "~1.1" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "", + "../../symfony/yaml/" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "http://www.phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "time": "2014-08-31 06:46:49" + }, + { + "name": "phpunit/phpunit-mock-objects", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", + "reference": "42e589e08bc86e3e9bdf20d385e948347788505b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/42e589e08bc86e3e9bdf20d385e948347788505b", + "reference": "42e589e08bc86e3e9bdf20d385e948347788505b", + "shasum": "" + }, + "require": { + "ocramius/instantiator": "~1.0", + "php": ">=5.3.3", + "phpunit/php-text-template": "~1.2" + }, + "require-dev": { + "phpunit/phpunit": "4.2.*@dev" + }, + "suggest": { + "ext-soap": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Mock Object library for PHPUnit", + "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", + "keywords": [ + "mock", + "xunit" + ], + "time": "2014-08-02 13:50:58" + }, + { + "name": "sebastian/comparator", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "f7069ee51fa9fb6c038e16a9d0e3439f5449dcf2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/f7069ee51fa9fb6c038e16a9d0e3439f5449dcf2", + "reference": "f7069ee51fa9fb6c038e16a9d0e3439f5449dcf2", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/diff": "~1.1", + "sebastian/exporter": "~1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.1" + }, + "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", + "role": "lead" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "http://www.github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "time": "2014-05-02 07:05:58" + }, + { + "name": "sebastian/diff", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "1e091702a5a38e6b4c1ba9ca816e3dd343df2e2d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/1e091702a5a38e6b4c1ba9ca816e3dd343df2e2d", + "reference": "1e091702a5a38e6b4c1ba9ca816e3dd343df2e2d", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "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", + "role": "lead" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "http://www.github.com/sebastianbergmann/diff", + "keywords": [ + "diff" + ], + "time": "2013-08-03 16:46:33" + }, + { + "name": "sebastian/environment", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "79517609ec01139cd7e9fded0dd7ce08c952ef6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/79517609ec01139cd7e9fded0dd7ce08c952ef6a", + "reference": "79517609ec01139cd7e9fded0dd7ce08c952ef6a", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "4.0.*@dev" + }, + "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", + "role": "lead" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "time": "2014-02-18 16:17:19" + }, + { + "name": "sebastian/exporter", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "1f9a98e6f5dfe0524cb8c6166f7c82f3e9ae1529" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/1f9a98e6f5dfe0524cb8c6166f7c82f3e9ae1529", + "reference": "1f9a98e6f5dfe0524cb8c6166f7c82f3e9ae1529", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "4.0.*@dev" + }, + "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", + "role": "lead" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net", + "role": "Lead" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "time": "2014-02-16 08:26:31" + }, + { + "name": "sebastian/version", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "b6e1f0cf6b9e1ec409a0d3e2f2a5fb0998e36b43" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/b6e1f0cf6b9e1ec409a0d3e2f2a5fb0998e36b43", + "reference": "b6e1f0cf6b9e1ec409a0d3e2f2a5fb0998e36b43", + "shasum": "" + }, + "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": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "time": "2014-03-07 15:35:33" + }, + { + "name": "symfony/yaml", + "version": "v2.5.3", + "target-dir": "Symfony/Component/Yaml", + "source": { + "type": "git", + "url": "https://github.com/symfony/Yaml.git", + "reference": "5a75366ae9ca8b4792cd0083e4ca4dff9fe96f1f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Yaml/zipball/5a75366ae9ca8b4792cd0083e4ca4dff9fe96f1f", + "reference": "5a75366ae9ca8b4792cd0083e4ca4dff9fe96f1f", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Yaml\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Symfony Yaml Component", + "homepage": "http://symfony.com", + "time": "2014-08-05 09:00:40" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "platform": { + "php": ">=5.3.3" + }, + "platform-dev": [] +} diff --git a/vendor/phpdocumentor/graphviz/phpunit.xml.dist b/vendor/phpdocumentor/graphviz/phpunit.xml.dist new file mode 100644 index 0000000000..60172a39f7 --- /dev/null +++ b/vendor/phpdocumentor/graphviz/phpunit.xml.dist @@ -0,0 +1,30 @@ + + + + + + ./tests/ + + + + + + + + + ./src/ + + + diff --git a/vendor/phpdocumentor/graphviz/src/phpDocumentor/GraphViz/Attribute.php b/vendor/phpdocumentor/graphviz/src/phpDocumentor/GraphViz/Attribute.php new file mode 100644 index 0000000000..797fb827f0 --- /dev/null +++ b/vendor/phpdocumentor/graphviz/src/phpDocumentor/GraphViz/Attribute.php @@ -0,0 +1,144 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\GraphViz; + +/** + * Class representing a single GraphViz attribute. + * + * @author Mike van Riel + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class Attribute +{ + /** @var string The name of this attribute */ + protected $key = ''; + + /** @var string The value of this attribute*/ + protected $value = ''; + + /** + * Creating a new attribute. + * + * @param string $key Id for the new attribute. + * @param string $value Value for this attribute, + */ + public function __construct($key, $value) + { + $this->key = $key; + $this->value = $value; + } + + /** + * Sets the key for this attribute. + * + * @param string $key The new name of this attribute. + * + * @return \phpDocumentor\GraphViz\Attribute + */ + public function setKey($key) + { + $this->key = $key; + return $this; + } + + /** + * Returns the name for this attribute. + * + * @return string + */ + public function getKey() + { + return $this->key; + } + + /** + * Sets the value for this attribute. + * + * @param string $value The new value. + * + * @return \phpDocumentor\GraphViz\Attribute + */ + public function setValue($value) + { + $this->value = $value; + return $this; + } + + /** + * Returns the value for this attribute. + * + * @return string + */ + public function getValue() + { + return $this->value; + } + + /** + * Returns the attribute definition as is requested by GraphViz. + * + * @return string + */ + public function __toString() + { + $key = $this->getKey(); + if ($key == 'url') { + $key = 'URL'; + } + + $value = $this->getValue(); + if ($this->isValueContainingSpecials()) { + $value = '"' . $this->encodeSpecials() . '"'; + } elseif (!$this->isValueInHtml()) { + $value = '"' . addslashes($value) . '"'; + } + return $key . '=' . $value; + } + + /** + * Returns whether the value contains HTML. + * + * @return bool + */ + public function isValueInHtml() + { + $value = $this->getValue(); + + return (bool)(isset($value[0]) && ($value[0] == '<')); + } + + /** + * Checks whether the value contains any any special characters needing escaping. + * + * @return bool + */ + public function isValueContainingSpecials() + { + return strstr($this->getValue(), "\\") !== false; + } + + /** + * Encode special characters so the escape sequences aren't removed + * + * @see http://www.graphviz.org/doc/info/attrs.html#k:escString + * @return string + */ + protected function encodeSpecials() + { + $value = $this->getValue(); + $regex = '(\'|"|\\x00|\\\\(?![\\\\NGETHLnlr]))'; + return preg_replace($regex, '\\\\$0', $value); + } +} diff --git a/vendor/phpdocumentor/graphviz/src/phpDocumentor/GraphViz/Edge.php b/vendor/phpdocumentor/graphviz/src/phpDocumentor/GraphViz/Edge.php new file mode 100644 index 0000000000..a187169003 --- /dev/null +++ b/vendor/phpdocumentor/graphviz/src/phpDocumentor/GraphViz/Edge.php @@ -0,0 +1,135 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\GraphViz; + +/** + * Class representing an edge (arrow, line). + * + * @author Mike van Riel + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class Edge +{ + /** @var \phpDocumentor\GraphViz\Node Node from where to link */ + protected $from = null; + + /** @var \phpDocumentor\GraphViz\Node Node where to to link */ + protected $to = null; + + /** @var \phpDocumentor\GraphViz\Attribute List of attributes for this edge */ + protected $attributes = array(); + + /** + * Creates a new Edge / Link between the given nodes. + * + * @param \phpDocumentor\GraphViz\Node $from Starting node to create an Edge from. + * @param \phpDocumentor\GraphViz\Node $to Destination node where to create and + * edge to. + */ + function __construct(Node $from, Node $to) + { + $this->from = $from; + $this->to = $to; + } + + /** + * Factory method used to assist with fluent interface handling. + * + * See the examples for more details. + * + * @param \phpDocumentor\GraphViz\Node $from Starting node to create an Edge from. + * @param \phpDocumentor\GraphViz\Node $to Destination node where to create and + * edge to. + * + * @return \phpDocumentor\GraphViz\Edge + */ + public static function create(Node $from, Node $to) { + return new self($from, $to); + } + + /** + * Returns the source Node for this Edge. + * + * @return \phpDocumentor\GraphViz\Node + */ + public function getFrom() + { + return $this->from; + } + + /** + * Returns the destination Node for this Edge. + * + * @return \phpDocumentor\GraphViz\Node + */ + public function getTo() + { + return $this->to; + } + + /** + * Magic method to provide a getter/setter to add attributes on the edge. + * + * Using this method we make sure that we support any attribute without too + * much hassle. If the name for this method does not start with get or set + * we return null. + * + * Set methods return this graph (fluent interface) whilst get methods + * return the attribute value. + * + * @param string $name name of the invoked method, expect it to be + * setX or getX. + * @param mixed[] $arguments Arguments for the setter, only 1 is expected: value + * + * @return \phpDocumentor\GraphViz\Attribute[]|\phpDocumentor\GraphViz\Edge|null + */ + function __call($name, $arguments) + { + $key = strtolower(substr($name, 3)); + if (strtolower(substr($name, 0, 3)) == 'set') { + $this->attributes[$key] = new Attribute($key, $arguments[0]); + + return $this; + } + if (strtolower(substr($name, 0, 3)) == 'get') { + return $this->attributes[$key]; + } + + return null; + } + + /** + * Returns the edge definition as is requested by GraphViz. + * + * @return string + */ + public function __toString() + { + $attributes = array(); + foreach ($this->attributes as $value) { + $attributes[] = (string)$value; + } + $attributes = implode("\n", $attributes); + + $from_name = addslashes($this->getFrom()->getName()); + $to_name = addslashes($this->getTo()->getName()); + + return << "$to_name" [ +$attributes +] +DOT; + } +} diff --git a/vendor/phpdocumentor/graphviz/src/phpDocumentor/GraphViz/Exception.php b/vendor/phpdocumentor/graphviz/src/phpDocumentor/GraphViz/Exception.php new file mode 100644 index 0000000000..442fbe0840 --- /dev/null +++ b/vendor/phpdocumentor/graphviz/src/phpDocumentor/GraphViz/Exception.php @@ -0,0 +1,26 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\GraphViz; + +/** + * Class representing an exception in this GraphViz component. + * + * @author Mike van Riel + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class Exception extends \Exception +{ + +} \ No newline at end of file diff --git a/vendor/phpdocumentor/graphviz/src/phpDocumentor/GraphViz/Graph.php b/vendor/phpdocumentor/graphviz/src/phpDocumentor/GraphViz/Graph.php new file mode 100644 index 0000000000..e933d74bf1 --- /dev/null +++ b/vendor/phpdocumentor/graphviz/src/phpDocumentor/GraphViz/Graph.php @@ -0,0 +1,413 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\GraphViz; + +/** + * Class representing a graph; this may be a main graph but also a subgraph. + * + * In case of a subgraph: + * When the name of the subgraph is prefixed with _cluster_ then the contents + * of this graph will be grouped and a border will be added. Otherwise it is + * used as logical container to place defaults in. + * + * @author Mike van Riel + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + * + * @method Graph setRankSep(string $rankSep) + * @method Graph setCenter(string $center) + * @method Graph setRank(string $rank) + * @method Graph setRankDir(string $rankDir) + * @method Graph setSplines(string $splines) + * @method Graph setConcentrate(string $concentrate) + */ +class Graph +{ + + /** @var string Name of this graph */ + protected $name = 'G'; + + /** @var string Type of this graph; may be digraph, graph or subgraph */ + protected $type = 'digraph'; + + /** @var bool If the graph is strict then multiple edges are not allowed between the same pairs of nodes */ + protected $strict = false; + + /** @var \phpDocumentor\GraphViz\Attribute[] A list of attributes for this Graph */ + protected $attributes = array(); + + /** @var \phpDocumentor\GraphViz\Graph[] A list of subgraphs for this Graph */ + protected $graphs = array(); + + /** @var \phpDocumentor\GraphViz\Node[] A list of nodes for this Graph */ + protected $nodes = array(); + + /** @var \phpDocumentor\GraphViz\Edge[] A list of edges / arrows for this Graph */ + protected $edges = array(); + + /** @var string The path to execute dot from */ + protected $path = ''; + + /** + * Factory method to instantiate a Graph so that you can use fluent coding + * to chain everything. + * + * @param string $name The name for this graph. + * @param bool $directional Whether this is a directed or undirected graph. + * + * @return \phpDocumentor\GraphViz\Graph + */ + public static function create($name = 'G', $directional = true) + { + $graph = new self(); + $graph + ->setName($name) + ->setType($directional ? 'digraph' : 'graph'); + + return $graph; + } + + /** + * Sets the path for the execution. Only needed if it is not in the PATH env. + * + * @param string $path The path to execute dot from + * + * @return \phpDocumentor\GraphViz\Graph + */ + public function setPath($path) + { + if ($path && $path = realpath($path)) { + $this->path = $path . DIRECTORY_SEPARATOR; + } + return $this; + } + + /** + * Sets the name for this graph. + * + * If this is a subgraph you can prefix the name with _cluster_ to group all + * contained nodes and add a border. + * + * @param string $name The new name for this graph. + * + * @return \phpDocumentor\GraphViz\Graph + */ + public function setName($name) + { + $this->name = $name; + return $this; + } + + /** + * Returns the name for this Graph. + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Sets the type for this graph. + * + * @param string $type Must be either "digraph", "graph" or "subgraph". + * + * @throws \InvalidArgumentException if $type is not "digraph", "graph" or + * "subgraph". + * + * @return \phpDocumentor\GraphViz\Graph + */ + public function setType($type) + { + if (!in_array($type, array('digraph', 'graph', 'subgraph'))) { + throw new \InvalidArgumentException( + 'The type for a graph must be either "digraph", "graph" or ' + . '"subgraph"' + ); + } + + $this->type = $type; + return $this; + } + + /** + * Returns the type of this Graph. + * + * @return string + */ + public function getType() + { + return $this->type; + } + + /** + * Set if the Graph should be strict. If the graph is strict then + * multiple edges are not allowed between the same pairs of nodes + * + * @param bool $isStrict + * + * @return \phpDocumentor\GraphViz\Graph + */ + public function setStrict($isStrict) + { + $this->strict = $isStrict; + return $this; + } + + /** + * @return bool + */ + public function isStrict() + { + return $this->strict; + } + + /** + * Magic method to provide a getter/setter to add attributes on the Graph. + * + * Using this method we make sure that we support any attribute without + * too much hassle. If the name for this method does not start with get + * or set we return null. + * + * Set methods return this graph (fluent interface) whilst get methods + * return the attribute value. + * + * @param string $name Name of the method including get/set + * @param mixed[] $arguments The arguments, should be 1: the value + * + * @return \phpDocumentor\GraphViz\Attribute[]|\phpDocumentor\GraphViz\Graph|null + */ + function __call($name, $arguments) + { + $key = strtolower(substr($name, 3)); + if (strtolower(substr($name, 0, 3)) === 'set') { + $this->attributes[$key] = new Attribute($key, $arguments[0]); + + return $this; + } + if (strtolower(substr($name, 0, 3)) === 'get') { + return $this->attributes[$key]; + } + + return null; + } + + /** + * Adds a subgraph to this graph; automatically changes the type to subgraph. + * + * Please note that an index is maintained using the name of the subgraph. + * Thus if you have 2 subgraphs with the same name that the first will be + * overwritten by the latter. + * + * @param \phpDocumentor\GraphViz\Graph $graph The graph to add onto this graph as + * subgraph. + * + * @see \phpDocumentor\GraphViz\Graph::create() + * + * @return \phpDocumentor\GraphViz\Graph + */ + public function addGraph(\phpDocumentor\GraphViz\Graph $graph) + { + $graph->setType('subgraph'); + $this->graphs[$graph->getName()] = $graph; + return $this; + } + + /** + * Checks whether a graph with a certain name already exists. + * + * @param string $name Name of the graph to find. + * + * @return bool + */ + public function hasGraph($name) + { + return isset($this->graphs[$name]); + } + + /** + * Returns the subgraph with a given name. + * + * @param string $name Name of the requested graph. + * + * @return \phpDocumentor\GraphViz\Graph + */ + public function getGraph($name) + { + return $this->graphs[$name]; + } + + /** + * Sets a node in the $nodes array; uses the name of the node as index. + * + * Nodes can be retrieved by retrieving the property with the same name. + * Thus 'node1' can be retrieved by invoking: $graph->node1 + * + * @param \phpDocumentor\GraphViz\Node $node The node to set onto this Graph. + * + * @see \phpDocumentor\GraphViz\Node::create() + * + * @return \phpDocumentor\GraphViz\Graph + */ + public function setNode(Node $node) + { + $this->nodes[$node->getName()] = $node; + return $this; + } + + /** + * Finds a node in this graph or any of its subgraphs. + * + * @param string $name Name of the node to find. + * + * @return \phpDocumentor\GraphViz\Node + */ + public function findNode($name) + { + if (isset($this->nodes[$name])) { + return $this->nodes[$name]; + } + + foreach ($this->graphs as $graph) { + $node = $graph->findNode($name); + if ($node) { + return $node; + } + } + + return null; + } + + /** + * Sets a node using a custom name. + * + * @param string $name Name of the node. + * @param \phpDocumentor\GraphViz\Node $value Node to set on the given name. + * + * @see \phpDocumentor\GraphViz\Graph::setNode() + * + * @return \phpDocumentor\GraphViz\Graph + */ + function __set($name, $value) + { + $this->nodes[$name] = $value; + return $this; + } + + + /** + * Returns the requested node by its name. + * + * @param string $name The name of the node to retrieve. + * + * @see \phpDocumentor\GraphViz\Graph::setNode() + * + * @return \phpDocumentor\GraphViz\Node + */ + function __get($name) + { + return isset($this->nodes[$name]) ? $this->nodes[$name] : null; + } + + /** + * Links two nodes to eachother and registers the Edge onto this graph. + * + * @param \phpDocumentor\GraphViz\Edge $edge The link between two classes. + * + * @see \phpDocumentor\GraphViz\Edge::create() + * + * @return \phpDocumentor\GraphViz\Graph + */ + public function link(Edge $edge) + { + $this->edges[] = $edge; + return $this; + } + + /** + * Exports this graph to a generated image. + * + * This is the only method that actually requires GraphViz. + * + * @param string $type The type to export to; see the link above for a + * list of supported types. + * @param string $filename The path to write to. + * + * @uses GraphViz/dot + * + * @link http://www.graphviz.org/content/output-formats + * + * @throws \phpDocumentor\GraphViz\Exception if an error occurred in GraphViz. + * + * @return \phpDocumentor\GraphViz\Graph + */ + public function export($type, $filename) + { + $type = escapeshellarg($type); + $filename = escapeshellarg($filename); + + // write the dot file to a temporary file + $tmpfile = tempnam(sys_get_temp_dir(), 'gvz'); + file_put_contents($tmpfile, (string)$this); + + // escape the temp file for use as argument + $tmpfileArg = escapeshellarg($tmpfile); + + // create the dot output + $output = array(); + $code = 0; + exec($this->path . "dot -T$type -o$filename < $tmpfileArg 2>&1", $output, $code); + unlink($tmpfile); + + if ($code != 0) { + throw new Exception( + 'An error occurred while creating the graph; GraphViz returned: ' + . implode(PHP_EOL, $output) + ); + } + + return $this; + } + + /** + * Generates a DOT file for use with GraphViz. + * + * GraphViz is not used in this method; it is safe to call it even without + * GraphViz installed. + * + * @return string + */ + public function __toString() + { + $elements = array_merge( + $this->graphs, $this->attributes, $this->edges, $this->nodes + ); + + $attributes = array(); + foreach ($elements as $value) { + $attributes[] = (string)$value; + } + $attributes = implode(PHP_EOL, $attributes); + + $strict = ($this->isStrict() ? 'strict ' : ''); + + return <<getType()} "{$this->getName()}" { +$attributes +} +DOT; + } + +} diff --git a/vendor/phpdocumentor/graphviz/src/phpDocumentor/GraphViz/Node.php b/vendor/phpdocumentor/graphviz/src/phpDocumentor/GraphViz/Node.php new file mode 100644 index 0000000000..72b5d2e7d5 --- /dev/null +++ b/vendor/phpdocumentor/graphviz/src/phpDocumentor/GraphViz/Node.php @@ -0,0 +1,139 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\GraphViz; + +/** + * Class representing a node / element in a graph. + * + * @author Mike van Riel + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + * + * @method void setLabel(string $name) Sets the label for this node. + */ +class Node +{ + + /** @var string Name for this node */ + protected $name = ''; + + /** @var \phpDocumentor\GraphViz\Attribute[] List of attributes for this node */ + protected $attributes = array(); + + /** + * Creates a new node with name and optional label. + * + * @param string $name Name of the new node. + * @param string|null $label Optional label text. + */ + function __construct($name, $label = null) + { + $this->setName($name); + if ($label !== null) { + $this->setLabel($label); + } + } + + /** + * Factory method used to assist with fluent interface handling. + * + * See the examples for more details. + * + * @param string $name Name of the new node. + * @param string|null $label Optional label text. + * + * @return \phpDocumentor\GraphViz\Node + */ + public static function create($name, $label = null) + { + return new self($name, $label); + } + + /** + * Sets the name for this node. + * + * Not to confuse with the label. + * + * @param string $name Name for this node. + * + * @return \phpDocumentor\GraphViz\Node + */ + public function setName($name) + { + $this->name = $name; + return $this; + } + + /** + * Returns the name for this node. + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Magic method to provide a getter/setter to add attributes on the Node. + * + * Using this method we make sure that we support any attribute without + * too much hassle. If the name for this method does not start with get or + * set we return null. + * + * Set methods return this graph (fluent interface) whilst get methods + * return the attribute value. + * + * @param string $name Method name; either getX or setX is expected. + * @param mixed[] $arguments List of arguments; only 1 is expected for setX. + * + * @return \phpDocumentor\GraphViz\Attribute[]|\phpDocumentor\GraphViz\Node|null + */ + function __call($name, $arguments) + { + $key = strtolower(substr($name, 3)); + if (strtolower(substr($name, 0, 3)) == 'set') { + $this->attributes[$key] = new Attribute($key, $arguments[0]); + return $this; + } + + if (strtolower(substr($name, 0, 3)) == 'get') { + return $this->attributes[$key]; + } + + return null; + } + + /** + * Returns the node definition as is requested by GraphViz. + * + * @return string + */ + public function __toString() + { + $attributes = array(); + foreach ($this->attributes as $value) { + $attributes[] = (string)$value; + } + $attributes = implode("\n", $attributes); + + $name = addslashes($this->getName()); + + return << + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpDocumentor-project.org + */ + +namespace phpDocumentor\GraphViz\Test; + +use phpDocumentor\GraphViz\Attribute; + +/** + * Test for the the class representing a GraphViz attribute. + * + * @author Mike van Riel + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpDocumentor-project.org + */ +class AttributeTest extends \PHPUnit_Framework_TestCase +{ + /** @var \phpDocumentor\GraphViz\Attribute */ + protected $fixture = null; + + /** + * Initializes the fixture for this test. + * + * @return void + */ + protected function setUp() + { + $this->fixture = new Attribute('a', '1'); + } + + /** + * Tests the construct method + * + * @covers phpDocumentor\GraphViz\Attribute::__construct + * + * @returnn void + */ + public function testConstruct() + { + $fixture = new Attribute('MyKey', 'MyValue'); + $this->assertInstanceOf( + 'phpDocumentor\GraphViz\Attribute', + $fixture + ); + $this->assertSame('MyKey', $fixture->getKey()); + $this->assertSame('MyValue', $fixture->getValue()); + } + + /** + * Tests the getting and setting of the key. + * + * @covers \phpDocumentor\GraphViz\Attribute::getKey + * @covers \phpDocumentor\GraphViz\Attribute::setKey + * + * @return void + */ + public function testKey() + { + $this->assertSame( + $this->fixture->getKey(), 'a', + 'Expecting the key to match the initial state' + ); + $this->assertSame( + $this->fixture, $this->fixture->setKey('b'), + 'Expecting a fluent interface' + ); + $this->assertSame( + $this->fixture->getKey(), 'b', + 'Expecting the key to contain the new value' + ); + } + + /** + * Tests the getting and setting of the value. + * + * @covers \phpDocumentor\GraphViz\Attribute::getValue + * @covers \phpDocumentor\GraphViz\Attribute::setValue + * + * @return void + */ + public function testValue() + { + $this->assertSame( + $this->fixture->getValue(), '1', + 'Expecting the value to match the initial state' + ); + $this->assertSame( + $this->fixture, $this->fixture->setValue('2'), + 'Expecting a fluent interface' + ); + $this->assertSame( + $this->fixture->getValue(), '2', + 'Expecting the value to contain the new value' + ); + } + + /** + * Tests whether a string starting with a < is recognized as HTML. + * + * @covers \phpDocumentor\GraphViz\Attribute::isValueInHtml + * + * @return void + */ + public function testIsValueInHtml() + { + $this->fixture->setValue('a'); + $this->assertFalse( + $this->fixture->isValueInHtml(), + 'Expected value to not be a HTML code' + ); + + $this->fixture->setValue('test'); + $this->assertTrue( + $this->fixture->isValueInHtml(), + 'Expected value to be recognized as a HTML code' + ); + } + + /** + * Tests whether the toString provides a valid GraphViz attribute string. + * + * @covers \phpDocumentor\GraphViz\Attribute::__toString + * + * @return void + */ + public function testToString() + { + $this->fixture = new Attribute('a', 'b'); + $this->assertSame( + 'a="b"', (string)$this->fixture, + 'Strings should be surrounded with quotes' + ); + + $this->fixture->setValue('a"a'); + $this->assertSame( + 'a="a\"a"', (string)$this->fixture, + 'Strings should be surrounded with quotes' + ); + + $this->fixture->setKey('url'); + $this->assertSame( + 'URL="a\"a"', (string)$this->fixture, + 'The key named URL must be uppercased' + ); + + $this->fixture->setValue('test'); + $this->assertSame( + 'URL=test', (string)$this->fixture, + 'HTML strings should not be surrounded with quotes' + ); + } + + /** + * Tests whether the toString provides a valid GraphViz attribute string. + * + * @covers \phpDocumentor\GraphViz\Attribute::__toString + * @covers \phpDocumentor\GraphViz\Attribute::encodeSpecials + * + * @return void + */ + public function testToStringWithSpecials() + { + $this->fixture = new Attribute('a', 'b'); + + $this->fixture->setValue('a\la'); + $this->assertSame( + 'a="a\la"', (string)$this->fixture, + 'Specials should not be escaped' + ); + $this->fixture->setValue('a\l"a'); + $this->assertSame( + 'a="a\l\"a"', (string)$this->fixture, + 'Specials should not be escaped, but quotes should' + ); + $this->fixture->setValue('a\\\\l"a'); + $this->assertSame( + 'a="a\\\\l\"a"', (string)$this->fixture, + 'Double backslashes should stay the same' + ); + } + + /** + * Tests whether the isValueContainingSpecials function + * + * @covers \phpDocumentor\GraphViz\Attribute::isValueContainingSpecials + * + * @return void + */ + public function testIsValueContainingSpecials() + { + $this->fixture->setValue('+ name : string\l+ home_country : string\l'); + $this->assertTrue($this->fixture->isValueContainingSpecials()); + + $this->fixture->setValue('+ ship(): boolean'); + $this->assertFalse($this->fixture->isValueContainingSpecials()); + } + + +} diff --git a/vendor/phpdocumentor/graphviz/tests/phpDocumentor/GraphViz/Test/EdgeTest.php b/vendor/phpdocumentor/graphviz/tests/phpDocumentor/GraphViz/Test/EdgeTest.php new file mode 100644 index 0000000000..8724c6911e --- /dev/null +++ b/vendor/phpdocumentor/graphviz/tests/phpDocumentor/GraphViz/Test/EdgeTest.php @@ -0,0 +1,168 @@ + + * @copyright 2012 Danny van der Sluijs (http://www.dannyvandersluijs.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpDocumentor-project.org + */ + +namespace phpDocumentor\GraphViz\Test; + +use phpDocumentor\GraphViz\Edge; +use phpDocumentor\GraphViz\Node; + +/** + * Test for the the class representing a GraphViz edge (vertex). + * + * @package phpDocumentor\GraphViz\Test + * @author Danny van der Sluijs + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpDocumentor-project.org + */ +class EdgeTest extends \PHPUnit_Framework_TestCase +{ + + /** + * @var phpDocumentor\GraphViz\Edge + */ + protected $fixture; + + /** + * Sets up the fixture, for example, opens a network connection. + * This method is called before a test is executed. + * + * @return void + */ + protected function setUp() + { + $this->fixture = new Edge(new Node('from'), new Node('to')); + } + + /** + * Tears down the fixture, for example, closes a network connection. + * This method is called after a test is executed. + * + * @return void + */ + protected function tearDown() + { + + } + + /** + * Tests the construct method + * + * @covers phpDocumentor\GraphViz\Edge::__construct + * + * @return void + */ + public function testConstruct() + { + $fromNode = $this->getMock('phpDocumentor\GraphViz\Node', array(), array(), '', false); + $toNode = $this->getMock('phpDocumentor\GraphViz\Node', array(), array(), '', false); + $fixture = new Edge($fromNode, $toNode); + + $this->assertInstanceOf( + 'phpDocumentor\GraphViz\Edge', + $fixture + ); + $this->assertSame( + $fromNode, + $fixture->getFrom() + ); + $this->assertSame( + $toNode, + $fixture->getTo() + ); + } + + /** + * Tests the create method + * + * @covers phpDocumentor\GraphViz\Edge::create + * + * @return void + */ + public function testCreate() + { + $this->assertInstanceOf( + 'phpDocumentor\GraphViz\Edge', + Edge::create(new Node('from'), new Node('to')) + ); + } + + /** + * Tests whether the getFrom method returns the same node as passed + * in the create method + * + * @covers phpDocumentor\GraphViz\Edge::getFrom + * + * @return void + */ + public function testGetFrom() + { + $from = new Node('from'); + $edge = Edge::create($from, new Node('to')); + $this->assertSame($from, $edge->getFrom()); + } + + /** + * Tests the getTo method returns the same node as passed + * in the create method + * + * @covers phpDocumentor\GraphViz\Edge::getTo + * + * @return void + */ + public function testGetTo() + { + $to = new Node('to'); + $edge = Edge::create(new Node('from'), $to); + $this->assertSame($to, $edge->getTo()); + } + + /** + * Tests the magic __call method, to work as described, return the object + * instance for a setX method, return the value for an getX method, and null + * for the remaining method calls + * + * @covers phpDocumentor\GraphViz\Edge::__call + * + * @return void + */ + public function testCall() + { + $label = 'my label'; + $this->assertInstanceOf('phpDocumentor\GraphViz\Edge', $this->fixture->setLabel($label)); + $this->assertSame($label, $this->fixture->getLabel()->getValue()); + $this->assertNull($this->fixture->someNonExcistingMethod()); + } + + /** + * Tests whether the magic __toString method returns a well formatted string + * as specified in the DOT standard + * + * @covers phpDocumentor\GraphViz\Edge::__toString + * + * @return void + */ + public function testToString() + { + $this->fixture->setLabel('MyLabel'); + $this->fixture->setWeight(45); + + $dot = << "to" [ +label="MyLabel" +weight="45" +] +DOT; + + $this->assertSame($dot, (string) $this->fixture); + } +} diff --git a/vendor/phpdocumentor/graphviz/tests/phpDocumentor/GraphViz/Test/GraphTest.php b/vendor/phpdocumentor/graphviz/tests/phpDocumentor/GraphViz/Test/GraphTest.php new file mode 100644 index 0000000000..96d22e1c64 --- /dev/null +++ b/vendor/phpdocumentor/graphviz/tests/phpDocumentor/GraphViz/Test/GraphTest.php @@ -0,0 +1,361 @@ + + * @copyright 2012 Danny van der Sluijs (http://www.fleppuhstein.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpDocumentor-project.org + */ +namespace phpDocumentor\GraphViz; + +use phpDocumentor\GraphViz\Graph; +use phpDocumentor\GraphViz\Node; + +/** + * Generated by PHPUnit_SkeletonGenerator 1.2.0 on 2012-12-09 at 19:06:57. + */ +class GraphTest extends \PHPUnit_Framework_TestCase { + + /** + * @var Graph + */ + protected $fixture; + + /** + * Sets up the fixture, for example, opens a network connection. + * This method is called before a test is executed. + */ + protected function setUp() + { + $this->fixture = new Graph; + } + + /** + * Tears down the fixture, for example, closes a network connection. + * This method is called after a test is executed. + */ + protected function tearDown() + { + + } + + /** + * @covers phpDocumentor\GraphViz\Graph::create + */ + public function testCreate() + { + $fixture = Graph::create(); + $this->assertInstanceOf( + 'phpDocumentor\GraphViz\Graph', + $fixture + ); + $this->assertSame( + 'G', + $fixture->getName() + ); + $this->assertSame( + 'digraph', + $fixture->getType() + ); + + $fixture = Graph::create('MyName', false); + $this->assertSame( + 'MyName', + $fixture->getName() + ); + $this->assertSame( + 'graph', + $fixture->getType() + ); + } + + /** + * @covers phpDocumentor\GraphViz\Graph::setName + */ + public function testSetName() + { + $this->assertSame( + $this->fixture, $this->fixture->setName('otherName'), + 'Expecting a fluent interface' + ); + } + + /** + * @covers phpDocumentor\GraphViz\Graph::getName + */ + public function testGetName() + { + $this->assertSame( + $this->fixture->getName(), 'G', + 'Expecting the name to match the initial state' + ); + $this->fixture->setName('otherName'); + $this->assertSame( + $this->fixture->getName(), 'otherName', + 'Expecting the name to contain the new value' + ); + } + + /** + * @covers phpDocumentor\GraphViz\Graph::setType + */ + public function testSetType() + { + $this->assertSame( + $this->fixture, $this->fixture->setType('digraph'), + 'Expecting a fluent interface' + ); + $this->assertSame( + $this->fixture, $this->fixture->setType('graph'), + 'Expecting a fluent interface' + ); + $this->assertSame( + $this->fixture, $this->fixture->setType('subgraph'), + 'Expecting a fluent interface' + ); + } + + /** + * @covers phpDocumentor\GraphViz\Graph::setType + */ + public function testSetTypeException() + { + $this->setExpectedException('\InvalidArgumentException'); + $this->fixture->setType('fakegraphg'); + } + + /** + * @covers phpDocumentor\GraphViz\Graph::getType + */ + public function testGetType() + { + $this->assertSame( + $this->fixture->getType(), + 'digraph' + ); + $this->fixture->setType('graph'); + $this->assertSame( + $this->fixture->getType(), + 'graph' + ); + } + + public function testSetStrict() + { + $this->assertSame( + $this->fixture, $this->fixture->setStrict(true), + 'Expecting a fluent interface' + ); + $this->assertSame( + $this->fixture, $this->fixture->setStrict(false), + 'Expecting a fluent interface' + ); + } + + public function testIsStrict() + { + $this->assertSame( + $this->fixture->isStrict(), + false + ); + $this->fixture->setStrict(true); + $this->assertSame( + $this->fixture->isStrict(), + true + ); + } + + public function testSetPath() + { + $this->assertSame( + $this->fixture, $this->fixture->setPath(__DIR__), + 'Expecting a fluent interface' + ); + } + + /** + * @covers phpDocumentor\GraphViz\Graph::__call + */ + public function test__call() + { + $this->assertNull($this->fixture->MyMethod()); + $this->assertSame($this->fixture, $this->fixture->setColor('black')); + $this->assertSame('black', $this->fixture->getColor()->getValue()); + } + + /** + * @covers phpDocumentor\GraphViz\Graph::addGraph + */ + public function testAddGraph() + { + $this->assertSame( + $this->fixture, + $this->fixture->addGraph($this->getMock('phpDocumentor\GraphViz\Graph')) + ); + } + + /** + * @covers phpDocumentor\GraphViz\Graph::hasGraph + */ + public function testHasGraph() + { + $mock = $this->getMock('phpDocumentor\GraphViz\Graph'); + $mock->expects($this->any())->method('getName')->will($this->returnValue('MyName')); + $this->assertFalse($this->fixture->hasGraph('MyName')); + $this->fixture->addGraph($mock); + $this->assertTrue($this->fixture->hasGraph('MyName')); + } + + /** + * @covers phpDocumentor\GraphViz\Graph::getGraph + */ + public function testGetGraph() + { + $mock = $this->getMock('phpDocumentor\GraphViz\Graph'); + $mock->expects($this->any())->method('getName')->will($this->returnValue('MyName')); + + $this->fixture->addGraph($mock); + $this->assertSame( + $mock, + $this->fixture->getGraph('MyName') + ); + } + + /** + * @covers phpDocumentor\GraphViz\Graph::setNode + */ + public function testSetNode() + { + $mock = $this->getMock('phpDocumentor\GraphViz\Node', array(), array(), '', false); + $mock->expects($this->any())->method('getName')->will($this->returnValue('MyName')); + + $this->assertSame( + $this->fixture, + $this->fixture->setNode($mock) + ); + } + + /** + * @covers phpDocumentor\GraphViz\Graph::findNode + */ + public function testFindNode() { + $this->assertNull($this->fixture->findNode('MyNode')); + + $mock = $this->getMock('phpDocumentor\GraphViz\Node', array(), array(), '', false); + $mock->expects($this->any())->method('getName')->will($this->returnValue('MyName')); + $this->fixture->setNode($mock); + $this->assertSame( + $mock, + $this->fixture->findNode('MyName') + ); + + $subGraph = Graph::create(); + $mock2 = $this->getMock('phpDocumentor\GraphViz\Node', array(), array(), '', false); + $mock2->expects($this->any())->method('getName')->will($this->returnValue('MyName2')); + $subGraph->setNode($mock2); + + $this->fixture->addGraph($subGraph); + $this->assertSame( + $mock2, + $this->fixture->findNode('MyName2') + ); + + } + + /** + * @covers phpDocumentor\GraphViz\Graph::__set + * @todo Implement test__set(). + */ + public function test__set() { + $mock = $this->getMock('phpDocumentor\GraphViz\Node', array(), array(), '', false); + $mock->expects($this->any())->method('getName')->will($this->returnValue('MyName')); + + $this->assertSame( + $this->fixture, + $this->fixture->__set('myNode', $mock) + ); + } + + /** + * @covers phpDocumentor\GraphViz\Graph::__get + * @todo Implement test__get(). + */ + public function test__get() { + $mock = $this->getMock('phpDocumentor\GraphViz\Node', array(), array(), '', false); + $mock->expects($this->any())->method('getName')->will($this->returnValue('MyName')); + + $this->fixture->myNode = $mock; + $this->assertSame( + $mock, + $this->fixture->myNode + ); + } + + /** + * @covers phpDocumentor\GraphViz\Graph::link + * @todo Implement testLink(). + */ + public function testLink() { + $mock = $this->getMock('phpDocumentor\GraphViz\Edge', array(), array(), '', false); + + $this->assertSame( + $this->fixture, + $this->fixture->link($mock) + ); + } + + /** + * @covers phpDocumentor\GraphViz\Graph::export + */ + public function testExportException() { + $graph = Graph::create('My First Graph'); + $filename = tempnam(sys_get_temp_dir(), 'tst'); + + $this->setExpectedException('phpDocumentor\GraphViz\Exception'); + $graph->export('fpd', $filename); + + } + + /** + * @covers phpDocumentor\GraphViz\Graph::export + */ + public function testExport() { + $graph = Graph::create('My First Graph'); + $filename = tempnam(sys_get_temp_dir(), 'tst'); + + $this->assertSame( + $graph, + $graph->export('pdf', $filename) + ); + $this->assertTrue(is_readable($filename)); + } + + /** + * @covers phpDocumentor\GraphViz\Graph::__toString + */ + public function test__toString() + { + $graph = Graph::create('My First Graph'); + $this->assertSame( + (string) $graph, + ('digraph "My First Graph" {' . PHP_EOL . PHP_EOL . '}') + ); + + $graph->setLabel('PigeonPost'); + $this->assertSame( + (string) $graph, + ('digraph "My First Graph" {' . PHP_EOL . 'label="PigeonPost"' . PHP_EOL . '}') + ); + + $graph->setStrict(true); + $this->assertSame( + (string) $graph, + ('strict digraph "My First Graph" {' . PHP_EOL . 'label="PigeonPost"' . PHP_EOL . '}') + ); + } + +} diff --git a/vendor/phpdocumentor/graphviz/tests/phpDocumentor/GraphViz/Test/NodeTest.php b/vendor/phpdocumentor/graphviz/tests/phpDocumentor/GraphViz/Test/NodeTest.php new file mode 100644 index 0000000000..69df2d79b6 --- /dev/null +++ b/vendor/phpdocumentor/graphviz/tests/phpDocumentor/GraphViz/Test/NodeTest.php @@ -0,0 +1,161 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpDocumentor-project.org + */ + +namespace phpDocumentor\GraphViz\Test; + +use phpDocumentor\GraphViz\Node; + +/** + * Test for the the class representing a GraphViz node. + * + * @package phpDocumentor\GraphViz\Tests + * @author Mike van Riel + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpDocumentor-project.org + */ +class NodeTest extends \PHPUnit_Framework_TestCase +{ + /** @var \phpDocumentor\GraphViz\Node */ + protected $fixture = null; + + /** + * Initializes the fixture for this test. + * + * @return void + */ + protected function setUp() + { + $this->fixture = new Node('name', 'label'); + } + + /** + * Tests the construct method + * + * @covers phpDocumentor\GraphViz\Node::__construct + * + * @returnn void + */ + public function testConstruct() + { + $fixture = new Node('MyName', 'MyLabel'); + $this->assertInstanceOf( + 'phpDocumentor\GraphViz\Node', + $fixture + ); + $this->assertSame('MyName', $fixture->getName()); + $this->assertSame('MyLabel', $fixture->getLabel()->getValue()); + } + + /** + * Tests the create method + * + * @covers phpDocumentor\GraphViz\Node::create + * + * @returnn void + */ + public function testCreate() + { + $this->assertInstanceOf( + 'phpDocumentor\GraphViz\Node', + Node::create('name', 'label') + ); + } + + /** + * Tests the getting and setting of the name. + * + * @covers \phpDocumentor\GraphViz\Node::getName + * @covers \phpDocumentor\GraphViz\Node::setName + * + * @return void + */ + public function testName() + { + $this->assertSame( + $this->fixture->getName(), 'name', + 'Expecting the name to match the initial state' + ); + $this->assertSame( + $this->fixture, $this->fixture->setName('otherName'), + 'Expecting a fluent interface' + ); + $this->assertSame( + $this->fixture->getName(), 'otherName', + 'Expecting the name to contain the new value' + ); + } + + /** + * Tests the magic __call method, to work as described, return the object + * instance for a setX method, return the value for an getX method, and null + * for the remaining method calls + * + * @covers phpDocumentor\GraphViz\Node::__call + * + * @return void + */ + public function testCall() + { + $fontname = 'Bitstream Vera Sans'; + $this->assertInstanceOf('phpDocumentor\GraphViz\Node', $this->fixture->setfontname($fontname)); + $this->assertSame($fontname, $this->fixture->getfontname()->getValue()); + $this->assertNull($this->fixture->someNonExistingMethod()); + } + + /** + * Tests whether the magic __toString method returns a well formatted string + * as specified in the DOT standard + * + * @covers phpDocumentor\GraphViz\Node::__toString + * + * @return void + */ + public function testToString() + { + $this->fixture->setfontsize(12); + $this->fixture->setfontname('Bitstream Vera Sans'); + + $dot = <<assertSame($dot, (string) $this->fixture); + } + + /** + * Tests whether the magic __toString method returns a well formatted string + * as specified in the DOT standard when the label contains slashes. + * + * @covers phpDocumentor\GraphViz\Node::__toString + */ + public function testToStringWithLabelContainingSlashes() + { + $this->fixture->setfontsize(12); + $this->fixture->setfontname('Bitstream Vera Sans'); + $this->fixture->setLabel('\phpDocumentor\Descriptor\ProjectDescriptor'); + + $dot = <<assertSame($dot, (string) $this->fixture); + } +} diff --git a/vendor/phpdocumentor/phpdocumentor/.dockerignore b/vendor/phpdocumentor/phpdocumentor/.dockerignore new file mode 100644 index 0000000000..8d2855de5a --- /dev/null +++ b/vendor/phpdocumentor/phpdocumentor/.dockerignore @@ -0,0 +1,17 @@ +bin/* +!bin/phpdoc +build.properties +build.xml +build/* +.vagrant +phpunit.xml.dist +ansible +docs +features +tests +.* +Vagrantfile +package.xml +phpmd.xml.dist +behat.yml +box.json diff --git a/vendor/phpdocumentor/phpdocumentor/Dockerfile b/vendor/phpdocumentor/phpdocumentor/Dockerfile new file mode 100644 index 0000000000..46a0659d18 --- /dev/null +++ b/vendor/phpdocumentor/phpdocumentor/Dockerfile @@ -0,0 +1,17 @@ +FROM php:7 + +ADD . /opt/phpdoc + +RUN apt-get update \ + && apt-get install -yq graphviz curl git libicu-dev libicu57 zlib1g-dev \ + && rm -rf /var/lib/apt/lists/* \ + && docker-php-ext-install -j$(nproc) intl zip \ + && cd /opt/phpdoc \ + && curl -O https://getcomposer.org/composer.phar \ + && php composer.phar install --prefer-dist -o --no-interaction --no-dev \ + && rm composer.phar + +WORKDIR /data +VOLUME /data + +ENTRYPOINT ["/opt/phpdoc/bin/phpdoc"] diff --git a/vendor/phpdocumentor/phpdocumentor/LICENSE b/vendor/phpdocumentor/phpdocumentor/LICENSE new file mode 100644 index 0000000000..615e4cf23b --- /dev/null +++ b/vendor/phpdocumentor/phpdocumentor/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2010 Mike van Riel + +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. \ No newline at end of file diff --git a/vendor/phpdocumentor/phpdocumentor/VERSION b/vendor/phpdocumentor/phpdocumentor/VERSION new file mode 100644 index 0000000000..dedcc7d433 --- /dev/null +++ b/vendor/phpdocumentor/phpdocumentor/VERSION @@ -0,0 +1 @@ +2.9.1 diff --git a/vendor/phpdocumentor/phpdocumentor/appveyor.yml b/vendor/phpdocumentor/phpdocumentor/appveyor.yml new file mode 100644 index 0000000000..e861696cf8 --- /dev/null +++ b/vendor/phpdocumentor/phpdocumentor/appveyor.yml @@ -0,0 +1,64 @@ +build: false +clone_folder: c:\phpdocumentor +max_jobs: 3 +platform: x86 +pull_requests: + do_not_increment_build_number: true +version: '{build}.{branch}' +skip_tags: true +branches: + only: + - master + - develop + +environment: + matrix: + - PHP_VERSION: '5.4.45' + VC_VERSION: 'VC9' + BEHAT_FLAGS: '--suite=core_features' + - PHP_VERSION: '5.5.37' + VC_VERSION: 'VC11' + BEHAT_FLAGS: '--suite=core_features' + - PHP_VERSION: '5.6.29' + VC_VERSION: 'VC11' + - PHP_VERSION: '7.0.18' + VC_VERSION: 'VC14' + - PHP_VERSION: '7.1.4' + VC_VERSION: 'VC14' +matrix: + fast_finish: false + +cache: + - c:\php -> appveyor.yml + - '%LOCALAPPDATA%\Composer\files' + +init: + - SET PATH=c:\php\%PHP_VERSION%;%PATH% + +install: + - IF NOT EXIST c:\php mkdir c:\php + - IF NOT EXIST c:\php\%PHP_VERSION% mkdir c:\php\%PHP_VERSION% + - cd c:\php\%PHP_VERSION% + - IF NOT EXIST php-installed.txt appveyor DownloadFile http://windows.php.net/downloads/releases/archives/php-%PHP_VERSION%-Win32-%VC_VERSION%-x86.zip + - IF NOT EXIST php-installed.txt 7z x php-%PHP_VERSION%-Win32-%VC_VERSION%-x86.zip -y >nul + - IF NOT EXIST php-installed.txt del /Q *.zip + - IF NOT EXIST php-installed.txt copy /Y php.ini-development php.ini + - IF NOT EXIST php-installed.txt echo max_execution_time=1200 >> php.ini + - IF NOT EXIST php-installed.txt echo date.timezone="UTC" >> php.ini + - IF NOT EXIST php-installed.txt echo extension_dir=ext >> php.ini + - IF NOT EXIST php-installed.txt echo extension=php_curl.dll >> php.ini + - IF NOT EXIST php-installed.txt echo extension=php_openssl.dll >> php.ini + - IF NOT EXIST php-installed.txt echo extension=php_mbstring.dll >> php.ini + - IF NOT EXIST php-installed.txt echo extension=php_fileinfo.dll >> php.ini + - IF NOT EXIST php-installed.txt echo zend.assertions=1 >> php.ini + - IF NOT EXIST php-installed.txt echo assert.exception=On >> php.ini + - IF NOT EXIST php-installed.txt appveyor DownloadFile https://getcomposer.org/composer.phar + - IF NOT EXIST php-installed.txt echo @php %%~dp0composer.phar %%* > composer.bat + - IF NOT EXIST php-installed.txt type nul >> php-installed.txt + - cd c:\phpdocumentor + - composer install --no-interaction --prefer-dist --no-progress + +test_script: + - cd c:\phpdocumentor + - bin/phpunit + - bin/behat %BEHAT_FLAGS% diff --git a/vendor/phpdocumentor/phpdocumentor/bin/phpdoc b/vendor/phpdocumentor/phpdocumentor/bin/phpdoc new file mode 100644 index 0000000000..48f862adb8 --- /dev/null +++ b/vendor/phpdocumentor/phpdocumentor/bin/phpdoc @@ -0,0 +1,27 @@ +#!/usr/bin/env php +registerProfiler() + ->initialize(); +$app->run(); + +// disable E_STRICT reporting on the end to prevent PEAR from throwing Strict warnings. +error_reporting(error_reporting() & ~E_STRICT); diff --git a/vendor/phpdocumentor/phpdocumentor/bin/phpdoc.bat b/vendor/phpdocumentor/phpdocumentor/bin/phpdoc.bat new file mode 100644 index 0000000000..09b258dd93 --- /dev/null +++ b/vendor/phpdocumentor/phpdocumentor/bin/phpdoc.bat @@ -0,0 +1,8 @@ +@echo off +if "%PHPBIN%" == "" set PHPBIN=php.exe +if not exist "%PHPBIN%" if "%PHP_PEAR_PHP_BIN%" neq "" goto USE_PEAR_PATH +GOTO RUN +:USE_PEAR_PATH +set PHPBIN=%PHP_PEAR_PHP_BIN% +:RUN +"%PHPBIN%" "%PHP_PEAR_BIN_DIR%\phpdoc" %* \ No newline at end of file diff --git a/vendor/phpdocumentor/phpdocumentor/bin/phpdoc.php b/vendor/phpdocumentor/phpdocumentor/bin/phpdoc.php new file mode 100644 index 0000000000..ce5116d096 --- /dev/null +++ b/vendor/phpdocumentor/phpdocumentor/bin/phpdoc.php @@ -0,0 +1,14 @@ +#!/usr/bin/env php + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +error_reporting(E_ALL & ~E_STRICT & ~E_DEPRECATED); +require_once('PEAR/PackageFileManager2.php'); +\PEAR::setErrorHandling(PEAR_ERROR_DIE); + +/** + * Creates a packager object with all basic options set. + * + * @param string $original_file Path of the original package.xml. + * @param string[] $options Set of options to merge in. + * + * @return PEAR_Error|PEAR_PackageFileManager2 + */ +function createPackager($original_file, $options = array()) +{ + // merge the options with these defaults. + $options = array_merge( + array( + 'packagefile' => 'package.xml', + 'filelistgenerator' => 'file', + 'simpleoutput' => true, + 'baseinstalldir' => '/phpDocumentor', + 'packagedirectory' => dirname(__FILE__).'/../../', + 'clearcontents' => true, + 'ignore' => array( + 'build.properties', + 'build.xml', + 'build/*', + 'data/output/*', + 'data/log/*', + 'bin/utils/*', + 'src/XHProf/*', // Profiling package + 'vendor/twig/twig/ext/*' + ), + 'exceptions' => array( + 'bin/phpdoc' => 'script', + 'bin/phpdoc.bat' => 'script', + 'phpdoc.dist.xml' => 'php', + 'LICENSE' => 'php', + 'phpunit.xml.dist' => 'php', + 'README' => 'php', + 'VERSION' => 'php', + 'vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Autoload.php.in' => 'php', + 'vendor/phpunit/phpunit/PHPUnit/Framework/Assert/Functions.php.in' => 'php', + 'vendor/phpunit/phpunit/PHPUnit/Autoload.php.in' => 'php', + 'vendor/phpunit/php-token-stream/PHP/Token/Stream/Autoload.php.in' => 'php', + 'vendor/phpunit/php-timer/PHP/Timer/Autoload.php.in' => 'php', + 'vendor/phpunit/php-text-template/Text/Template/Autoload.php.in' => 'php', + 'vendor/phpunit/php-file-iterator/File/Iterator/Autoload.php.in' => 'php', + 'vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Autoload.php.in' => 'php', + ), + 'installexceptions' => array( + 'bin/phpdoc' => '/', + 'bin/phpdoc.bat' => '/' + ), + 'dir_roles' => array( + 'bin' => 'php', + 'docs' => 'php', + 'data' => 'php', + 'tests' => 'php', + 'src' => 'php', + ), + ), + $options + ); + + $packagexml = PEAR_PackageFileManager2::importOptions($original_file, $options); + $packagexml->setPackageType('php'); + + $packagexml->setPackage('phpDocumentor'); + $packagexml->setSummary( + 'PHP 5.3 compatible API Documentation generator aimed at projects of ' + .'all sizes and Continuous Integration' + ); + $packagexml->setDescription( +<<setChannel('pear.phpdoc.org'); + $packagexml->setNotes( + 'Please see the CHANGELOG in the root of the application for the ' + .'latest changes' + ); + + $packagexml->setPhpDep('5.3.3'); + $packagexml->setPearinstallerDep('1.4.0'); + $packagexml->addReplacement( + 'bin/phpdoc', + 'pear-config', + '/usr/bin/env php', + 'php_bin' + ); + $packagexml->addGlobalReplacement('pear-config', '@php_bin@', 'php_bin'); + $packagexml->addReplacement( + 'bin/phpdoc', + 'pear-config', + '@php_dir@', + 'php_dir' + ); + + $packagexml->addMaintainer( + 'lead', + 'mvriel', + 'Mike van Riel', + 'mike.vanriel@naenius.com' + ); + $packagexml->addMaintainer( + 'lead', + 'ashnazg', + 'Chuck Burgess', + 'ashnazg@php.net' + ); + $packagexml->setLicense( + 'MIT', + 'http://www.opensource.org/licenses/mit-license.html' + ); + + // Add this as a release, and generate XML content + $packagexml->addRelease(); + $packagexml->setOSInstallCondition('windows'); + $packagexml->addInstallAs('bin/phpdoc.bat', 'phpdoc.bat'); + $packagexml->addInstallAs('bin/phpdoc', 'phpdoc'); + + $packagexml->addRelease(); + $packagexml->addInstallAs('bin/phpdoc', 'phpdoc'); + $packagexml->addIgnoreToRelease('bin/phpdoc.bat'); + + return $packagexml; +} + +echo 'phpDocumentor PEAR Packager v1.0'.PHP_EOL; + +if ($argc < 4) { + echo <<setReleaseVersion($argv[1]); +$packager->setAPIVersion($argv[2]); +$packager->setReleaseStability($argv[3]); +$packager->setAPIStability($argv[3]); + +$packager->generateContents(); +if (isset($argv[4]) && ($argv[4] == 'make')) { + $packager->writePackageFile(); +} else { + $packager->debugPackageFile(); +} diff --git a/vendor/phpdocumentor/phpdocumentor/box.phar b/vendor/phpdocumentor/phpdocumentor/box.phar new file mode 100644 index 0000000000..697da149c1 Binary files /dev/null and b/vendor/phpdocumentor/phpdocumentor/box.phar differ diff --git a/vendor/phpdocumentor/phpdocumentor/composer.json b/vendor/phpdocumentor/phpdocumentor/composer.json new file mode 100644 index 0000000000..146e4c5244 --- /dev/null +++ b/vendor/phpdocumentor/phpdocumentor/composer.json @@ -0,0 +1,75 @@ +{ + "name": "phpdocumentor/phpdocumentor", + "description": "Documentation Generator for PHP", + "keywords": ["documentation", "api", "dga", "application", "phpdoc"], + "homepage": "http://www.phpdoc.org", + "license": "MIT", + "autoload": { + "psr-0":{ + "phpDocumentor": ["src/", "tests/unit/"], + "Cilex\\Provider": ["src/"] + } + }, + "autoload-dev": { + "psr-4": { + "phpDocumentor\\Behat\\Contexts\\": [ + "tests/features/bootstrap" + ] + } + }, + "require": { + "php": ">=5.3.3", + + "cilex/cilex": "~1.0", + "symfony/validator": "~2.2", + "symfony/console": "~2.3", + + "monolog/monolog": "~1.6", + "twig/twig": "~1.3", + "erusev/parsedown": "~1.0", + "symfony/process": "~2.0", + "zetacomponents/document": ">=1.3.1", + + "symfony/event-dispatcher": "~2.1", + "symfony/stopwatch": "~2.3", + "symfony/config": "~2.3", + "jms/serializer": ">=0.12 < 1.8.0", + + "zendframework/zend-stdlib": "~2.1", + "zendframework/zend-servicemanager": "~2.1", + "zendframework/zend-config": "~2.1", + "zendframework/zend-i18n": "~2.1", + "zendframework/zend-serializer": "~2.1", + "zendframework/zend-cache": "~2.1", + "zendframework/zend-filter": "~2.1", + + "phpdocumentor/graphviz": "~1.0", + "phpdocumentor/fileset": "~1.0", + "phpdocumentor/reflection": "^3.0", + "phpdocumentor/reflection-docblock": "~2.0", + "webmozart/assert": "^1.2", + "padraic/phar-updater": "^1.0" + }, + "minimum-stability": "stable", + "require-dev": { + "behat/behat": "^3.0", + "phpunit/phpunit": "^4.0", + "mockery/mockery": "^0.9@dev", + "squizlabs/php_codesniffer": "^1.4", + "symfony/expression-language": "^2.4", + "mikey179/vfsstream": "~1.2" + }, + "suggest": { + "ext-twig": "Enabling the twig extension improves the generation of twig based templates.", + "ext-xslcache": "Enabling the XSLCache extension improves the generation of xml based templates." + }, + "config": { + "bin-dir":"bin/" + }, + "bin": ["bin/phpdoc.php", "bin/phpdoc"], + "extra": { + "branch-alias": { + "dev-develop": "2.9-dev" + } + } +} diff --git a/vendor/phpdocumentor/phpdocumentor/composer.lock b/vendor/phpdocumentor/phpdocumentor/composer.lock new file mode 100644 index 0000000000..4a13766891 --- /dev/null +++ b/vendor/phpdocumentor/phpdocumentor/composer.lock @@ -0,0 +1,4100 @@ +{ + "_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": "2e41d60eef9b301161149ad89e30b48a", + "packages": [ + { + "name": "cilex/cilex", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/Cilex/Cilex.git", + "reference": "7acd965a609a56d0345e8b6071c261fbdb926cb5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Cilex/Cilex/zipball/7acd965a609a56d0345e8b6071c261fbdb926cb5", + "reference": "7acd965a609a56d0345e8b6071c261fbdb926cb5", + "shasum": "" + }, + "require": { + "cilex/console-service-provider": "1.*", + "php": ">=5.3.3", + "pimple/pimple": "~1.0", + "symfony/finder": "~2.1", + "symfony/process": "~2.1" + }, + "require-dev": { + "phpunit/phpunit": "3.7.*", + "symfony/validator": "~2.1" + }, + "suggest": { + "monolog/monolog": ">=1.0.0", + "symfony/validator": ">=1.0.0", + "symfony/yaml": ">=1.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-0": { + "Cilex": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "mike.vanriel@naenius.com" + } + ], + "description": "The PHP micro-framework for Command line tools based on the Symfony2 Components", + "homepage": "http://cilex.github.com", + "keywords": [ + "cli", + "microframework" + ], + "time": "2014-03-29T14:03:13+00:00" + }, + { + "name": "cilex/console-service-provider", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/Cilex/console-service-provider.git", + "reference": "1.0.0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Cilex/console-service-provider/zipball/1.0.0", + "reference": "1.0.0", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "pimple/pimple": "1.*@dev", + "symfony/console": "~2.1" + }, + "require-dev": { + "cilex/cilex": "1.*@dev", + "silex/silex": "1.*@dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-0": { + "Cilex\\Provider\\Console": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Mike van Riel", + "email": "mike.vanriel@naenius.com" + } + ], + "description": "Console Service Provider", + "keywords": [ + "cilex", + "console", + "pimple", + "service-provider", + "silex" + ], + "time": "2012-12-19T10:50:58+00:00" + }, + { + "name": "doctrine/annotations", + "version": "v1.2.7", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "f25c8aab83e0c3e976fd7d19875f198ccf2f7535" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/f25c8aab83e0c3e976fd7d19875f198ccf2f7535", + "reference": "f25c8aab83e0c3e976fd7d19875f198ccf2f7535", + "shasum": "" + }, + "require": { + "doctrine/lexer": "1.*", + "php": ">=5.3.2" + }, + "require-dev": { + "doctrine/cache": "1.*", + "phpunit/phpunit": "4.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Common\\Annotations\\": "lib/" + } + }, + "notification-url": "http://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "time": "2015-08-31T12:32:49+00:00" + }, + { + "name": "doctrine/lexer", + "version": "v1.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c", + "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Common\\Lexer\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "lexer", + "parser" + ], + "time": "2014-09-09T13:34:57+00:00" + }, + { + "name": "erusev/parsedown", + "version": "1.6.2", + "source": { + "type": "git", + "url": "https://github.com/erusev/parsedown.git", + "reference": "1bf24f7334fe16c88bf9d467863309ceaf285b01" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/erusev/parsedown/zipball/1bf24f7334fe16c88bf9d467863309ceaf285b01", + "reference": "1bf24f7334fe16c88bf9d467863309ceaf285b01", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "Parsedown": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Emanuil Rusev", + "email": "hello@erusev.com", + "homepage": "http://erusev.com" + } + ], + "description": "Parser for Markdown.", + "homepage": "http://parsedown.org", + "keywords": [ + "markdown", + "parser" + ], + "time": "2017-03-29T16:04:15+00:00" + }, + { + "name": "jms/metadata", + "version": "1.6.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/metadata.git", + "reference": "6a06970a10e0a532fb52d3959547123b84a3b3ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/metadata/zipball/6a06970a10e0a532fb52d3959547123b84a3b3ab", + "reference": "6a06970a10e0a532fb52d3959547123b84a3b3ab", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "doctrine/cache": "~1.0", + "symfony/cache": "~3.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.5.x-dev" + } + }, + "autoload": { + "psr-0": { + "Metadata\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Class/method/property metadata management in PHP", + "keywords": [ + "annotations", + "metadata", + "xml", + "yaml" + ], + "time": "2016-12-05T10:18:33+00:00" + }, + { + "name": "jms/parser-lib", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/parser-lib.git", + "reference": "1.0.0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/parser-lib/zipball/1.0.0", + "reference": "1.0.0", + "shasum": "" + }, + "require": { + "phpoption/phpoption": ">=0.9,<2.0-dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-0": { + "JMS\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache2" + ], + "description": "A library for easily creating recursive-descent parsers.", + "time": "2012-11-18T18:08:43+00:00" + }, + { + "name": "jms/serializer", + "version": "0.16.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/serializer.git", + "reference": "c8a171357ca92b6706e395c757f334902d430ea9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/c8a171357ca92b6706e395c757f334902d430ea9", + "reference": "c8a171357ca92b6706e395c757f334902d430ea9", + "shasum": "" + }, + "require": { + "doctrine/annotations": "1.*", + "jms/metadata": "~1.1", + "jms/parser-lib": "1.*", + "php": ">=5.3.2", + "phpcollection/phpcollection": "~0.1" + }, + "require-dev": { + "doctrine/orm": "~2.1", + "doctrine/phpcr-odm": "~1.0.1", + "jackalope/jackalope-doctrine-dbal": "1.0.*", + "propel/propel1": "~1.7", + "symfony/filesystem": "2.*", + "symfony/form": "~2.1", + "symfony/translation": "~2.0", + "symfony/validator": "~2.0", + "symfony/yaml": "2.*", + "twig/twig": ">=1.8,<2.0-dev" + }, + "suggest": { + "symfony/yaml": "Required if you'd like to serialize data to YAML format." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.15-dev" + } + }, + "autoload": { + "psr-0": { + "JMS\\Serializer": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache2" + ], + "authors": [ + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh", + "role": "Developer of wrapped JMSSerializerBundle" + } + ], + "description": "Library for (de-)serializing data of any complexity; supports XML, JSON, and YAML.", + "homepage": "http://jmsyst.com/libs/serializer", + "keywords": [ + "deserialization", + "jaxb", + "json", + "serialization", + "xml" + ], + "time": "2014-03-18T08:39:00+00:00" + }, + { + "name": "monolog/monolog", + "version": "1.22.1", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "1e044bc4b34e91743943479f1be7a1d5eb93add0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/1e044bc4b34e91743943479f1be7a1d5eb93add0", + "reference": "1e044bc4b34e91743943479f1be7a1d5eb93add0", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "psr/log": "~1.0" + }, + "provide": { + "psr/log-implementation": "1.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "graylog2/gelf-php": "~1.0", + "jakub-onderka/php-parallel-lint": "0.9", + "php-amqplib/php-amqplib": "~2.4", + "php-console/php-console": "^3.1.3", + "phpunit/phpunit": "~4.5", + "phpunit/phpunit-mock-objects": "2.3.0", + "ruflin/elastica": ">=0.90 <3.0", + "sentry/sentry": "^0.13", + "swiftmailer/swiftmailer": "~5.3" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-mongo": "Allow sending log messages to a MongoDB server", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "php-console/php-console": "Allow sending log messages to Google Chrome", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server", + "sentry/sentry": "Allow sending log messages to a Sentry server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "http://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "time": "2017-03-13T07:08:03+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v1.4.1", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "f78af2c9c86107aa1a34cd1dbb5bbe9eeb0d9f51" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f78af2c9c86107aa1a34cd1dbb5bbe9eeb0d9f51", + "reference": "f78af2c9c86107aa1a34cd1dbb5bbe9eeb0d9f51", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "files": [ + "lib/bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "time": "2015-09-19T14:15:08+00:00" + }, + { + "name": "padraic/humbug_get_contents", + "version": "1.0.4", + "source": { + "type": "git", + "url": "https://github.com/humbug/file_get_contents.git", + "reference": "66797199019d0cb4529cb8d29c6f0b4c5085b53a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/humbug/file_get_contents/zipball/66797199019d0cb4529cb8d29c6f0b4c5085b53a", + "reference": "66797199019d0cb4529cb8d29c6f0b4c5085b53a", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Humbug\\": "src/Humbug/" + }, + "files": [ + "src/function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "http://blog.astrumfutura.com" + } + ], + "description": "Secure wrapper for accessing HTTPS resources with file_get_contents for PHP 5.3+", + "homepage": "https://github.com/padraic/file_get_contents", + "keywords": [ + "download", + "file_get_contents", + "http", + "https", + "ssl", + "tls" + ], + "time": "2015-04-22T18:45:00+00:00" + }, + { + "name": "padraic/phar-updater", + "version": "1.0.4", + "source": { + "type": "git", + "url": "https://github.com/humbug/phar-updater.git", + "reference": "ac8802df2d1d03b7092b6f044a914f8d21592aae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/humbug/phar-updater/zipball/ac8802df2d1d03b7092b6f044a914f8d21592aae", + "reference": "ac8802df2d1d03b7092b6f044a914f8d21592aae", + "shasum": "" + }, + "require": { + "padraic/humbug_get_contents": "1.0.4", + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Humbug\\SelfUpdate\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Padraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "http://blog.astrumfutura.com" + } + ], + "description": "A thing to make PHAR self-updating easy and secure.", + "keywords": [ + "humbug", + "phar", + "self-update", + "update" + ], + "time": "2017-07-12T22:42:45+00:00" + }, + { + "name": "phpcollection/phpcollection", + "version": "0.5.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-collection.git", + "reference": "f2bcff45c0da7c27991bbc1f90f47c4b7fb434a6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-collection/zipball/f2bcff45c0da7c27991bbc1f90f47c4b7fb434a6", + "reference": "f2bcff45c0da7c27991bbc1f90f47c4b7fb434a6", + "shasum": "" + }, + "require": { + "phpoption/phpoption": "1.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.4-dev" + } + }, + "autoload": { + "psr-0": { + "PhpCollection": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache2" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "General-Purpose Collection Library for PHP", + "keywords": [ + "collection", + "list", + "map", + "sequence", + "set" + ], + "time": "2015-05-17T12:39:23+00:00" + }, + { + "name": "phpdocumentor/fileset", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/Fileset.git", + "reference": "1.0.0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/Fileset/zipball/1.0.0", + "reference": "1.0.0", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/finder": "~2.1" + }, + "require-dev": { + "phpunit/phpunit": "~3.7" + }, + "type": "library", + "autoload": { + "psr-0": { + "phpDocumentor": [ + "src/", + "tests/unit/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Fileset component for collecting a set of files given directories and file paths", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "files", + "fileset", + "phpdoc" + ], + "time": "2013-08-06T21:07:42+00:00" + }, + { + "name": "phpdocumentor/graphviz", + "version": "1.0.4", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/GraphViz.git", + "reference": "a906a90a9f230535f25ea31caf81b2323956283f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/GraphViz/zipball/a906a90a9f230535f25ea31caf81b2323956283f", + "reference": "a906a90a9f230535f25ea31caf81b2323956283f", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "phpDocumentor": [ + "src/", + "tests/unit" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "mike.vanriel@naenius.com" + } + ], + "time": "2016-02-02T13:00:08+00:00" + }, + { + "name": "phpdocumentor/reflection", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/Reflection.git", + "reference": "793bfd92d9a0fc96ae9608fb3e947c3f59fb3a0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/Reflection/zipball/793bfd92d9a0fc96ae9608fb3e947c3f59fb3a0d", + "reference": "793bfd92d9a0fc96ae9608fb3e947c3f59fb3a0d", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^1.0", + "php": ">=5.3.3", + "phpdocumentor/reflection-docblock": "~2.0", + "psr/log": "~1.0" + }, + "require-dev": { + "behat/behat": "~2.4", + "mockery/mockery": "~0.8", + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "phpDocumentor": [ + "src/", + "tests/unit/", + "tests/mocks/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Reflection library to do Static Analysis for PHP Projects", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "time": "2016-05-21T08:42:32+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "2.0.5", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "e6a969a640b00d8daa3c66518b0405fb41ae0c4b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/e6a969a640b00d8daa3c66518b0405fb41ae0c4b", + "reference": "e6a969a640b00d8daa3c66518b0405fb41ae0c4b", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "suggest": { + "dflydev/markdown": "~1.0", + "erusev/parsedown": "~1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "phpDocumentor": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "mike.vanriel@naenius.com" + } + ], + "time": "2016-01-25T08:17:30+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.5.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "94e644f7d2051a5f0fcf77d81605f152eecff0ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/94e644f7d2051a5f0fcf77d81605f152eecff0ed", + "reference": "94e644f7d2051a5f0fcf77d81605f152eecff0ed", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "4.7.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-0": { + "PhpOption\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache2" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "time": "2015-07-25T16:39:46+00:00" + }, + { + "name": "pimple/pimple", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/silexphp/Pimple.git", + "reference": "2019c145fe393923f3441b23f29bbdfaa5c58c4d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/silexphp/Pimple/zipball/2019c145fe393923f3441b23f29bbdfaa5c58c4d", + "reference": "2019c145fe393923f3441b23f29bbdfaa5c58c4d", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-0": { + "Pimple": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Pimple is a simple Dependency Injection Container for PHP 5.3", + "homepage": "http://pimple.sensiolabs.org", + "keywords": [ + "container", + "dependency injection" + ], + "time": "2013-11-22T08:30:29+00:00" + }, + { + "name": "psr/log", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", + "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2016-10-10T12:19:37+00:00" + }, + { + "name": "symfony/config", + "version": "v2.8.20", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "0b8541d18507d10204a08384640ff6df3c739ebe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/0b8541d18507d10204a08384640ff6df3c739ebe", + "reference": "0b8541d18507d10204a08384640ff6df3c739ebe", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "symfony/filesystem": "~2.3|~3.0.0" + }, + "require-dev": { + "symfony/yaml": "~2.7|~3.0.0" + }, + "suggest": { + "symfony/yaml": "To use the yaml reference dumper" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Config\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Config Component", + "homepage": "https://symfony.com", + "time": "2017-04-12T14:07:15+00:00" + }, + { + "name": "symfony/console", + "version": "v2.8.20", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "2cfcbced8e39e2313ed4da8896fc8c59a56c0d7e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/2cfcbced8e39e2313ed4da8896fc8c59a56c0d7e", + "reference": "2cfcbced8e39e2313ed4da8896fc8c59a56c0d7e", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "symfony/debug": "^2.7.2|~3.0.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/event-dispatcher": "~2.1|~3.0.0", + "symfony/process": "~2.1|~3.0.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "time": "2017-04-26T01:38:53+00:00" + }, + { + "name": "symfony/debug", + "version": "v2.8.20", + "source": { + "type": "git", + "url": "https://github.com/symfony/debug.git", + "reference": "344f50ce827413b3640bfcb1e37386a67d06ea1f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/debug/zipball/344f50ce827413b3640bfcb1e37386a67d06ea1f", + "reference": "344f50ce827413b3640bfcb1e37386a67d06ea1f", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "psr/log": "~1.0" + }, + "conflict": { + "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" + }, + "require-dev": { + "symfony/class-loader": "~2.2|~3.0.0", + "symfony/http-kernel": "~2.3.24|~2.5.9|^2.6.2|~3.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Debug\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "http://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Debug Component", + "homepage": "https://symfony.com", + "time": "2017-04-19T19:56:30+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v2.8.20", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "7fc8e2b4118ff316550596357325dfd92a51f531" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/7fc8e2b4118ff316550596357325dfd92a51f531", + "reference": "7fc8e2b4118ff316550596357325dfd92a51f531", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "^2.0.5|~3.0.0", + "symfony/dependency-injection": "~2.6|~3.0.0", + "symfony/expression-language": "~2.6|~3.0.0", + "symfony/stopwatch": "~2.3|~3.0.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "https://symfony.com", + "time": "2017-04-26T16:56:54+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v2.8.20", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "dc40154e26a0116995e4f2f0c71cb9c2fe0775a3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/dc40154e26a0116995e4f2f0c71cb9c2fe0775a3", + "reference": "dc40154e26a0116995e4f2f0c71cb9c2fe0775a3", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "http://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Filesystem Component", + "homepage": "https://symfony.com", + "time": "2017-04-12T14:07:15+00:00" + }, + { + "name": "symfony/finder", + "version": "v2.8.20", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "16d55394b31547e4a8494551b85c9b9915545347" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/16d55394b31547e4a8494551b85c9b9915545347", + "reference": "16d55394b31547e4a8494551b85c9b9915545347", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "https://symfony.com", + "time": "2017-04-12T14:07:15+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/e79d363049d1c2128f133a2667e4f4190904f7f4", + "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "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": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "time": "2016-11-14T01:06:16+00:00" + }, + { + "name": "symfony/process", + "version": "v2.8.20", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "aff35fb3dee799c84a7313c576b72208b046ef8d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/aff35fb3dee799c84a7313c576b72208b046ef8d", + "reference": "aff35fb3dee799c84a7313c576b72208b046ef8d", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "https://symfony.com", + "time": "2017-04-12T14:07:15+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v2.8.20", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "e02577b841394a78306d7b547701bb7bb705bad5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/e02577b841394a78306d7b547701bb7bb705bad5", + "reference": "e02577b841394a78306d7b547701bb7bb705bad5", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Stopwatch Component", + "homepage": "https://symfony.com", + "time": "2017-04-12T14:07:15+00:00" + }, + { + "name": "symfony/translation", + "version": "v2.8.20", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "32b7c0bffc07772cf1a902e3464ef77117fa07c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/32b7c0bffc07772cf1a902e3464ef77117fa07c7", + "reference": "32b7c0bffc07772cf1a902e3464ef77117fa07c7", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/config": "<2.7" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~2.8", + "symfony/intl": "~2.7.25|^2.8.18|~3.2.5", + "symfony/yaml": "~2.2|~3.0.0" + }, + "suggest": { + "psr/log": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "http://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Translation Component", + "homepage": "https://symfony.com", + "time": "2017-04-12T14:07:15+00:00" + }, + { + "name": "symfony/validator", + "version": "v2.8.20", + "source": { + "type": "git", + "url": "https://github.com/symfony/validator.git", + "reference": "e125c9ec86d615231817302115a1558cd74d9aa1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/validator/zipball/e125c9ec86d615231817302115a1558cd74d9aa1", + "reference": "e125c9ec86d615231817302115a1558cd74d9aa1", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation": "~2.4|~3.0.0" + }, + "require-dev": { + "doctrine/annotations": "~1.0", + "doctrine/cache": "~1.0", + "egulias/email-validator": "^1.2.1", + "symfony/config": "~2.2|~3.0.0", + "symfony/expression-language": "~2.4|~3.0.0", + "symfony/http-foundation": "~2.3|~3.0.0", + "symfony/intl": "~2.7.25|^2.8.18|~3.2.5", + "symfony/property-access": "~2.3|~3.0.0", + "symfony/yaml": "^2.0.5|~3.0.0" + }, + "suggest": { + "doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.", + "doctrine/cache": "For using the default cached annotation reader and metadata cache.", + "egulias/email-validator": "Strict (RFC compliant) email validation", + "symfony/config": "", + "symfony/expression-language": "For using the 2.4 Expression validator", + "symfony/http-foundation": "", + "symfony/intl": "", + "symfony/property-access": "For using the 2.4 Validator API", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Validator\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Validator Component", + "homepage": "https://symfony.com", + "time": "2017-04-12T14:07:15+00:00" + }, + { + "name": "twig/twig", + "version": "v1.33.2", + "source": { + "type": "git", + "url": "https://github.com/twigphp/Twig.git", + "reference": "dd6ca96227917e1e85b41c7c3cc6507b411e0927" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/dd6ca96227917e1e85b41c7c3cc6507b411e0927", + "reference": "dd6ca96227917e1e85b41c7c3cc6507b411e0927", + "shasum": "" + }, + "require": { + "php": ">=5.2.7" + }, + "require-dev": { + "psr/container": "^1.0", + "symfony/debug": "~2.7", + "symfony/phpunit-bridge": "~3.3@dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.33-dev" + } + }, + "autoload": { + "psr-0": { + "Twig_": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" + }, + { + "name": "Twig Team", + "homepage": "http://twig.sensiolabs.org/contributors", + "role": "Contributors" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "http://twig.sensiolabs.org", + "keywords": [ + "templating" + ], + "time": "2017-04-20T17:39:48+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/webmozart/assert.git", + "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozart/assert/zipball/2db61e59ff05fe5126d152bd0655c9ea113e550f", + "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f", + "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": "2016-11-23T20:04:58+00:00" + }, + { + "name": "zendframework/zend-cache", + "version": "2.5.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-cache.git", + "reference": "5999e5a03f7dcf82abbbe67eea74da641f959684" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-cache/zipball/5999e5a03f7dcf82abbbe67eea74da641f959684", + "reference": "5999e5a03f7dcf82abbbe67eea74da641f959684", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-eventmanager": "~2.5", + "zendframework/zend-serializer": "~2.5", + "zendframework/zend-servicemanager": "~2.5", + "zendframework/zend-stdlib": "~2.5" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "zendframework/zend-session": "~2.5" + }, + "suggest": { + "ext-apc": "APC >= 3.1.6 to use the APC storage adapter", + "ext-dba": "DBA, to use the DBA storage adapter", + "ext-memcached": "Memcached >= 1.0.0 to use the Memcached storage adapter", + "ext-mongo": "Mongo, to use MongoDb storage adapter", + "ext-wincache": "WinCache, to use the WinCache storage adapter", + "mongofill/mongofill": "Alternative to ext-mongo - a pure PHP implementation designed as a drop in replacement", + "zendframework/zend-serializer": "Zend\\Serializer component", + "zendframework/zend-session": "Zend\\Session component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5-dev", + "dev-develop": "2.6-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides a generic way to cache any data", + "homepage": "https://github.com/zendframework/zend-cache", + "keywords": [ + "cache", + "zf2" + ], + "time": "2015-06-03T15:31:59+00:00" + }, + { + "name": "zendframework/zend-config", + "version": "2.5.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-config.git", + "reference": "ec49b1df1bdd9772df09dc2f612fbfc279bf4c27" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-config/zipball/ec49b1df1bdd9772df09dc2f612fbfc279bf4c27", + "reference": "ec49b1df1bdd9772df09dc2f612fbfc279bf4c27", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-stdlib": "~2.5" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "zendframework/zend-filter": "~2.5", + "zendframework/zend-i18n": "~2.5", + "zendframework/zend-json": "~2.5", + "zendframework/zend-mvc": "~2.5", + "zendframework/zend-servicemanager": "~2.5" + }, + "suggest": { + "zendframework/zend-filter": "Zend\\Filter component", + "zendframework/zend-i18n": "Zend\\I18n component", + "zendframework/zend-json": "Zend\\Json to use the Json reader or writer classes", + "zendframework/zend-servicemanager": "Zend\\ServiceManager for use with the Config Factory to retrieve reader and writer instances" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5-dev", + "dev-develop": "2.6-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Config\\": "src/" + } + }, + "notification-url": "http://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides a nested object property based user interface for accessing this configuration data within application code", + "homepage": "https://github.com/zendframework/zend-config", + "keywords": [ + "config", + "zf2" + ], + "time": "2015-06-03T15:32:00+00:00" + }, + { + "name": "zendframework/zend-eventmanager", + "version": "2.5.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-eventmanager.git", + "reference": "d94a16039144936f107f906896349900fd634443" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-eventmanager/zipball/d94a16039144936f107f906896349900fd634443", + "reference": "d94a16039144936f107f906896349900fd634443", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-stdlib": "~2.5" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5-dev", + "dev-develop": "2.6-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\EventManager\\": "src/" + } + }, + "notification-url": "http://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-eventmanager", + "keywords": [ + "eventmanager", + "zf2" + ], + "time": "2015-06-03T15:32:01+00:00" + }, + { + "name": "zendframework/zend-filter", + "version": "2.5.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-filter.git", + "reference": "93e6990a198e6cdd811064083acac4693f4b29ae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-filter/zipball/93e6990a198e6cdd811064083acac4693f4b29ae", + "reference": "93e6990a198e6cdd811064083acac4693f4b29ae", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-stdlib": "~2.5" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "zendframework/zend-config": "~2.5", + "zendframework/zend-crypt": "~2.5", + "zendframework/zend-i18n": "~2.5", + "zendframework/zend-loader": "~2.5", + "zendframework/zend-servicemanager": "~2.5", + "zendframework/zend-uri": "~2.5" + }, + "suggest": { + "zendframework/zend-crypt": "Zend\\Crypt component", + "zendframework/zend-i18n": "Zend\\I18n component", + "zendframework/zend-servicemanager": "Zend\\ServiceManager component", + "zendframework/zend-uri": "Zend\\Uri component for UriNormalize filter" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5-dev", + "dev-develop": "2.6-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Filter\\": "src/" + } + }, + "notification-url": "http://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides a set of commonly needed data filters", + "homepage": "https://github.com/zendframework/zend-filter", + "keywords": [ + "filter", + "zf2" + ], + "time": "2015-06-03T15:32:01+00:00" + }, + { + "name": "zendframework/zend-i18n", + "version": "2.5.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-i18n.git", + "reference": "509271eb7947e4aabebfc376104179cffea42696" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-i18n/zipball/509271eb7947e4aabebfc376104179cffea42696", + "reference": "509271eb7947e4aabebfc376104179cffea42696", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-stdlib": "~2.5" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "zendframework/zend-cache": "~2.5", + "zendframework/zend-config": "~2.5", + "zendframework/zend-eventmanager": "~2.5", + "zendframework/zend-filter": "~2.5", + "zendframework/zend-servicemanager": "~2.5", + "zendframework/zend-validator": "~2.5", + "zendframework/zend-view": "~2.5" + }, + "suggest": { + "ext-intl": "Required for most features of Zend\\I18n; included in default builds of PHP", + "zendframework/zend-cache": "Zend\\Cache component", + "zendframework/zend-config": "Zend\\Config component", + "zendframework/zend-eventmanager": "You should install this package to use the events in the translator", + "zendframework/zend-filter": "You should install this package to use the provided filters", + "zendframework/zend-resources": "Translation resources", + "zendframework/zend-servicemanager": "Zend\\ServiceManager component", + "zendframework/zend-validator": "You should install this package to use the provided validators", + "zendframework/zend-view": "You should install this package to use the provided view helpers" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5-dev", + "dev-develop": "2.6-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\I18n\\": "src/" + } + }, + "notification-url": "http://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-i18n", + "keywords": [ + "i18n", + "zf2" + ], + "time": "2015-06-03T15:32:01+00:00" + }, + { + "name": "zendframework/zend-json", + "version": "2.5.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-json.git", + "reference": "c74eaf17d2dd37dc1e964be8dfde05706a821ebc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-json/zipball/c74eaf17d2dd37dc1e964be8dfde05706a821ebc", + "reference": "c74eaf17d2dd37dc1e964be8dfde05706a821ebc", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-stdlib": "~2.5" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "zendframework/zend-http": "~2.5", + "zendframework/zend-server": "~2.5", + "zendframework/zendxml": "~1.0" + }, + "suggest": { + "zendframework/zend-http": "Zend\\Http component", + "zendframework/zend-server": "Zend\\Server component", + "zendframework/zendxml": "To support Zend\\Json\\Json::fromXml() usage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5-dev", + "dev-develop": "2.6-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Json\\": "src/" + } + }, + "notification-url": "http://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides convenience methods for serializing native PHP to JSON and decoding JSON to native PHP", + "homepage": "https://github.com/zendframework/zend-json", + "keywords": [ + "json", + "zf2" + ], + "time": "2015-06-03T15:32:01+00:00" + }, + { + "name": "zendframework/zend-math", + "version": "2.5.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-math.git", + "reference": "9f02a1ac4d3374d3332c80f9215deec9c71558fc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-math/zipball/9f02a1ac4d3374d3332c80f9215deec9c71558fc", + "reference": "9f02a1ac4d3374d3332c80f9215deec9c71558fc", + "shasum": "" + }, + "require": { + "php": ">=5.3.23" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "ircmaxell/random-lib": "~1.1", + "phpunit/phpunit": "~4.0", + "zendframework/zend-servicemanager": "~2.5" + }, + "suggest": { + "ext-bcmath": "If using the bcmath functionality", + "ext-gmp": "If using the gmp functionality", + "ircmaxell/random-lib": "Fallback random byte generator for Zend\\Math\\Rand if OpenSSL/Mcrypt extensions are unavailable", + "zendframework/zend-servicemanager": ">= current version, if using the BigInteger::factory functionality" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5-dev", + "dev-develop": "2.6-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Math\\": "src/" + } + }, + "notification-url": "http://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-math", + "keywords": [ + "math", + "zf2" + ], + "time": "2015-06-03T15:32:02+00:00" + }, + { + "name": "zendframework/zend-serializer", + "version": "2.5.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-serializer.git", + "reference": "b7208eb17dc4a4fb3a660b85e6c4af035eeed40c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-serializer/zipball/b7208eb17dc4a4fb3a660b85e6c4af035eeed40c", + "reference": "b7208eb17dc4a4fb3a660b85e6c4af035eeed40c", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-json": "~2.5", + "zendframework/zend-math": "~2.5", + "zendframework/zend-stdlib": "~2.5" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "zendframework/zend-servicemanager": "~2.5" + }, + "suggest": { + "zendframework/zend-servicemanager": "To support plugin manager support" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5-dev", + "dev-develop": "2.6-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Serializer\\": "src/" + } + }, + "notification-url": "http://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides an adapter based interface to simply generate storable representation of PHP types by different facilities, and recover", + "homepage": "https://github.com/zendframework/zend-serializer", + "keywords": [ + "serializer", + "zf2" + ], + "time": "2015-06-03T15:32:02+00:00" + }, + { + "name": "zendframework/zend-servicemanager", + "version": "2.5.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-servicemanager.git", + "reference": "3b22c403e351d92526c642cba0bd810bc22e1c56" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-servicemanager/zipball/3b22c403e351d92526c642cba0bd810bc22e1c56", + "reference": "3b22c403e351d92526c642cba0bd810bc22e1c56", + "shasum": "" + }, + "require": { + "php": ">=5.3.23" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "zendframework/zend-di": "~2.5", + "zendframework/zend-mvc": "~2.5" + }, + "suggest": { + "ocramius/proxy-manager": "ProxyManager 0.5.* to handle lazy initialization of services", + "zendframework/zend-di": "Zend\\Di component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5-dev", + "dev-develop": "2.6-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\ServiceManager\\": "src/" + } + }, + "notification-url": "http://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-servicemanager", + "keywords": [ + "servicemanager", + "zf2" + ], + "time": "2015-06-03T15:32:02+00:00" + }, + { + "name": "zendframework/zend-stdlib", + "version": "2.5.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-stdlib.git", + "reference": "cc8e90a60dd5d44b9730b77d07b97550091da1ae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-stdlib/zipball/cc8e90a60dd5d44b9730b77d07b97550091da1ae", + "reference": "cc8e90a60dd5d44b9730b77d07b97550091da1ae", + "shasum": "" + }, + "require": { + "php": ">=5.3.23" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "zendframework/zend-config": "~2.5", + "zendframework/zend-eventmanager": "~2.5", + "zendframework/zend-filter": "~2.5", + "zendframework/zend-inputfilter": "~2.5", + "zendframework/zend-serializer": "~2.5", + "zendframework/zend-servicemanager": "~2.5" + }, + "suggest": { + "zendframework/zend-eventmanager": "To support aggregate hydrator usage", + "zendframework/zend-filter": "To support naming strategy hydrator usage", + "zendframework/zend-serializer": "Zend\\Serializer component", + "zendframework/zend-servicemanager": "To support hydrator plugin manager usage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5-dev", + "dev-develop": "2.6-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Stdlib\\": "src/" + } + }, + "notification-url": "http://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-stdlib", + "keywords": [ + "stdlib", + "zf2" + ], + "time": "2015-06-03T15:32:03+00:00" + }, + { + "name": "zetacomponents/base", + "version": "1.9", + "source": { + "type": "git", + "url": "https://github.com/zetacomponents/Base.git", + "reference": "f20df24e8de3e48b6b69b2503f917e457281e687" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zetacomponents/Base/zipball/f20df24e8de3e48b6b69b2503f917e457281e687", + "reference": "f20df24e8de3e48b6b69b2503f917e457281e687", + "shasum": "" + }, + "require-dev": { + "zetacomponents/unit-test": "*" + }, + "type": "library", + "autoload": { + "classmap": [ + "src" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Sergey Alexeev" + }, + { + "name": "Sebastian Bergmann" + }, + { + "name": "Jan Borsodi" + }, + { + "name": "Raymond Bosman" + }, + { + "name": "Frederik Holljen" + }, + { + "name": "Kore Nordmann" + }, + { + "name": "Derick Rethans" + }, + { + "name": "Vadym Savchuk" + }, + { + "name": "Tobias Schlitt" + }, + { + "name": "Alexandru Stanoi" + } + ], + "description": "The Base package provides the basic infrastructure that all packages rely on. Therefore every component relies on this package.", + "homepage": "https://github.com/zetacomponents", + "time": "2014-09-19T03:28:34+00:00" + }, + { + "name": "zetacomponents/document", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/zetacomponents/Document.git", + "reference": "688abfde573cf3fe0730f82538fbd7aa9fc95bc8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zetacomponents/Document/zipball/688abfde573cf3fe0730f82538fbd7aa9fc95bc8", + "reference": "688abfde573cf3fe0730f82538fbd7aa9fc95bc8", + "shasum": "" + }, + "require": { + "zetacomponents/base": "*" + }, + "require-dev": { + "zetacomponents/unit-test": "dev-master" + }, + "type": "library", + "autoload": { + "classmap": [ + "src" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Sebastian Bergmann" + }, + { + "name": "Kore Nordmann" + }, + { + "name": "Derick Rethans" + }, + { + "name": "Tobias Schlitt" + }, + { + "name": "Alexandru Stanoi" + } + ], + "description": "The Document components provides a general conversion framework for different semantic document markup languages like XHTML, Docbook, RST and similar.", + "homepage": "https://github.com/zetacomponents", + "time": "2013-12-19T11:40:00+00:00" + } + ], + "packages-dev": [ + { + "name": "behat/behat", + "version": "v3.3.1", + "source": { + "type": "git", + "url": "https://github.com/Behat/Behat.git", + "reference": "44a58c1480d6144b2dc2c2bf02b9cef73c83840d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Behat/Behat/zipball/44a58c1480d6144b2dc2c2bf02b9cef73c83840d", + "reference": "44a58c1480d6144b2dc2c2bf02b9cef73c83840d", + "shasum": "" + }, + "require": { + "behat/gherkin": "^4.4.4", + "behat/transliterator": "^1.2", + "container-interop/container-interop": "^1.1", + "ext-mbstring": "*", + "php": ">=5.3.3", + "symfony/class-loader": "~2.1||~3.0", + "symfony/config": "~2.3||~3.0", + "symfony/console": "~2.5||~3.0", + "symfony/dependency-injection": "~2.1||~3.0", + "symfony/event-dispatcher": "~2.1||~3.0", + "symfony/translation": "~2.3||~3.0", + "symfony/yaml": "~2.1||~3.0" + }, + "require-dev": { + "herrera-io/box": "~1.6.1", + "phpunit/phpunit": "~4.5", + "symfony/process": "~2.5|~3.0" + }, + "suggest": { + "behat/mink-extension": "for integration with Mink testing framework", + "behat/symfony2-extension": "for integration with Symfony2 web framework", + "behat/yii-extension": "for integration with Yii web framework" + }, + "bin": [ + "bin/behat" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2.x-dev" + } + }, + "autoload": { + "psr-0": { + "Behat\\Behat": "src/", + "Behat\\Testwork": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + } + ], + "description": "Scenario-oriented BDD framework for PHP 5.3", + "homepage": "http://behat.org/", + "keywords": [ + "Agile", + "BDD", + "ScenarioBDD", + "Scrum", + "StoryBDD", + "User story", + "business", + "development", + "documentation", + "examples", + "symfony", + "testing" + ], + "time": "2017-05-15T16:49:16+00:00" + }, + { + "name": "behat/gherkin", + "version": "v4.4.5", + "source": { + "type": "git", + "url": "https://github.com/Behat/Gherkin.git", + "reference": "5c14cff4f955b17d20d088dec1bde61c0539ec74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Behat/Gherkin/zipball/5c14cff4f955b17d20d088dec1bde61c0539ec74", + "reference": "5c14cff4f955b17d20d088dec1bde61c0539ec74", + "shasum": "" + }, + "require": { + "php": ">=5.3.1" + }, + "require-dev": { + "phpunit/phpunit": "~4.5|~5", + "symfony/phpunit-bridge": "~2.7|~3", + "symfony/yaml": "~2.3|~3" + }, + "suggest": { + "symfony/yaml": "If you want to parse features, represented in YAML files" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-0": { + "Behat\\Gherkin": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + } + ], + "description": "Gherkin DSL parser for PHP 5.3", + "homepage": "http://behat.org/", + "keywords": [ + "BDD", + "Behat", + "Cucumber", + "DSL", + "gherkin", + "parser" + ], + "time": "2016-10-30T11:50:56+00:00" + }, + { + "name": "behat/transliterator", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/Behat/Transliterator.git", + "reference": "826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Behat/Transliterator/zipball/826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c", + "reference": "826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "chuyskywalker/rolling-curl": "^3.1", + "php-yaoi/php-yaoi": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "psr-0": { + "Behat\\Transliterator": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Artistic-1.0" + ], + "description": "String transliterator", + "keywords": [ + "i18n", + "slug", + "transliterator" + ], + "time": "2017-04-04T11:38:05+00:00" + }, + { + "name": "container-interop/container-interop", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/container-interop/container-interop.git", + "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/container-interop/container-interop/zipball/79cbf1341c22ec75643d841642dd5d6acd83bdb8", + "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8", + "shasum": "" + }, + "require": { + "psr/container": "^1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Interop\\Container\\": "src/Interop/Container/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Promoting the interoperability of container objects (DIC, SL, etc.)", + "homepage": "https://github.com/container-interop/container-interop", + "abandoned": "psr/container", + "time": "2017-02-14T19:40:03+00:00" + }, + { + "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": "hamcrest/hamcrest-php", + "version": "v1.2.2", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "b37020aa976fa52d3de9aa904aa2522dc518f79c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/b37020aa976fa52d3de9aa904aa2522dc518f79c", + "reference": "b37020aa976fa52d3de9aa904aa2522dc518f79c", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "1.3.3", + "satooshi/php-coveralls": "dev-master" + }, + "type": "library", + "autoload": { + "classmap": [ + "hamcrest" + ], + "files": [ + "hamcrest/Hamcrest.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "time": "2015-05-11T14:41:42+00:00" + }, + { + "name": "mikey179/vfsstream", + "version": "v1.6.8", + "source": { + "type": "git", + "url": "https://github.com/bovigo/vfsStream.git", + "reference": "231c73783ebb7dd9ec77916c10037eff5a2b6efe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bovigo/vfsStream/zipball/231c73783ebb7dd9ec77916c10037eff5a2b6efe", + "reference": "231c73783ebb7dd9ec77916c10037eff5a2b6efe", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.5|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6.x-dev" + } + }, + "autoload": { + "psr-0": { + "org\\bovigo\\vfs\\": "src/main/php" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Frank Kleine", + "homepage": "http://frankkleine.de/", + "role": "Developer" + } + ], + "description": "Virtual file system to mock the real file system in unit tests.", + "homepage": "http://vfs.bovigo.org/", + "time": "2019-10-30T15:31:00+00:00" + }, + { + "name": "mockery/mockery", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/padraic/mockery.git", + "reference": "2448c5b27f40d11db1f7bcee5a1188fef8ae490a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/padraic/mockery/zipball/2448c5b27f40d11db1f7bcee5a1188fef8ae490a", + "reference": "2448c5b27f40d11db1f7bcee5a1188fef8ae490a", + "shasum": "" + }, + "require": { + "lib-pcre": ">=7.0", + "php": ">=5.3.2" + }, + "require-dev": { + "hamcrest/hamcrest-php": "~1.1", + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.9.x-dev" + } + }, + "autoload": { + "psr-0": { + "Mockery": "library/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "http://blog.astrumfutura.com" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "http://davedevelopment.co.uk" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework for use in unit testing with PHPUnit, PHPSpec or any other testing framework. Its core goal is to offer a test double framework with a succinct API capable of clearly defining all possible object operations and interactions using a human readable Domain Specific Language (DSL). Designed as a drop in alternative to PHPUnit's phpunit-mock-objects library, Mockery is easy to integrate with PHPUnit and can operate alongside phpunit-mock-objects without the World ending.", + "homepage": "http://github.com/padraic/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "time": "2015-02-20T22:10:40+00:00" + }, + { + "name": "phpspec/prophecy", + "version": "v1.7.0", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "93d39f1f7f9326d746203c7c056f300f7f126073" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/93d39f1f7f9326d746203c7c056f300f7f126073", + "reference": "93d39f1f7f9326d746203c7c056f300f7f126073", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": "^5.3|^7.0", + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2", + "sebastian/comparator": "^1.1|^2.0", + "sebastian/recursion-context": "^1.0|^2.0|^3.0" + }, + "require-dev": { + "phpspec/phpspec": "^2.5|^3.2", + "phpunit/phpunit": "^4.8 || ^5.6.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6.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": "2017-03-02T20:05:34+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "2.2.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979", + "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "phpunit/php-file-iterator": "~1.3", + "phpunit/php-text-template": "~1.2", + "phpunit/php-token-stream": "~1.3", + "sebastian/environment": "^1.3.2", + "sebastian/version": "~1.0" + }, + "require-dev": { + "ext-xdebug": ">=2.1.4", + "phpunit/phpunit": "~4" + }, + "suggest": { + "ext-dom": "*", + "ext-xdebug": ">=2.2.1", + "ext-xmlwriter": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.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": "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": "2015-10-06T15:47:00+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "1.4.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3cc8f69b3028d0f96a9078e6295d86e9bf019be5", + "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5", + "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": "2016-10-03T07:40:28+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": "1.4.11", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/e03f8f67534427a787e21a385a67ec3ca6978ea7", + "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-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-02-27T10:12:30+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "4.8.35", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "791b1a67c25af50e230f841ee7a9c6eba507dc87" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/791b1a67c25af50e230f841ee7a9c6eba507dc87", + "reference": "791b1a67c25af50e230f841ee7a9c6eba507dc87", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "php": ">=5.3.3", + "phpspec/prophecy": "^1.3.1", + "phpunit/php-code-coverage": "~2.1", + "phpunit/php-file-iterator": "~1.4", + "phpunit/php-text-template": "~1.2", + "phpunit/php-timer": "^1.0.6", + "phpunit/phpunit-mock-objects": "~2.3", + "sebastian/comparator": "~1.2.2", + "sebastian/diff": "~1.2", + "sebastian/environment": "~1.3", + "sebastian/exporter": "~1.2", + "sebastian/global-state": "~1.0", + "sebastian/version": "~1.0", + "symfony/yaml": "~2.1|~3.0" + }, + "suggest": { + "phpunit/php-invoker": "~1.1" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.8.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": "2017-02-06T05:18:07+00:00" + }, + { + "name": "phpunit/phpunit-mock-objects", + "version": "2.3.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", + "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983", + "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": ">=5.3.3", + "phpunit/php-text-template": "~1.2", + "sebastian/exporter": "~1.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "suggest": { + "ext-soap": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3.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": "Mock Object library for PHPUnit", + "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", + "keywords": [ + "mock", + "xunit" + ], + "abandoned": true, + "time": "2015-10-02T06:51:40+00:00" + }, + { + "name": "psr/container", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "time": "2017-02-14T16:28:37+00:00" + }, + { + "name": "sebastian/comparator", + "version": "1.2.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", + "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/diff": "~1.2", + "sebastian/exporter": "~1.2 || ~2.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.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": "http://www.github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "time": "2017-01-29T09:50:25+00:00" + }, + { + "name": "sebastian/diff", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e", + "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-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": "2015-12-08T07:14:41+00:00" + }, + { + "name": "sebastian/environment", + "version": "1.3.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/be2c607e43ce4c89ecd60e75c6a85c126e754aea", + "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8 || ^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.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": "2016-08-18T05:49:44+00:00" + }, + { + "name": "sebastian/exporter", + "version": "1.2.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4", + "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/recursion-context": "~1.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.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": "2016-06-17T09:04:28+00:00" + }, + { + "name": "sebastian/global-state", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", + "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "suggest": { + "ext-uopz": "*" + }, + "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": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "time": "2015-10-12T03:26:01+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "b19cc3298482a335a95f3016d2f8a6950f0fbcd7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/b19cc3298482a335a95f3016d2f8a6950f0fbcd7", + "reference": "b19cc3298482a335a95f3016d2f8a6950f0fbcd7", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "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": "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": "2016-10-03T07:41:43+00:00" + }, + { + "name": "sebastian/version", + "version": "1.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", + "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", + "shasum": "" + }, + "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": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "time": "2015-06-21T13:59:46+00:00" + }, + { + "name": "squizlabs/php_codesniffer", + "version": "1.5.6", + "source": { + "type": "git", + "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", + "reference": "6f3e42d311b882b25b4d409d23a289f4d3b803d5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/6f3e42d311b882b25b4d409d23a289f4d3b803d5", + "reference": "6f3e42d311b882b25b4d409d23a289f4d3b803d5", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.1.2" + }, + "suggest": { + "phpunit/php-timer": "dev-master" + }, + "bin": [ + "scripts/phpcs" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-phpcs-fixer": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "CodeSniffer.php", + "CodeSniffer/CLI.php", + "CodeSniffer/Exception.php", + "CodeSniffer/File.php", + "CodeSniffer/Report.php", + "CodeSniffer/Reporting.php", + "CodeSniffer/Sniff.php", + "CodeSniffer/Tokens.php", + "CodeSniffer/Reports/", + "CodeSniffer/CommentParser/", + "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 tokenises 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": "2014-12-04T22:32:15+00:00" + }, + { + "name": "symfony/class-loader", + "version": "v2.8.20", + "source": { + "type": "git", + "url": "https://github.com/symfony/class-loader.git", + "reference": "6789dc86c94c5686d90aa416ef63eb911e73fd26" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/class-loader/zipball/6789dc86c94c5686d90aa416ef63eb911e73fd26", + "reference": "6789dc86c94c5686d90aa416ef63eb911e73fd26", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "symfony/polyfill-apcu": "~1.1" + }, + "require-dev": { + "symfony/finder": "^2.0.5|~3.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\ClassLoader\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "http://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony ClassLoader Component", + "homepage": "https://symfony.com", + "time": "2017-04-12T14:07:15+00:00" + }, + { + "name": "symfony/dependency-injection", + "version": "v2.8.20", + "source": { + "type": "git", + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "e1c722dfe4dd04453aeb6b7a6deefb400c878394" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/e1c722dfe4dd04453aeb6b7a6deefb400c878394", + "reference": "e1c722dfe4dd04453aeb6b7a6deefb400c878394", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "conflict": { + "symfony/expression-language": "<2.6" + }, + "require-dev": { + "symfony/config": "~2.2|~3.0.0", + "symfony/expression-language": "~2.6|~3.0.0", + "symfony/yaml": "~2.3.42|~2.7.14|~2.8.7|~3.0.7" + }, + "suggest": { + "symfony/config": "", + "symfony/expression-language": "For using expressions in service container configuration", + "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\DependencyInjection\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "http://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony DependencyInjection Component", + "homepage": "https://symfony.com", + "time": "2017-04-26T01:38:53+00:00" + }, + { + "name": "symfony/expression-language", + "version": "v2.8.20", + "source": { + "type": "git", + "url": "https://github.com/symfony/expression-language.git", + "reference": "3de003c1d37ab8a8432ccd112d52228bf0fce134" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/3de003c1d37ab8a8432ccd112d52228bf0fce134", + "reference": "3de003c1d37ab8a8432ccd112d52228bf0fce134", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\ExpressionLanguage\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony ExpressionLanguage Component", + "homepage": "https://symfony.com", + "time": "2017-05-01T14:31:55+00:00" + }, + { + "name": "symfony/polyfill-apcu", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-apcu.git", + "reference": "5d4474f447403c3348e37b70acc2b95475b7befa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-apcu/zipball/5d4474f447403c3348e37b70acc2b95475b7befa", + "reference": "5d4474f447403c3348e37b70acc2b95475b7befa", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "http://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting apcu_* functions to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "apcu", + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2016-11-14T01:06:16+00:00" + }, + { + "name": "symfony/yaml", + "version": "v2.8.20", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "93ccdde79f4b079c7558da4656a3cb1c50c68e02" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/93ccdde79f4b079c7558da4656a3cb1c50c68e02", + "reference": "93ccdde79f4b079c7558da4656a3cb1c50c68e02", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "http://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "https://symfony.com", + "time": "2017-05-01T14:31:55+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": { + "mockery/mockery": 20 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=5.3.3" + }, + "platform-dev": [] +} diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/.placeholder b/vendor/phpdocumentor/phpdocumentor/data/templates/.placeholder new file mode 100644 index 0000000000..e69de29bb2 diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/README b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/README new file mode 100644 index 0000000000..e69de29bb2 diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/api-doc.xsl b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/api-doc.xsl new file mode 100644 index 0000000000..b342f2389e --- /dev/null +++ b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/api-doc.xsl @@ -0,0 +1,26 @@ + + + + + + + + + + + + + +
+ +
+ + + Documentation was generated by + phpDocumentor + + . + +
+ +
\ No newline at end of file diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/api-doc/class.xsl b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/api-doc/class.xsl new file mode 100644 index 0000000000..17140d5700 --- /dev/null +++ b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/api-doc/class.xsl @@ -0,0 +1,161 @@ + + + + + + + n/a + + + + + + ? + + + + + + + + + + + + + + color: gray; font-size: 0.8em + + + + + + + + < + + + + + + + + < + + + + + + + +

+ + +

+ +
+
+ + final + + + + abstract + +
+ Package: + + + + + +
+ + +
Implements
+ +
+ + + + + + + + +
+
+
+ + +
Parent(s)
+
+ + + + + + + + + + +
+
+ + + + +
Children
+ +
+ + + +
+
+
+ + + + + +
+ + + + +

Constants

+
+ +
+
+ + +

Properties

+
+ + + +
+
+ + +

Methods

+
+ + + +
+
+
+ +
+ +
diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/api-doc/constant.xsl b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/api-doc/constant.xsl new file mode 100644 index 0000000000..d9c32e9df6 --- /dev/null +++ b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/api-doc/constant.xsl @@ -0,0 +1,58 @@ + + + + + + + +
+ + + inherited_from + + + + > + V + + + + Constant +   + + + + = + + +
+ + inherited + + + + + Inherited from: + + + +
+ +
+ + + +
+ + + +
+
+
+
+
+
+ +
\ No newline at end of file diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/api-doc/docblock.xsl b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/api-doc/docblock.xsl new file mode 100644 index 0000000000..b260e74cd1 --- /dev/null +++ b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/api-doc/docblock.xsl @@ -0,0 +1,226 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Doctrine + + + + + + + + + + + odd + even + + + + + + + + + + + + + + + + + + + + +
AnnotationField nameValue
+ +
+ + + + + +
+
+
+ + + +
+ +
+
+ + +
+ +
+
+ + +
+ + + +
+
+ + + + + + files/ + + + + + + + + + + +   +
+
+ + + + + +
+ + + + + + +
+
+ +
+
+ +
+
+ + + void + + + + + + + + + + + + + + + + + + + + + + + + n/a + + + + + + + + void + + + + + + + n/a + + + + + + + + + n/a + + + + + + + + + + + + +
diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/api-doc/file.xsl b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/api-doc/file.xsl new file mode 100644 index 0000000000..cbfadc14ff --- /dev/null +++ b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/api-doc/file.xsl @@ -0,0 +1,129 @@ + + + + + +

+ + + View Source + +

+ +
+
+ Show: + Public + Protected + Private + inherited +
+ +
+ +
+
+ +
+ Table of Contents +
+
+ + + +
+ + +
+
+ + +
+ + + +
+
+ + +
+

Constants

+
+ +
+ + + +
+

Functions

+
+ + + +
+ + + +
+ + + + + + + + + + + + +
+ +
\ No newline at end of file diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/api-doc/function.xsl b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/api-doc/function.xsl new file mode 100644 index 0000000000..cd4e80eec2 --- /dev/null +++ b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/api-doc/function.xsl @@ -0,0 +1,158 @@ + + + + + +

+ {@visibility} + + +

+ + + +

+ {@visibility} + + +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + + inherited_from + + + + + + + + {name()}{@visibility} + (,   = ) : void + + +
+ + static + + + + final + + + + abstract + + + + inherited + + +

+ +

+ + + Inherited from: + + + + + + + + + +
+ +
+ + + + Parameters + + + + + + + + + +
NameTypeDescription
+
+ + + Returns + + + + + + + + +
TypeDescription
+ + + +
+
+ + + Throws + + + + + + + + +
ExceptionDescription
+
+ + + + + Details +
+ + + +
+
+
+
+
+ +
+ + \ No newline at end of file diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/api-doc/property.xsl b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/api-doc/property.xsl new file mode 100644 index 0000000000..7e3ca76b5f --- /dev/null +++ b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/api-doc/property.xsl @@ -0,0 +1,78 @@ + + + + + + +
+ + + inherited_from + magic + + + + > + V + + + + Property + {@visibility}  = + + +
+ + static + + + + final + + + + inherited + + + + + Inherited from: + + + +
+ +
+ + + + Default value + + + + + + Details +
+
Type
+
+ n/a + + + + + +
+ + + +
+
+
+
+
+ +
\ No newline at end of file diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/chrome.xsl b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/chrome.xsl new file mode 100644 index 0000000000..6e891ef53b --- /dev/null +++ b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/chrome.xsl @@ -0,0 +1,33 @@ + + + + + + + + + + + + + phpDocumentor Documentation + + + + + + + + + + + <xsl:call-template name="title" /> + + + + + + + + + \ No newline at end of file diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/chrome/footer.xsl b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/chrome/footer.xsl new file mode 100644 index 0000000000..b984c40e67 --- /dev/null +++ b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/chrome/footer.xsl @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/chrome/head.xsl b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/chrome/head.xsl new file mode 100644 index 0000000000..9975d69937 --- /dev/null +++ b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/chrome/head.xsl @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/chrome/header.xsl b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/chrome/header.xsl new file mode 100644 index 0000000000..cac615aa11 --- /dev/null +++ b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/chrome/header.xsl @@ -0,0 +1,16 @@ + + + + + +

+ + + + + + +

+
+ +
\ No newline at end of file diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/chrome/menu.xsl b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/chrome/menu.xsl new file mode 100644 index 0000000000..9eb9a9d092 --- /dev/null +++ b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/chrome/menu.xsl @@ -0,0 +1,14 @@ + + + + + + + +
    + + +
+
+ +
\ No newline at end of file diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/content.xsl b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/content.xsl new file mode 100644 index 0000000000..dd39a44788 --- /dev/null +++ b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/content.xsl @@ -0,0 +1,14 @@ + + + + + + + +
+

Welcome!

+ This documentation was generated by phpDocumentor . +
+
+ +
diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/css/abstract.css b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/css/abstract.css new file mode 100644 index 0000000000..a03b78946a --- /dev/null +++ b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/css/abstract.css @@ -0,0 +1,202 @@ +@import url('sen.full.min.css'); + +html, body, #page { + height: 99.9%; + width: 100%; +} + +#frameset { + overflow:hidden; +} + +body { + /*font: 80% / 1.5em Arial, Helvetica, "DejaVu Sans", "Liberation sans", "Bitstream Vera Sans", sans-serif*/ +} + +#sidebar { + width: 200px; +} + +h2 { + margin-top: 25px; +} + +h3 { + margin: 0 0 0 0.2em; +} + +#sidebar ul { + list-style: none; + padding: 0px; + margin: 0 0 1.5em 0em; +} + +#sidebar ul ul { + margin: 0 0 0 0.6em; +} + +#sidebar, #contents { + height:100%; +} + +#sidebar iframe, #contents iframe { + height: 100%; + width: 100%; + border: none; +} + +div.success_notification { + margin: 5px; + padding: 5px; + padding-left: 35px; + background: #f9f9f9 url('../images/icons/ok.png') no-repeat 5px center; + border: 1px solid silver; +} + +#marker-accordion h3 small { + float: right; + padding: 2px 5px; + margin-right: 20px; +} + +span.attribute { + padding: 2px 6px; + background: #F0F0F0; + display: inline-block; + border-radius: 3px; + margin: 0px 4px; + font-weight: bold; + color: gray; + border: 1px solid silver; + font-size: 0.9em; +} + +.description small.inherited_from { + display: none; +} + +.to-top { + float: right; + margin-right: 20px; + font-size: 0.6em; +} + +#marker-accordion h3 { + margin-top: 20px; +} + +#marker-accordion h3 a { + text-decoration: none; + cursor: text; +} + +#marker-accordion h3 small { + float: right; + cursor: text; + background: #F0F0F0; + border: 1px solid silver; + font-weight: normal; + border-radius: 3px; +} + +.code-tabs code { + display: block; + padding: 10px; +} + +#file-nav-tab { + display: none; +} + +#file-nav-options { + text-align: right; +} + +#file-nav-box { + position: fixed; + top: 10px; + right: 10px; +} + +#file-nav-container { + overflow: auto; + max-height: 400px; + background: #f5f5f5; + padding: 5px; + border: 1px solid silver; + border-radius: 3px; +} + +ul#file-nav { + margin: 0px; + list-style: none; +} + +ul#file-nav ul { + list-style: none; +} + +.gripper { + display: none; +} + +div.property, div.method, div.function, div.constant { + border: 1px solid silver; + margin-top: 10px; + padding: 5px; +} + +div.class { + border-left: 1px solid #e0e0ff; + padding-left: 15px; +} + +code.title { + font-size: 0.97em; + font-weight: bold; + color: gray; + background: #F9F9F9; + padding: 3px; + display: block; + border-bottom: 1px solid #F0F0F0; + margin-bottom: 3px; +} + +span.highlight { + color: #504CC9; +} + +code.title img { + padding-right: 5px; +} + +#content table { + font-size: 0.9em; + border: 1px solid #f0f0f0; + margin: 5px; +} + +#content tr { + border-bottom: 1px solid #f0f0f0; +} + +#content th { + background: #f9f9f9; + min-width: 100px; + text-align: left; +} + +div.sidebar-section ul span { + background: transparent no-repeat top left; + padding-left: 20px; +} + +div.sidebar-section ul span.method { background-image: url('../images/icons/method.png'); } +div.sidebar-section ul span.function { background-image: url('../images/icons/function.png'); } +div.sidebar-section ul span.class { background-image: url('../images/icons/class.png'); } +div.sidebar-section ul span.interface { background-image: url('../images/icons/interface.png'); } +div.sidebar-section ul span.constant { background-image: url('../images/icons/constant.png'); } +div.sidebar-section ul span.property { background-image: url('../images/icons/property.png'); } +div.sidebar-section ul span.package { background-image: url('../images/icons/folder.gif'); } +div.sidebar-section ul span.namespace { background-image: url('../images/icons/namespace.png'); } +div.sidebar-section ul span.file { background-image: url('../images/icons/file.gif'); } diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/css/sen.full.min.css b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/css/sen.full.min.css new file mode 100644 index 0000000000..21a520f38b --- /dev/null +++ b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/css/sen.full.min.css @@ -0,0 +1,81 @@ +@charset utf-8; +/** + * SenCSS - Sensible Standards CSS framework + * + * Copyright (c) 2008-2009 Kilian Valkhof (kilianvalkhof.com) + * Visit sencss.kilianvalkhof.com for more information and changelogs. + * Licensed under the MIT license. http://www.opensource.org/licenses/mit-license.php + * + */ +html,body,div,span,object,iframe,blockquote,pre,abbr,address,cite,code,del,dfn,em,img,ins,kbd,q,samp,small,strong,var,fieldset,form,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,dialog,figure,footer,header,hgroup,menu,nav,section,time,mark,audio,video{vertical-align:baseline;margin:0;padding:0} +article,aside,dialog,figure,footer,header,hgroup,menu,nav,section,time,mark,audio,video {display:block} +body{background:#fff;color:#000;font:75%/1.5em Arial, Helvetica, "DejaVu Sans", "Liberation sans", "Bitstream Vera Sans", sans-serif;position:relative} +textarea{font:101%/1.5em Arial, Helvetica, "DejaVu Sans", "Liberation sans", "Bitstream Vera Sans", sans-serif;border:1px solid #ccc;border-bottom-color:#eee;border-right-color:#eee;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;-ms-box-sizing:border-box;width:100%;margin:0;padding:.29em 0} +blockquote,q{quotes:none} +blockquote:before,blockquote:after,q:before,q:after{content:none} +:focus{outline:none} +a{text-decoration:underline;border:0} +a:hover,a:focus{text-decoration:none} +a img{border:0} +abbr,acronym{border-bottom:1px dotted;cursor:help;font-variant:small-caps} +address,cite,em,i{font-style:italic} +blockquote p{margin:0 1.5em 1.5em;padding:.75em} +code,kbd,tt{font-family:"Courier New", Courier, monospace, serif;line-height:1.5} +del{text-decoration:line-through} +dfn{border-bottom:1px dashed;font-style:italic} +dl{margin:0 0 1.5em} +dd{margin-left:1.5em} +h1,h2,h3,h4,h5,h6{font-weight:700;padding:0} +h1{font-size:2em;margin:0 0 .75em} +h2{font-size:1.5em;margin:0 0 1em} +h3{font-size:1.1666em;margin:0 0 1.286em} +h4{font-size:1em;margin:0 0 1.5em} +h5{font-size:.8333em;margin:0 0 1.8em} +h6{font-size:.666em;margin:0 0 2.25em} +img{display:inline-block;vertical-align:text-bottom} +ins{text-decoration:overline} +mark{background-color:#ff9;color:#000;font-style:italic;font-weight:700} +ol{list-style:outside decimal} +p{font-weight:300;margin:0 0 1.5em} +pre{font-family:"Courier New", Courier, monospace, serif;margin:0 0 1.5em} +sub{top:.4em;font-size:.85em;line-height:1;position:relative;vertical-align:baseline} +sup{font-size:.85em;line-height:1;position:relative;bottom:.5em;vertical-align:baseline} +ul{list-style:outside disc} +ul,ol{margin:0 0 1.5em 1.5em;padding:0} +li ul,li ol{margin:0 0 1.5em 1.5em;padding:0} +table{border-collapse:collapse;border-spacing:0;margin:0 0 1.5em;padding:0} +caption{font-style:italic;text-align:left} +tr.alt td{background:#eee} +td{vertical-align:top;padding:.333em} +th{font-weight:700;vertical-align:middle;padding:.333em} +button{cursor:pointer;display:block;font-size:1em;height:2em;line-height:1.5em;margin:1.75em 0 0;padding:0 .5em} +button::-moz-focus-inner{border:0} +fieldset{border:0;position:relative;margin:0 0 1.5em;padding:1.5em 0 0} +fieldset fieldset{clear:both;margin:0 0 1.5em;padding:0 0 0 1.5em} +input{border:1px solid #ccc;border-bottom-color:#eee;border-right-color:#eee;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;-ms-box-sizing:border-box;font-size:1em;height:1.5em;line-height:1.5em;width:100%;margin:0 0 .75em;padding:.29em 0} +input[type=file]{height:2.25em;padding:0} +select{border:1px solid #ccc;border-bottom-color:#eee;border-right-color:#eee;font-size:1em;height:2.25em;_margin:0 0 1.3em;margin:0 0 .8em;padding:.2em 0 0} +optgroup{font-weight:700;font-style:normal;text-indent:.2em} +optgroup + optgroup{margin-top:1em} +option{font-size:1em;height:1.5em;text-indent:1em;padding:0} +label{cursor:pointer;display:block;height:auto;line-height:1.4em;width:100%;margin:0;padding:0} +label input{background:0;border:0;height:1.5em;line-height:1.5em;width:auto;margin:0 .5em 0 0;padding:0} +legend{font-size:1.1666em;font-weight:700;left:0;margin:0;padding:0} +dt,strong,b{font-weight:700} +.amp{font-family:Baskerville, "Goudy Old Style", Palatino, "Book Antiqua", "URW Chancery L", Gentium, serif;font-style:italic} +.quo{font-family:Georgia, Gentium, "Times New Roman", Times, serif} +.lquo{font-family:Georgia, Gentium, "Times New Roman", Times, serif;margin:0 0 0 -.55em} +.introParagraphArticle:first-letter{float:left;font-size:3.2em;font-weight:700;line-height:1em;margin:0 0 -.2em;padding:.125em .1em 0 0} +.message{background:#eee;border:1px solid #999;margin:1.5em;padding:.666em} +.error{background:#fee;border:1px solid red;margin:1.5em;padding:.666em} +.notice{background:#eef;border:1px solid #00f;margin:1.5em;padding:.666em} +.success{background:#efe;border:1px solid #0f0;margin:1.5em;padding:.666em} +.warning{background:#ffe;border:1px solid #ff0;margin:1.5em;padding:.666em} +.aside-left{clear:left;float:left;overflow:hidden;margin:0 1.5em 1.5em 0} +.aside-right{clear:right;float:right;overflow:hidden;margin:0 0 1.5em 1.5em} +.horizontalForm button{clear:left;float:left;margin:.25em 0 0} +.horizontalForm input,.horizontalForm textarea{float:left;width:49%;margin:0 0 .8em} +.horizontalForm select{float:left;_margin:0 0 1.25em;margin:0 0 .75em} +.horizontalForm label{clear:left;float:left;width:49%;padding:.375em 0} +.horizontalForm label input{height:1em;line-height:1.5em;width:auto;margin:.25em .5em 0 0} +.horizontalForm label.singleLine{clear:both;float:none;height:1.5em;width:100%;padding:0} \ No newline at end of file diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/css/template.css b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/css/template.css new file mode 100644 index 0000000000..c5bd77efff --- /dev/null +++ b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/css/template.css @@ -0,0 +1,31 @@ +@import url('abstract.css'); + +a { + color: #504cc9; +} + +sidebar-logo { + vertical-align: bottom; +} + +#db-header { + padding-bottom: 0px; +} + +#db-header h1 { + margin-bottom: 0px; +} + +td#db-menu { + font-size: 0.8em; + border-bottom: 1px solid silver; +} + +td#db-menu ul { + display: block; +} + +td#db-menu li { + float: right; + padding-right: 10px; +} diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/graph_class.xsl b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/graph_class.xsl new file mode 100644 index 0000000000..87e154fbd6 --- /dev/null +++ b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/graph_class.xsl @@ -0,0 +1,47 @@ + + + + + + + + + +
+
+ The following actions are supported in this diagram: +
    +
  • + Zoom, you can use the scrollwheel, or double-click, + to zoom in or out +
  • +
  • + Move, you can move around by dragging + the Diagram +
  • +
+
+ +
+
+
+ +
\ No newline at end of file diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/helpers.xsl b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/helpers.xsl new file mode 100644 index 0000000000..18a2a9bbda --- /dev/null +++ b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/helpers.xsl @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/collapse_all.png b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/collapse_all.png new file mode 100644 index 0000000000..1787a7ff48 Binary files /dev/null and b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/collapse_all.png differ diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/expand_all.png b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/expand_all.png new file mode 100644 index 0000000000..6bad6bbacb Binary files /dev/null and b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/expand_all.png differ diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/arrow_down.png b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/arrow_down.png new file mode 100644 index 0000000000..61505adc46 Binary files /dev/null and b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/arrow_down.png differ diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/arrow_right.png b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/arrow_right.png new file mode 100644 index 0000000000..60c5927ebf Binary files /dev/null and b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/arrow_right.png differ diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/class.png b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/class.png new file mode 100644 index 0000000000..0f0d94e0a4 Binary files /dev/null and b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/class.png differ diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/constant.png b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/constant.png new file mode 100644 index 0000000000..76e2242459 Binary files /dev/null and b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/constant.png differ diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/favicon.ico b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/favicon.ico new file mode 100644 index 0000000000..df28db3d6a Binary files /dev/null and b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/favicon.ico differ diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/file-php.png b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/file-php.png new file mode 100644 index 0000000000..c323f09f66 Binary files /dev/null and b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/file-php.png differ diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/file.gif b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/file.gif new file mode 100644 index 0000000000..7e6216798f Binary files /dev/null and b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/file.gif differ diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/folder.gif b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/folder.gif new file mode 100644 index 0000000000..2b31631ca2 Binary files /dev/null and b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/folder.gif differ diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/function.png b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/function.png new file mode 100644 index 0000000000..5dea687050 Binary files /dev/null and b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/function.png differ diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/interface.png b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/interface.png new file mode 100644 index 0000000000..d6383c00ca Binary files /dev/null and b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/interface.png differ diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/method.png b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/method.png new file mode 100644 index 0000000000..946d0ff494 Binary files /dev/null and b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/method.png differ diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/namespace.png b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/namespace.png new file mode 100644 index 0000000000..1974b002a0 Binary files /dev/null and b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/namespace.png differ diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/ok.png b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/ok.png new file mode 100644 index 0000000000..39f287ab19 Binary files /dev/null and b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/ok.png differ diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/property.png b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/property.png new file mode 100644 index 0000000000..0671c391ed Binary files /dev/null and b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/property.png differ diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/search.gif b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/search.gif new file mode 100644 index 0000000000..eef46fc9ee Binary files /dev/null and b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/search.gif differ diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/variable.png b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/variable.png new file mode 100644 index 0000000000..a39bc19d82 Binary files /dev/null and b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/variable.png differ diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/view_source.png b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/view_source.png new file mode 100644 index 0000000000..0c76bd1297 Binary files /dev/null and b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/view_source.png differ diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/visibility_private.png b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/visibility_private.png new file mode 100644 index 0000000000..386dc2d879 Binary files /dev/null and b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/visibility_private.png differ diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/visibility_protected.png b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/visibility_protected.png new file mode 100644 index 0000000000..d3bd8e7fac Binary files /dev/null and b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/visibility_protected.png differ diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/visibility_public.png b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/visibility_public.png new file mode 100644 index 0000000000..4e10063739 Binary files /dev/null and b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/icons/visibility_public.png differ diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/logo.png b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/logo.png new file mode 100644 index 0000000000..3b1b8328c2 Binary files /dev/null and b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/logo.png differ diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/search.gif b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/search.gif new file mode 100644 index 0000000000..f23afdc01b Binary files /dev/null and b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/images/search.gif differ diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/index.xsl b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/index.xsl new file mode 100644 index 0000000000..5a29c85ae0 --- /dev/null +++ b/vendor/phpdocumentor/phpdocumentor/data/templates/abstract/index.xsl @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + +
+ +
diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/zend/js/jquery.splitter.js b/vendor/phpdocumentor/phpdocumentor/data/templates/zend/js/jquery.splitter.js new file mode 100644 index 0000000000..ae312d2269 --- /dev/null +++ b/vendor/phpdocumentor/phpdocumentor/data/templates/zend/js/jquery.splitter.js @@ -0,0 +1,228 @@ +/* + * jQuery.splitter.js - two-pane splitter window plugin + * + * version 1.51 (2009/01/09) + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + */ + +/** + * The splitter() plugin implements a two-pane resizable splitter window. + * The selected elements in the jQuery object are converted to a splitter; + * each selected element should have two child elements, used for the panes + * of the splitter. The plugin adds a third child element for the splitbar. + * + * For more details see: http://methvin.com/splitter/ + * + * + * @example $('#MySplitter').splitter(); + * @desc Create a vertical splitter with default settings + * + * @example $('#MySplitter').splitter({type: 'h', accessKey: 'M'}); + * @desc Create a horizontal splitter resizable via Alt+Shift+M + * + * @name splitter + * @type jQuery + * @param Object options Options for the splitter (not required) + * @cat Plugins/Splitter + * @return jQuery + * @author Dave Methvin (dave.methvin@gmail.com) + */ +; +(function($) { + + $.fn.splitter = function(args) { + args = args || {}; + return this.each(function() { + var zombie; // left-behind splitbar for outline resizes + function startSplitMouse(evt) { + if (opts.outline) + zombie = zombie || bar.clone(false).insertAfter(A); + panes.css("-webkit-user-select", "none"); // Safari selects A/B text on a move + bar.addClass(opts.activeClass); + $('
').insertAfter(bar); + A._posSplit = A[0][opts.pxSplit] - evt[opts.eventPos]; + $(document) + .bind("mousemove", doSplitMouse) + .bind("mouseup", endSplitMouse); + } + + function doSplitMouse(evt) { + var newPos = A._posSplit + evt[opts.eventPos]; + if (opts.outline) { + newPos = Math.max(0, Math.min(newPos, splitter._DA - bar._DA)); + bar.css(opts.origin, newPos); + } else + resplit(newPos); + } + + function endSplitMouse(evt) { + $('div.splitterMask').remove(); + bar.removeClass(opts.activeClass); + var newPos = A._posSplit + evt[opts.eventPos]; + if (opts.outline) { + zombie.remove(); + zombie = null; + resplit(newPos); + } + panes.css("-webkit-user-select", "text"); // let Safari select text again + $(document) + .unbind("mousemove", doSplitMouse) + .unbind("mouseup", endSplitMouse); + } + + function resplit(newPos) { + // Constrain new splitbar position to fit pane size limits + newPos = Math.max(A._min, splitter._DA - B._max, + Math.min(newPos, A._max, splitter._DA - bar._DA - B._min)); + // Resize/position the two panes + bar._DA = bar[0][opts.pxSplit]; // bar size may change during dock + bar.css(opts.origin, newPos).css(opts.fixed, splitter._DF); + A.css(opts.origin, 0).css(opts.split, newPos).css(opts.fixed, splitter._DF); + B.css(opts.origin, newPos + bar._DA) + .css(opts.split, splitter._DA - bar._DA - newPos).css(opts.fixed, splitter._DF); + // IE fires resize for us; all others pay cash + if (!$.browser.msie) + panes.trigger("resize"); + } + + function dimSum(jq, dims) { + // Opera returns -1 for missing min/max width, turn into 0 + var sum = 0; + for (var i = 1; i < arguments.length; i++) + sum += Math.max(parseInt(jq.css(arguments[i])) || 0, 0); + return sum; + } + + // Determine settings based on incoming opts, element classes, and defaults + var vh = (args.splitHorizontal ? 'h' : args.splitVertical ? 'v' : args.type) || 'v'; + var opts = $.extend({ + activeClass: 'active', // class name for active splitter + pxPerKey: 8, // splitter px moved per keypress + tabIndex: 0, // tab order indicator + accessKey: '' // accessKey for splitbar + }, { + v: { // Vertical splitters: + keyLeft: 39, keyRight: 37, cursor: "e-resize", + splitbarClass: "vsplitbar", outlineClass: "voutline", + type: 'v', eventPos: "pageX", origin: "left", + split: "width", pxSplit: "offsetWidth", side1: "Left", side2: "Right", + fixed: "height", pxFixed: "offsetHeight", side3: "Top", side4: "Bottom" + }, + h: { // Horizontal splitters: + keyTop: 40, keyBottom: 38, cursor: "n-resize", + splitbarClass: "hsplitbar", outlineClass: "houtline", + type: 'h', eventPos: "pageY", origin: "top", + split: "height", pxSplit: "offsetHeight", side1: "Top", side2: "Bottom", + fixed: "width", pxFixed: "offsetWidth", side3: "Left", side4: "Right" + } + }[vh], args); + + // Create jQuery object closures for splitter and both panes + var splitter = $(this).css({position: "relative"}); + var panes = $(">*", splitter[0]).css({ + position: "absolute", // positioned inside splitter container + "z-index": "1", // splitbar is positioned above + "-moz-outline-style": "none" // don't show dotted outline + }); + var A = $(panes[0]); // left or top + var B = $(panes[1]); // right or bottom + + // Focuser element, provides keyboard support; title is shown by Opera accessKeys + var focuser = $('') + .attr({accessKey: opts.accessKey, tabIndex: opts.tabIndex, title: opts.splitbarClass}) + .bind($.browser.opera ? "click" : "focus", function() { + this.focus(); + bar.addClass(opts.activeClass) + }) + .bind("keydown", function(e) { + var key = e.which || e.keyCode; + var dir = key == opts["key" + opts.side1] ? 1 : key == opts["key" + opts.side2] ? -1 : 0; + if (dir) + resplit(A[0][opts.pxSplit] + dir * opts.pxPerKey, false); + }) + .bind("blur", function() { + bar.removeClass(opts.activeClass) + }); + + // Splitbar element, can be already in the doc or we create one + var bar = $(panes[2] || '
') + .insertAfter(A).css("z-index", "100").append(focuser) + .attr({"class": opts.splitbarClass, unselectable: "on"}) + .css({position: "absolute", "user-select": "none", "-webkit-user-select": "none", + "-khtml-user-select": "none", "-moz-user-select": "none", "top": "0px"}) + .bind("mousedown", startSplitMouse); + // Use our cursor unless the style specifies a non-default cursor + if (/^(auto|default|)$/.test(bar.css("cursor"))) + bar.css("cursor", opts.cursor); + + // Cache several dimensions for speed, rather than re-querying constantly + bar._DA = bar[0][opts.pxSplit]; + splitter._PBF = $.boxModel ? dimSum(splitter, "border" + opts.side3 + "Width", "border" + opts.side4 + "Width") : 0; + splitter._PBA = $.boxModel ? dimSum(splitter, "border" + opts.side1 + "Width", "border" + opts.side2 + "Width") : 0; + A._pane = opts.side1; + B._pane = opts.side2; + $.each([A,B], function() { + this._min = opts["min" + this._pane] || dimSum(this, "min-" + opts.split); + this._max = opts["max" + this._pane] || dimSum(this, "max-" + opts.split) || 9999; + this._init = opts["size" + this._pane] === true ? + parseInt($.curCSS(this[0], opts.split)) : opts["size" + this._pane]; + }); + + // Determine initial position, get from cookie if specified + var initPos = A._init; + if (!isNaN(B._init)) // recalc initial B size as an offset from the top or left side + initPos = splitter[0][opts.pxSplit] - splitter._PBA - B._init - bar._DA; + if (opts.cookie) { + if (!$.cookie) + alert('jQuery.splitter(): jQuery cookie plugin required'); + var ckpos = parseInt($.cookie(opts.cookie)); + if (!isNaN(ckpos)) + initPos = ckpos; + $(window).bind("unload", function() { + var state = String(bar.css(opts.origin)); // current location of splitbar + $.cookie(opts.cookie, state, {expires: opts.cookieExpires || 365, + path: opts.cookiePath || document.location.pathname}); + }); + } + if (isNaN(initPos)) // King Solomon's algorithm + initPos = Math.round((splitter[0][opts.pxSplit] - splitter._PBA - bar._DA) / 2); + + // Resize event propagation and splitter sizing + if (opts.anchorToWindow) { + // Account for margin or border on the splitter container and enforce min height + splitter._hadjust = dimSum(splitter, "borderTopWidth", "borderBottomWidth", "marginBottom"); + splitter._hmin = Math.max(dimSum(splitter, "minHeight"), 20); + $(window).bind("resize", + function() { + var top = splitter.offset().top; + var wh = $(window).height(); + splitter.css("height", Math.max(wh - top - splitter._hadjust, splitter._hmin) + "px"); + if (!$.browser.msie) splitter.trigger("resize"); + }).trigger("resize"); + } + else if (opts.resizeToWidth && !$.browser.msie) + $(window).bind("resize", function() { + splitter.trigger("resize"); + }); + + // Resize event handler; triggered immediately to set initial position + splitter.bind("resize", + function(e, size) { + // Custom events bubble in jQuery 1.3; don't Yo Dawg + if (e.target != this) return; + // Determine new width/height of splitter container + splitter._DF = splitter[0][opts.pxFixed] - splitter._PBF; + splitter._DA = splitter[0][opts.pxSplit] - splitter._PBA; + // Bail if splitter isn't visible or content isn't there yet + if (splitter._DF <= 0 || splitter._DA <= 0) return; + // Re-divvy the adjustable dimension; maintain size of the preferred pane + resplit(!isNaN(size) ? size : (!(opts.sizeRight || opts.sizeBottom) ? A[0][opts.pxSplit] : + splitter._DA - B[0][opts.pxSplit] - bar._DA)); + }).trigger("resize", [initPos]); + }); + }; + +})(jQuery); \ No newline at end of file diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/zend/js/template.js b/vendor/phpdocumentor/phpdocumentor/data/templates/zend/js/template.js new file mode 100644 index 0000000000..2cc989f7f3 --- /dev/null +++ b/vendor/phpdocumentor/phpdocumentor/data/templates/zend/js/template.js @@ -0,0 +1,32 @@ +function filterElements() { + inherited = !$('#show-inherited').hasClass('deselected'); + public = !$('#show-public').hasClass('deselected'); + protected = !$('#show-protected').hasClass('deselected'); + private = !$('#show-private').hasClass('deselected'); + + $('div.public').each(function(index, val) { + $(val).toggle(public && !($(val).hasClass('inherited_from') && !inherited)); + }); + $('div.protected').each(function(index, val) { + $(val).toggle(protected && !($(val).hasClass('inherited_from') && !inherited)); + }); + $('div.private').each(function(index, val) { + $(val).toggle(private && !($(val).hasClass('inherited_from') && !inherited)); + }); +} + +$(document).ready(function() { + $('#show-public, #show-protected, #show-private, #show-inherited') + .css('cursor', 'pointer') + .click(function() { + $(this).toggleClass('deselected'); + if ($(this).hasClass('deselected')) { + $(this).fadeTo('fast', '0.4'); + } else { + $(this).fadeTo('fast', '1.0'); + } + filterElements(); + return false; + }); + $('#show-protected, #show-private').click(); +}); \ No newline at end of file diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/zend/page_header.xsl b/vendor/phpdocumentor/phpdocumentor/data/templates/zend/page_header.xsl new file mode 100644 index 0000000000..1603c5a4fa --- /dev/null +++ b/vendor/phpdocumentor/phpdocumentor/data/templates/zend/page_header.xsl @@ -0,0 +1,15 @@ + +]> + + + +
+
+

API Documentation

+
+ +
+
+ + + \ No newline at end of file diff --git a/vendor/phpdocumentor/phpdocumentor/data/templates/zend/template.xml b/vendor/phpdocumentor/phpdocumentor/data/templates/zend/template.xml new file mode 100644 index 0000000000..a64f3a1a18 --- /dev/null +++ b/vendor/phpdocumentor/phpdocumentor/data/templates/zend/template.xml @@ -0,0 +1,43 @@ + +